Skip to content

Commit b8c4eea

Browse files
authored
[VPlan] Simplify PredPHI LiveIn -> LiveIn (llvm#142271)
5f39be5 ([VPlan] Use InstSimplifyFolder instead of TargetFolder) updated simplifyRecipe to fold live-ins to Values that are not necessarily Constant, but forgot to update the corresponding PredPHI folder, which still folds PredPHI constant -> constant. Update it to fold PredPHI LiveIn -> LiveIn. Fixes llvm#141968.
1 parent 389e9d3 commit b8c4eea

File tree

2 files changed

+153
-5
lines changed

2 files changed

+153
-5
lines changed

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,13 +1015,11 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
10151015
.Default([](auto *) { return false; }))
10161016
return;
10171017

1018-
// Fold PredPHI constant -> constant.
1018+
// Fold PredPHI LiveIn -> LiveIn.
10191019
if (auto *PredPHI = dyn_cast<VPPredInstPHIRecipe>(&R)) {
10201020
VPValue *Op = PredPHI->getOperand(0);
1021-
if (!Op->isLiveIn() || !Op->getLiveInIRValue())
1022-
return;
1023-
if (auto *C = dyn_cast<Constant>(Op->getLiveInIRValue()))
1024-
PredPHI->replaceAllUsesWith(Plan->getOrAddLiveIn(C));
1021+
if (Op->isLiveIn())
1022+
PredPHI->replaceAllUsesWith(Op);
10251023
}
10261024

