@@ -1626,4 +1626,65 @@ normal:
1626
1626
ret void
1627
1627
}
1628
1628
1629
+ ; Test case from PR47670. Reduction result is used as incoming value in phi.
1630
+ define i32 @reduction_result_used_in_phi (i32* nocapture readonly %data , i1 zeroext %b ) {
1631
+ ; CHECK-LABEL: @reduction_result_used_in_phi(
1632
+ ; CHECK-NEXT: entry:
1633
+ ; CHECK-NEXT: br i1 [[B:%.*]], label [[BB:%.*]], label [[EXIT:%.*]]
1634
+ ; CHECK: bb:
1635
+ ; CHECK-NEXT: [[L_0:%.*]] = load i32, i32* [[DATA:%.*]], align 4
1636
+ ; CHECK-NEXT: [[IDX_1:%.*]] = getelementptr inbounds i32, i32* [[DATA]], i64 1
1637
+ ; CHECK-NEXT: [[L_1:%.*]] = load i32, i32* [[IDX_1]], align 4
1638
+ ; CHECK-NEXT: [[ADD_1:%.*]] = add i32 [[L_1]], [[L_0]]
1639
+ ; CHECK-NEXT: [[IDX_2:%.*]] = getelementptr inbounds i32, i32* [[DATA]], i64 2
1640
+ ; CHECK-NEXT: [[L_2:%.*]] = load i32, i32* [[IDX_2]], align 4
1641
+ ; CHECK-NEXT: [[ADD_2:%.*]] = add i32 [[L_2]], [[ADD_1]]
1642
+ ; CHECK-NEXT: [[IDX_3:%.*]] = getelementptr inbounds i32, i32* [[DATA]], i64 3
1643
+ ; CHECK-NEXT: [[L_3:%.*]] = load i32, i32* [[IDX_3]], align 4
1644
+ ; CHECK-NEXT: [[ADD_3:%.*]] = add i32 [[L_3]], [[ADD_2]]
1645
+ ; CHECK-NEXT: br label [[EXIT]]
1646
+ ; CHECK: exit:
1647
+ ; CHECK-NEXT: [[SUM_1:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[ADD_3]], [[BB]] ]
1648
+ ; CHECK-NEXT: ret i32 [[SUM_1]]
1649
+ ;
1650
+ ; STORE-LABEL: @reduction_result_used_in_phi(
1651
+ ; STORE-NEXT: entry:
1652
+ ; STORE-NEXT: br i1 [[B:%.*]], label [[BB:%.*]], label [[EXIT:%.*]]
1653
+ ; STORE: bb:
1654
+ ; STORE-NEXT: [[L_0:%.*]] = load i32, i32* [[DATA:%.*]], align 4
1655
+ ; STORE-NEXT: [[IDX_1:%.*]] = getelementptr inbounds i32, i32* [[DATA]], i64 1
1656
+ ; STORE-NEXT: [[L_1:%.*]] = load i32, i32* [[IDX_1]], align 4
1657
+ ; STORE-NEXT: [[ADD_1:%.*]] = add i32 [[L_1]], [[L_0]]
1658
+ ; STORE-NEXT: [[IDX_2:%.*]] = getelementptr inbounds i32, i32* [[DATA]], i64 2
1659
+ ; STORE-NEXT: [[L_2:%.*]] = load i32, i32* [[IDX_2]], align 4
1660
+ ; STORE-NEXT: [[ADD_2:%.*]] = add i32 [[L_2]], [[ADD_1]]
1661
+ ; STORE-NEXT: [[IDX_3:%.*]] = getelementptr inbounds i32, i32* [[DATA]], i64 3
1662
+ ; STORE-NEXT: [[L_3:%.*]] = load i32, i32* [[IDX_3]], align 4
1663
+ ; STORE-NEXT: [[ADD_3:%.*]] = add i32 [[L_3]], [[ADD_2]]
1664
+ ; STORE-NEXT: br label [[EXIT]]
1665
+ ; STORE: exit:
1666
+ ; STORE-NEXT: [[SUM_1:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[ADD_3]], [[BB]] ]
1667
+ ; STORE-NEXT: ret i32 [[SUM_1]]
1668
+ ;
1669
+ entry:
1670
+ br i1 %b , label %bb , label %exit
1671
+
1672
+ bb:
1673
+ %l.0 = load i32 , i32* %data , align 4
1674
+ %idx.1 = getelementptr inbounds i32 , i32* %data , i64 1
1675
+ %l.1 = load i32 , i32* %idx.1 , align 4
1676
+ %add.1 = add i32 %l.1 , %l.0
1677
+ %idx.2 = getelementptr inbounds i32 , i32* %data , i64 2
1678
+ %l.2 = load i32 , i32* %idx.2 , align 4
1679
+ %add.2 = add i32 %l.2 , %add.1
1680
+ %idx.3 = getelementptr inbounds i32 , i32* %data , i64 3
1681
+ %l.3 = load i32 , i32* %idx.3 , align 4
1682
+ %add.3 = add i32 %l.3 , %add.2
1683
+ br label %exit
1684
+
1685
+ exit:
1686
+ %sum.1 = phi i32 [ 0 , %entry ], [ %add.3 , %bb ]
1687
+ ret i32 %sum.1
1688
+ }
1689
+
1629
1690
declare i32 @__gxx_personality_v0 (...)
0 commit comments