Skip to content

Commit bb448a2

Browse files
committed
[SLP] Add test where reduction result is used in PHI.
Test case for PR47670.
1 parent 53fb9d0 commit bb448a2

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

llvm/test/Transforms/SLPVectorizer/X86/horizontal.ll

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,4 +1626,65 @@ normal:
16261626
ret void
16271627
}
16281628

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+
16291690
declare i32 @__gxx_personality_v0(...)

0 commit comments

Comments
 (0)