Skip to content

Commit 73a10b4

Browse files
committed
[VPlan] Fix PredPHI test to crash, fix crash
1 parent 6718349 commit 73a10b4

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

llvm/lib/Transforms/Vectorize/VPlan.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,13 @@ Value *VPTransformState::get(const VPValue *Def, bool NeedsScalar) {
317317
LastLane = 0;
318318
}
319319

320-
auto *LastInst = cast<Instruction>(get(Def, LastLane));
320+
auto *LastInst = dyn_cast<Instruction>(get(Def, LastLane));
321+
if (!LastInst) {
322+
Value *VectorValue = GetBroadcastInstrs(ScalarValue);
323+
set(Def, VectorValue);
324+
return VectorValue;
325+
}
326+
321327
// Set the insert point after the last scalarized instruction or after the
322328
// last PHI, if LastInst is a PHI. This ensures the insertelement sequence
323329
// will directly follow the scalar definitions.

llvm/test/Transforms/LoopVectorize/X86/drop-poison-generating-flags.ll

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -744,40 +744,39 @@ define void @recipe_without_underlying_instr_lanes_used(i64 %n, ptr noalias %dst
744744
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i64> [[BROADCAST_SPLATINSERT]], <4 x i64> poison, <4 x i32> zeroinitializer
745745
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
746746
; CHECK: [[VECTOR_BODY]]:
747-
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE6:.*]] ]
748-
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE6]] ]
747+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_SREM_CONTINUE6:.*]] ]
748+
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_SREM_CONTINUE6]] ]
749749
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq <4 x i64> [[VEC_IND]], [[BROADCAST_SPLAT]]
750750
; CHECK-NEXT: [[TMP1:%.*]] = xor <4 x i1> [[TMP0]], splat (i1 true)
751751
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i1> [[TMP1]], i32 0
752-
; CHECK-NEXT: br i1 [[TMP2]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
753-
; CHECK: [[PRED_STORE_IF]]:
754-
; CHECK-NEXT: store i64 poison, ptr [[AUX]], align 8
755-
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
756-
; CHECK: [[PRED_STORE_CONTINUE]]:
752+
; CHECK-NEXT: br i1 [[TMP2]], label %[[PRED_SREM_IF:.*]], label %[[PRED_SREM_CONTINUE:.*]]
753+
; CHECK: [[PRED_SREM_IF]]:
754+
; CHECK-NEXT: br label %[[PRED_SREM_CONTINUE]]
755+
; CHECK: [[PRED_SREM_CONTINUE]]:
757756
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i1> [[TMP1]], i32 1
758-
; CHECK-NEXT: br i1 [[TMP3]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2:.*]]
759-
; CHECK: [[PRED_STORE_IF1]]:
760-
; CHECK-NEXT: store i64 poison, ptr [[AUX]], align 8
761-
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE2]]
762-
; CHECK: [[PRED_STORE_CONTINUE2]]:
757+
; CHECK-NEXT: br i1 [[TMP3]], label %[[PRED_SREM_IF1:.*]], label %[[PRED_SREM_CONTINUE2:.*]]
758+
; CHECK: [[PRED_SREM_IF1]]:
759+
; CHECK-NEXT: br label %[[PRED_SREM_CONTINUE2]]
760+
; CHECK: [[PRED_SREM_CONTINUE2]]:
763761
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x i1> [[TMP1]], i32 2
764-
; CHECK-NEXT: br i1 [[TMP4]], label %[[PRED_STORE_IF3:.*]], label %[[PRED_STORE_CONTINUE4:.*]]
765-
; CHECK: [[PRED_STORE_IF3]]:
766-
; CHECK-NEXT: store i64 poison, ptr [[AUX]], align 8
767-
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE4]]
768-
; CHECK: [[PRED_STORE_CONTINUE4]]:
762+
; CHECK-NEXT: br i1 [[TMP4]], label %[[PRED_SREM_IF3:.*]], label %[[PRED_SREM_CONTINUE4:.*]]
763+
; CHECK: [[PRED_SREM_IF3]]:
764+
; CHECK-NEXT: br label %[[PRED_SREM_CONTINUE4]]
765+
; CHECK: [[PRED_SREM_CONTINUE4]]:
769766
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i1> [[TMP1]], i32 3
770-
; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_STORE_IF5:.*]], label %[[PRED_STORE_CONTINUE6]]
771-
; CHECK: [[PRED_STORE_IF5]]:
772-
; CHECK-NEXT: store i64 poison, ptr [[AUX]], align 8
773-
; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE6]]
774-
; CHECK: [[PRED_STORE_CONTINUE6]]:
767+
; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_SREM_IF5:.*]], label %[[PRED_SREM_CONTINUE6]]
768+
; CHECK: [[PRED_SREM_IF5]]:
769+
; CHECK-NEXT: br label %[[PRED_SREM_CONTINUE6]]
770+
; CHECK: [[PRED_SREM_CONTINUE6]]:
775771
; CHECK-NEXT: [[TMP6:%.*]] = add i64 poison, -3
776772
; CHECK-NEXT: [[TMP7:%.*]] = add i64 [[INDEX]], [[TMP6]]
777773
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr [5 x i8], ptr @c, i64 0, i64 [[TMP7]]
778774
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP8]], i32 0
779775
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP9]], align 1
780776
; CHECK-NEXT: [[PREDPHI:%.*]] = select <4 x i1> [[TMP0]], <4 x i8> zeroinitializer, <4 x i8> [[WIDE_LOAD]]
777+
; CHECK-NEXT: [[PREDPHI7:%.*]] = select <4 x i1> [[TMP0]], <4 x i64> zeroinitializer, <4 x i64> poison
778+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i64> [[PREDPHI7]], i32 3
779+
; CHECK-NEXT: store i64 [[TMP12]], ptr [[AUX]], align 8
781780
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[DST]], i64 [[INDEX]]
782781
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP10]], i32 0
783782
; CHECK-NEXT: store <4 x i8> [[PREDPHI]], ptr [[TMP11]], align 4
@@ -797,7 +796,6 @@ loop.header:
797796

798797
then:
799798
%rem = srem i64 3, 0
800-
store i64 %rem, ptr %aux
801799
%add3 = add i64 %rem, -3
802800
%add5 = add i64 %iv, %add3
803801
%gep = getelementptr [5 x i8], ptr @c, i64 0, i64 %add5
@@ -806,6 +804,8 @@ then:
806804

807805
loop.latch:
808806
%sr = phi i8 [ 0, %loop.header ], [ %l , %then ]
807+
%p = phi i64 [ 0, %loop.header ], [ %rem, %then ]
808+
store i64 %p, ptr %aux
809809
%gep.dst = getelementptr i8, ptr %dst, i64 %iv
810810
store i8 %sr, ptr %gep.dst, align 4
811811
%inc = add i64 %iv, 1

0 commit comments

Comments
 (0)