10271025
VPValue *A;
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 5
2+
; RUN: opt -passes=loop-vectorize -S %s | FileCheck %s
3+
4+
target triple = "x86_64"
5+
6+
define i8 @pr141968(i1 %cond, i8 %v) {
7+
; CHECK-LABEL: define i8 @pr141968(
8+
; CHECK-SAME: i1 [[COND:%.*]], i8 [[V:%.*]]) {
9+
; CHECK-NEXT: [[ENTRY:.*]]:
10+
; CHECK-NEXT: [[ZEXT_TRUE:%.*]] = zext i1 true to i16
11+
; CHECK-NEXT: [[SEXT:%.*]] = sext i8 [[V]] to i16
12+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
13+
; CHECK: [[VECTOR_PH]]:
14+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <16 x i1> poison, i1 [[COND]], i64 0
15+
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <16 x i1> [[BROADCAST_SPLATINSERT]], <16 x i1> poison, <16 x i32> zeroinitializer
16+
; CHECK-NEXT: [[TMP0:%.*]] = xor <16 x i1> [[BROADCAST_SPLAT]], splat (i1 true)
17+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
18+
; CHECK: [[VECTOR_BODY]]:
19+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_SDIV_CONTINUE30:.*]] ]
20+
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <16 x i1> [[TMP0]], i32 0
21+
; CHECK-NEXT: br i1 [[TMP1]], label %[[PRED_SDIV_IF:.*]], label %[[PRED_SDIV_CONTINUE:.*]]
22+
; CHECK: [[PRED_SDIV_IF]]:
23+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE]]
24+
; CHECK: [[PRED_SDIV_CONTINUE]]:
25+
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <16 x i1> [[TMP0]], i32 1
26+
; CHECK-NEXT: br i1 [[TMP2]], label %[[PRED_SDIV_IF1:.*]], label %[[PRED_SDIV_CONTINUE2:.*]]
27+
; CHECK: [[PRED_SDIV_IF1]]:
28+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE2]]
29+
; CHECK: [[PRED_SDIV_CONTINUE2]]:
30+
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <16 x i1> [[TMP0]], i32 2
31+
; CHECK-NEXT: br i1 [[TMP3]], label %[[PRED_SDIV_IF3:.*]], label %[[PRED_SDIV_CONTINUE4:.*]]
32+
; CHECK: [[PRED_SDIV_IF3]]:
33+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE4]]
34+
; CHECK: [[PRED_SDIV_CONTINUE4]]:
35+
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <16 x i1> [[TMP0]], i32 3
36+
; CHECK-NEXT: br i1 [[TMP4]], label %[[PRED_SDIV_IF5:.*]], label %[[PRED_SDIV_CONTINUE6:.*]]
37+
; CHECK: [[PRED_SDIV_IF5]]:
38+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE6]]
39+
; CHECK: [[PRED_SDIV_CONTINUE6]]:
40+
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <16 x i1> [[TMP0]], i32 4
41+
; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_SDIV_IF7:.*]], label %[[PRED_SDIV_CONTINUE8:.*]]
42+
; CHECK: [[PRED_SDIV_IF7]]:
43+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE8]]
44+
; CHECK: [[PRED_SDIV_CONTINUE8]]:
45+
; CHECK-NEXT: [[TMP6:%.*]] = extractelement <16 x i1> [[TMP0]], i32 5
46+
; CHECK-NEXT: br i1 [[TMP6]], label %[[PRED_SDIV_IF9:.*]], label %[[PRED_SDIV_CONTINUE10:.*]]
47+
; CHECK: [[PRED_SDIV_IF9]]:
48+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE10]]
49+
; CHECK: [[PRED_SDIV_CONTINUE10]]:
50+
; CHECK-NEXT: [[TMP7:%.*]] = extractelement <16 x i1> [[TMP0]], i32 6
51+
; CHECK-NEXT: br i1 [[TMP7]], label %[[PRED_SDIV_IF11:.*]], label %[[PRED_SDIV_CONTINUE12:.*]]
52+
; CHECK: [[PRED_SDIV_IF11]]:
53+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE12]]
54+
; CHECK: [[PRED_SDIV_CONTINUE12]]:
55+
; CHECK-NEXT: [[TMP8:%.*]] = extractelement <16 x i1> [[TMP0]], i32 7
56+
; CHECK-NEXT: br i1 [[TMP8]], label %[[PRED_SDIV_IF13:.*]], label %[[PRED_SDIV_CONTINUE14:.*]]
57+
; CHECK: [[PRED_SDIV_IF13]]:
58+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE14]]
59+
; CHECK: [[PRED_SDIV_CONTINUE14]]:
60+
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <16 x i1> [[TMP0]], i32 8
61+
; CHECK-NEXT: br i1 [[TMP9]], label %[[PRED_SDIV_IF15:.*]], label %[[PRED_SDIV_CONTINUE16:.*]]
62+
; CHECK: [[PRED_SDIV_IF15]]:
63+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE16]]
64+
; CHECK: [[PRED_SDIV_CONTINUE16]]:
65+
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <16 x i1> [[TMP0]], i32 9
66+
; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_SDIV_IF17:.*]], label %[[PRED_SDIV_CONTINUE18:.*]]
67+
; CHECK: [[PRED_SDIV_IF17]]:
68+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE18]]
69+
; CHECK: [[PRED_SDIV_CONTINUE18]]:
70+
; CHECK-NEXT: [[TMP11:%.*]] = extractelement <16 x i1> [[TMP0]], i32 10
71+
; CHECK-NEXT: br i1 [[TMP11]], label %[[PRED_SDIV_IF19:.*]], label %[[PRED_SDIV_CONTINUE20:.*]]
72+
; CHECK: [[PRED_SDIV_IF19]]:
73+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE20]]
74+
; CHECK: [[PRED_SDIV_CONTINUE20]]:
75+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <16 x i1> [[TMP0]], i32 11
76+
; CHECK-NEXT: br i1 [[TMP12]], label %[[PRED_SDIV_IF21:.*]], label %[[PRED_SDIV_CONTINUE22:.*]]
77+
; CHECK: [[PRED_SDIV_IF21]]:
78+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE22]]
79+
; CHECK: [[PRED_SDIV_CONTINUE22]]:
80+
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <16 x i1> [[TMP0]], i32 12
81+
; CHECK-NEXT: br i1 [[TMP13]], label %[[PRED_SDIV_IF23:.*]], label %[[PRED_SDIV_CONTINUE24:.*]]
82+
; CHECK: [[PRED_SDIV_IF23]]:
83+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE24]]
84+
; CHECK: [[PRED_SDIV_CONTINUE24]]:
85+
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <16 x i1> [[TMP0]], i32 13
86+
; CHECK-NEXT: br i1 [[TMP14]], label %[[PRED_SDIV_IF25:.*]], label %[[PRED_SDIV_CONTINUE26:.*]]
87+
; CHECK: [[PRED_SDIV_IF25]]:
88+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE26]]
89+
; CHECK: [[PRED_SDIV_CONTINUE26]]:
90+
; CHECK-NEXT: [[TMP15:%.*]] = extractelement <16 x i1> [[TMP0]], i32 14
91+
; CHECK-NEXT: br i1 [[TMP15]], label %[[PRED_SDIV_IF27:.*]], label %[[PRED_SDIV_CONTINUE28:.*]]
92+
; CHECK: [[PRED_SDIV_IF27]]:
93+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE28]]
94+
; CHECK: [[PRED_SDIV_CONTINUE28]]:
95+
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <16 x i1> [[TMP0]], i32 15
96+
; CHECK-NEXT: br i1 [[TMP16]], label %[[PRED_SDIV_IF29:.*]], label %[[PRED_SDIV_CONTINUE30]]
97+
; CHECK: [[PRED_SDIV_IF29]]:
98+
; CHECK-NEXT: br label %[[PRED_SDIV_CONTINUE30]]
99+
; CHECK: [[PRED_SDIV_CONTINUE30]]:
100+
; CHECK-NEXT: [[BROADCAST_SPLATINSERT31:%.*]] = insertelement <16 x i8> poison, i8 [[V]], i64 0
101+
; CHECK-NEXT: [[BROADCAST_SPLAT32:%.*]] = shufflevector <16 x i8> [[BROADCAST_SPLATINSERT31]], <16 x i8> poison, <16 x i32> zeroinitializer
102+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <16 x i1> [[BROADCAST_SPLAT]], <16 x i8> zeroinitializer, <16 x i8> [[BROADCAST_SPLAT32]]
103+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 16
104+
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i32 [[INDEX_NEXT]], 256
105+
; CHECK-NEXT: br i1 [[TMP17]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
106+
; CHECK: [[MIDDLE_BLOCK]]:
107+
; CHECK-NEXT: [[TMP18:%.*]] = extractelement <16 x i8> [[PREDPHI]], i32 15
108+
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
109+
; CHECK: [[SCALAR_PH]]:
110+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8 [ 0, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
111+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
112+
; CHECK: [[LOOP_HEADER]]:
113+
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]
114+
; CHECK-NEXT: br i1 [[COND]], label %[[LOOP_LATCH]], label %[[COND_FALSE:.*]]
115+
; CHECK: [[COND_FALSE]]:
116+
; CHECK-NEXT: [[SDIV:%.*]] = sdiv i16 [[SEXT]], [[ZEXT_TRUE]]
117+
; CHECK-NEXT: [[SDIV_TRUNC:%.*]] = trunc i16 [[SDIV]] to i8
118+
; CHECK-NEXT: br label %[[LOOP_LATCH]]
119+
; CHECK: [[LOOP_LATCH]]:
120+
; CHECK-NEXT: [[RET:%.*]] = phi i8 [ [[SDIV_TRUNC]], %[[COND_FALSE]] ], [ 0, %[[LOOP_HEADER]] ]
121+
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
122+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i8 [[IV_NEXT]], 0
123+
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP3:![0-9]+]]
124+
; CHECK: [[EXIT]]:
125+
; CHECK-NEXT: [[RET_LCSSA:%.*]] = phi i8 [ [[RET]], %[[LOOP_LATCH]] ], [ [[TMP18]], %[[MIDDLE_BLOCK]] ]
126+
; CHECK-NEXT: ret i8 [[RET_LCSSA]]
127+
;
128+
entry:
129+
%zext.true = zext i1 true to i16
130+
%sext = sext i8 %v to i16
131+
br label %loop.header
132+
133+
loop.header: ; preds = %loop.latch, %entry
134+
%iv = phi i8 [ %iv.next, %loop.latch ], [ 0, %entry ]
135+
br i1 %cond, label %loop.latch, label %cond.false
136+
137+
cond.false: ; preds = %loop.header
138+
%sdiv = sdiv i16 %sext, %zext.true
139+
%sdiv.trunc = trunc i16 %sdiv to i8
140+
br label %loop.latch
141+
142+
loop.latch: ; preds = %cond.false, %loop.header
143+
%ret = phi i8 [ %sdiv.trunc, %cond.false ], [ 0, %loop.header ]
144+
%iv.next = add i8 %iv, 1
145+
%exitcond = icmp eq i8 %iv.next, 0
146+
br i1 %exitcond, label %exit, label %loop.header
147+
148+
exit: ; preds = %loop.latch
149+
ret i8 %ret
150+
}

0 commit comments

Comments
 (0)