-
Notifications
You must be signed in to change notification settings - Fork 14.8k
[VPlan] Update scalar induction resume values in VPlan. #110577
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 20 commits
33b3aac
8040cdb
c98b6d3
a14749c
d3728f4
ad1f578
a11bca4
56e82ef
e8d78a9
c7a5b03
5d2eb8b
9393eda
c54e8f2
d8717f9
3e5dbff
a02b278
674d15b
6998270
55cd843
e292a3d
93f3304
ce214f5
b37e297
a1d2a13
61e6d95
e96323f
c964dad
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -64,6 +64,7 @@ bool VPRecipeBase::mayWriteToMemory() const { | |
case VPInstruction::FirstOrderRecurrenceSplice: | ||
case VPInstruction::LogicalAnd: | ||
case VPInstruction::PtrAdd: | ||
case VPInstruction::ResumePhi: | ||
return false; | ||
default: | ||
return true; | ||
|
@@ -629,7 +630,10 @@ Value *VPInstruction::generate(VPTransformState &State) { | |
State.CFG | ||
.VPBB2IRBB[cast<VPBasicBlock>(getParent()->getSinglePredecessor())]; | ||
NewPhi->addIncoming(IncomingFromVPlanPred, VPlanPred); | ||
for (auto *OtherPred : predecessors(Builder.GetInsertBlock())) { | ||
// TODO: Predecessors are temporarily reversed to reduce test changes. | ||
// Remove it and update remaining tests after functional change landed. | ||
for (auto *OtherPred : | ||
reverse(to_vector(predecessors(Builder.GetInsertBlock())))) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Better reverse the predecessors when they are set, rather than here during VPlan::execute()? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is just to keep the number of test changes lower by trying to better match the order in the phis and should be dropped after landing this change as follow up. Added a TODO |
||
assert(OtherPred != VPlanPred && | ||
"VPlan predecessors should not be connected yet"); | ||
NewPhi->addIncoming(IncomingFromOtherPreds, OtherPred); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,14 +11,15 @@ define void @test_widen_ptr_induction(ptr %ptr.start.1) { | |
; CHECK: vector.main.loop.iter.check: | ||
; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]] | ||
; CHECK: vector.ph: | ||
; CHECK-NEXT: [[IND_END1:%.*]] = getelementptr i8, ptr [[PTR_START_1:%.*]], i64 10000 | ||
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] | ||
; CHECK: vector.body: | ||
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] | ||
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 | ||
; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 1 | ||
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[INDEX]], 2 | ||
; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 3 | ||
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[PTR_START_1:%.*]], i64 [[TMP0]] | ||
; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[PTR_START_1]], i64 [[TMP0]] | ||
; CHECK-NEXT: [[NEXT_GEP1:%.*]] = getelementptr i8, ptr [[PTR_START_1]], i64 [[TMP1]] | ||
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x ptr> poison, ptr [[NEXT_GEP]], i32 0 | ||
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x ptr> [[TMP4]], ptr [[NEXT_GEP1]], i32 1 | ||
|
@@ -50,6 +51,7 @@ define void @test_widen_ptr_induction(ptr %ptr.start.1) { | |
; CHECK-NEXT: br i1 true, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]] | ||
; CHECK: vec.epilog.ph: | ||
; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ 10000, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ] | ||
; CHECK-NEXT: [[BC_RESUME_VAL4:%.*]] = phi ptr [ [[IND_END1]], [[VEC_EPILOG_ITER_CHECK]] ], [ [[PTR_START_1]], [[VECTOR_MAIN_LOOP_ITER_CHECK]] ] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This appears unused, subject to dce. Is it possibly to avoid introducing such redundant phi's, and transitively IND_END1 which feeds them (only), to reduce test differences? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated to only generate resume values if there are any wide inductions in the epilogue plan (required adding it to EPI). Some more changes should be gone |
||
; CHECK-NEXT: [[IND_END:%.*]] = getelementptr i8, ptr [[PTR_START_1]], i64 10000 | ||
; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]] | ||
; CHECK: vec.epilog.vector.body: | ||
|
@@ -143,11 +145,10 @@ define void @test_widen_induction(ptr %A, i64 %N) { | |
; CHECK-NEXT: [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ult i64 [[N_VEC_REMAINING]], 2 | ||
; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]] | ||
; CHECK: vec.epilog.ph: | ||
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ] | ||
; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ] | ||
; CHECK-NEXT: [[N_MOD_VF2:%.*]] = urem i64 [[N]], 2 | ||
; CHECK-NEXT: [[N_VEC3:%.*]] = sub i64 [[N]], [[N_MOD_VF2]] | ||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[BC_RESUME_VAL]], i64 0 | ||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[VEC_EPILOG_RESUME_VAL]], i64 0 | ||
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x i64> [[DOTSPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer | ||
; CHECK-NEXT: [[INDUCTION:%.*]] = add <2 x i64> [[DOTSPLAT]], <i64 0, i64 1> | ||
; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]] | ||
|
@@ -205,10 +206,10 @@ define void @test_widen_induction_variable_start(ptr %A, i64 %N, i64 %start) { | |
; CHECK: vector.ph: | ||
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP0]], 4 | ||
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]] | ||
; CHECK-NEXT: [[IND_END:%.*]] = add i64 [[START]], [[N_VEC]] | ||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[START]], i64 0 | ||
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x i64> [[DOTSPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer | ||
; CHECK-NEXT: [[INDUCTION:%.*]] = add <2 x i64> [[DOTSPLAT]], <i64 0, i64 1> | ||
; CHECK-NEXT: [[IND_END:%.*]] = add i64 [[START]], [[N_VEC]] | ||
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] | ||
; CHECK: vector.body: | ||
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] | ||
|
@@ -322,11 +323,11 @@ define void @test_widen_induction_step_2(ptr %A, i64 %N, i32 %step) { | |
; CHECK-NEXT: [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ult i64 [[N_VEC_REMAINING]], 2 | ||
; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]] | ||
; CHECK: vec.epilog.ph: | ||
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END4]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ] | ||
; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ [[IND_END4]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ] | ||
; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL1:%.*]] = phi i64 [ [[IND_END4]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ] | ||
; CHECK-NEXT: [[N_MOD_VF2:%.*]] = urem i64 [[N]], 2 | ||
; CHECK-NEXT: [[IND_END:%.*]] = sub i64 [[N]], [[N_MOD_VF2]] | ||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[BC_RESUME_VAL]], i64 0 | ||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[VEC_EPILOG_RESUME_VAL1]], i64 0 | ||
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x i64> [[DOTSPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer | ||
; CHECK-NEXT: [[INDUCTION:%.*]] = add <2 x i64> [[DOTSPLAT]], <i64 0, i64 1> | ||
; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]] | ||
|
@@ -433,7 +434,7 @@ define void @test_widen_extended_induction(ptr %dst) { | |
; CHECK: vec.epilog.middle.block: | ||
; CHECK-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]] | ||
; CHECK: vec.epilog.scalar.ph: | ||
; CHECK-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i8 [ 16, [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 16, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[ITER_CHECK:%.*]] ] | ||
; CHECK-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i8 [ 16, [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ 16, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[ITER_CHECK:%.*]] ], [ 0, [[VECTOR_SCEVCHECK]] ] | ||
; CHECK-NEXT: br label [[LOOP:%.*]] | ||
; CHECK: loop: | ||
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[BC_RESUME_VAL1]], [[VEC_EPILOG_SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] | ||
|
@@ -491,9 +492,8 @@ define void @test_widen_truncated_induction(ptr %A) { | |
; CHECK: vec.epilog.iter.check: | ||
; CHECK-NEXT: br i1 true, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]] | ||
; CHECK: vec.epilog.ph: | ||
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 10000, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ] | ||
; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ 10000, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ] | ||
; CHECK-NEXT: [[TMP5:%.*]] = trunc i64 [[BC_RESUME_VAL]] to i8 | ||
; CHECK-NEXT: [[TMP5:%.*]] = trunc i64 [[VEC_EPILOG_RESUME_VAL]] to i8 | ||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i8> poison, i8 [[TMP5]], i64 0 | ||
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x i8> [[DOTSPLATINSERT]], <2 x i8> poison, <2 x i32> zeroinitializer | ||
; CHECK-NEXT: [[INDUCTION:%.*]] = add <2 x i8> [[DOTSPLAT]], <i8 0, i8 1> | ||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -67,8 +67,8 @@ define void @iv_casts(ptr %dst, ptr %src, i32 %x, i64 %N) #0 { | |||||
; DEFAULT-NEXT: [[TMP44:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] | ||||||
; DEFAULT-NEXT: br i1 [[TMP44]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] | ||||||
; DEFAULT: middle.block: | ||||||
; DEFAULT-NEXT: [[CMP_N7:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]] | ||||||
; DEFAULT-NEXT: br i1 [[CMP_N7]], label [[EXIT:%.*]], label [[VEC_EPILOG_SCALAR_PH]] | ||||||
; DEFAULT-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]] | ||||||
; DEFAULT-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[VEC_EPILOG_SCALAR_PH]] | ||||||
; DEFAULT: scalar.ph: | ||||||
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ] | ||||||
; DEFAULT-NEXT: br label [[LOOP:%.*]] | ||||||
|
@@ -478,31 +478,31 @@ define void @trunc_ivs_and_store(i32 %x, ptr %dst, i64 %N) #0 { | |||||
; PRED: pred.store.continue: | ||||||
; PRED-NEXT: [[TMP23:%.*]] = extractelement <4 x i1> [[ACTIVE_LANE_MASK]], i32 1 | ||||||
; PRED-NEXT: br i1 [[TMP23]], label [[PRED_STORE_IF3:%.*]], label [[PRED_STORE_CONTINUE4:%.*]] | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
for the sake of consistency, here and elsewhere, otherwise the result appears confusing. Better also change the labels to use the defined There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a consequence of using the auto-generated scripts, they for some reason never use patterns to match block names :( There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Understood, but this patch updates a lot of tests and obfuscates many - causing their destinations to no longer match their labels (albeit not checking their connectivity in any case). How/can this confusing state be fixed, even as a separate follow-up or preparation? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed by re-generating the checks for the impacted functions from scratch, block pattern names should now match. |
||||||
; PRED: pred.store.if3: | ||||||
; PRED: pred.store.if2: | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is there a way to remove or reduce the amount of such irrelevant naming changes? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Trying to avoid additional redundant changes. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unfortunately I don't think so, as the numbering depends on the exact order in which names are created that need de-duplication (there's a single counter for all names) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. OK. Just curious - are there now fewer(?) de-duplications taking place, or only a reordering of de-duplications? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Trying to confirm this patch is effectively NFCI. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Tried to strop as many unrelated changes from the diffs, but also added some new ones in the ones with predicated blocks to update the block variables. |
||||||
; PRED-NEXT: [[TMP24:%.*]] = extractelement <4 x i64> [[TMP18]], i32 1 | ||||||
; PRED-NEXT: [[TMP25:%.*]] = getelementptr i32, ptr [[DST]], i64 [[TMP24]] | ||||||
; PRED-NEXT: [[TMP26:%.*]] = add i32 [[OFFSET_IDX]], 1 | ||||||
; PRED-NEXT: store i32 [[TMP26]], ptr [[TMP25]], align 4 | ||||||
; PRED-NEXT: br label [[PRED_STORE_CONTINUE4]] | ||||||
; PRED: pred.store.continue4: | ||||||
; PRED: pred.store.continue3: | ||||||
; PRED-NEXT: [[TMP27:%.*]] = extractelement <4 x i1> [[ACTIVE_LANE_MASK]], i32 2 | ||||||
; PRED-NEXT: br i1 [[TMP27]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6:%.*]] | ||||||
; PRED: pred.store.if5: | ||||||
; PRED: pred.store.if4: | ||||||
; PRED-NEXT: [[TMP28:%.*]] = extractelement <4 x i64> [[TMP18]], i32 2 | ||||||
; PRED-NEXT: [[TMP29:%.*]] = getelementptr i32, ptr [[DST]], i64 [[TMP28]] | ||||||
; PRED-NEXT: [[TMP30:%.*]] = add i32 [[OFFSET_IDX]], 2 | ||||||
; PRED-NEXT: store i32 [[TMP30]], ptr [[TMP29]], align 4 | ||||||
; PRED-NEXT: br label [[PRED_STORE_CONTINUE6]] | ||||||
; PRED: pred.store.continue6: | ||||||
; PRED: pred.store.continue5: | ||||||
; PRED-NEXT: [[TMP31:%.*]] = extractelement <4 x i1> [[ACTIVE_LANE_MASK]], i32 3 | ||||||
; PRED-NEXT: br i1 [[TMP31]], label [[PRED_STORE_IF7:%.*]], label [[PRED_STORE_CONTINUE8]] | ||||||
; PRED: pred.store.if7: | ||||||
; PRED: pred.store.if6: | ||||||
; PRED-NEXT: [[TMP32:%.*]] = extractelement <4 x i64> [[TMP18]], i32 3 | ||||||
; PRED-NEXT: [[TMP33:%.*]] = getelementptr i32, ptr [[DST]], i64 [[TMP32]] | ||||||
; PRED-NEXT: [[TMP34:%.*]] = add i32 [[OFFSET_IDX]], 3 | ||||||
; PRED-NEXT: store i32 [[TMP34]], ptr [[TMP33]], align 4 | ||||||
; PRED-NEXT: br label [[PRED_STORE_CONTINUE8]] | ||||||
; PRED: pred.store.continue8: | ||||||
; PRED: pred.store.continue7: | ||||||
; PRED-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 | ||||||
; PRED-NEXT: [[ACTIVE_LANE_MASK_NEXT]] = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i64(i64 [[INDEX]], i64 [[TMP16]]) | ||||||
; PRED-NEXT: [[TMP35:%.*]] = xor <4 x i1> [[ACTIVE_LANE_MASK_NEXT]], splat (i1 true) | ||||||
|
@@ -675,31 +675,31 @@ define void @ivs_trunc_and_ext(i32 %x, ptr %dst, i64 %N) #0 { | |||||
; PRED: pred.store.continue: | ||||||
; PRED-NEXT: [[TMP22:%.*]] = extractelement <4 x i1> [[ACTIVE_LANE_MASK]], i32 1 | ||||||
; PRED-NEXT: br i1 [[TMP22]], label [[PRED_STORE_IF2:%.*]], label [[PRED_STORE_CONTINUE3:%.*]] | ||||||
; PRED: pred.store.if2: | ||||||
; PRED: pred.store.if1: | ||||||
; PRED-NEXT: [[TMP23:%.*]] = extractelement <4 x i64> [[TMP17]], i32 1 | ||||||
; PRED-NEXT: [[TMP24:%.*]] = getelementptr i32, ptr [[DST]], i64 [[TMP23]] | ||||||
; PRED-NEXT: [[TMP25:%.*]] = add i32 [[OFFSET_IDX]], 1 | ||||||
; PRED-NEXT: store i32 [[TMP25]], ptr [[TMP24]], align 4 | ||||||
; PRED-NEXT: br label [[PRED_STORE_CONTINUE3]] | ||||||
; PRED: pred.store.continue3: | ||||||
; PRED: pred.store.continue2: | ||||||
; PRED-NEXT: [[TMP26:%.*]] = extractelement <4 x i1> [[ACTIVE_LANE_MASK]], i32 2 | ||||||
; PRED-NEXT: br i1 [[TMP26]], label [[PRED_STORE_IF4:%.*]], label [[PRED_STORE_CONTINUE5:%.*]] | ||||||
; PRED: pred.store.if4: | ||||||
; PRED: pred.store.if3: | ||||||
; PRED-NEXT: [[TMP27:%.*]] = extractelement <4 x i64> [[TMP17]], i32 2 | ||||||
; PRED-NEXT: [[TMP28:%.*]] = getelementptr i32, ptr [[DST]], i64 [[TMP27]] | ||||||
; PRED-NEXT: [[TMP29:%.*]] = add i32 [[OFFSET_IDX]], 2 | ||||||
; PRED-NEXT: store i32 [[TMP29]], ptr [[TMP28]], align 4 | ||||||
; PRED-NEXT: br label [[PRED_STORE_CONTINUE5]] | ||||||
; PRED: pred.store.continue5: | ||||||
; PRED: pred.store.continue4: | ||||||
; PRED-NEXT: [[TMP30:%.*]] = extractelement <4 x i1> [[ACTIVE_LANE_MASK]], i32 3 | ||||||
; PRED-NEXT: br i1 [[TMP30]], label [[PRED_STORE_IF6:%.*]], label [[PRED_STORE_CONTINUE7]] | ||||||
; PRED: pred.store.if6: | ||||||
; PRED: pred.store.if5: | ||||||
; PRED-NEXT: [[TMP31:%.*]] = extractelement <4 x i64> [[TMP17]], i32 3 | ||||||
; PRED-NEXT: [[TMP32:%.*]] = getelementptr i32, ptr [[DST]], i64 [[TMP31]] | ||||||
; PRED-NEXT: [[TMP33:%.*]] = add i32 [[OFFSET_IDX]], 3 | ||||||
; PRED-NEXT: store i32 [[TMP33]], ptr [[TMP32]], align 4 | ||||||
; PRED-NEXT: br label [[PRED_STORE_CONTINUE7]] | ||||||
; PRED: pred.store.continue7: | ||||||
; PRED: pred.store.continue6: | ||||||
; PRED-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 4 | ||||||
; PRED-NEXT: [[ACTIVE_LANE_MASK_NEXT]] = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i64(i64 [[INDEX]], i64 [[TMP15]]) | ||||||
; PRED-NEXT: [[TMP34:%.*]] = xor <4 x i1> [[ACTIVE_LANE_MASK_NEXT]], splat (i1 true) | ||||||
|
@@ -840,12 +840,12 @@ define void @exit_cond_zext_iv(ptr %dst, i64 %N) { | |||||
; PRED: pred.store.continue: | ||||||
; PRED-NEXT: [[TMP11:%.*]] = extractelement <2 x i1> [[TMP7]], i32 1 | ||||||
; PRED-NEXT: br i1 [[TMP11]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6]] | ||||||
; PRED: pred.store.if5: | ||||||
; PRED: pred.store.if4: | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (introduced mismatch) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should also be fixed now |
||||||
; PRED-NEXT: [[TMP12:%.*]] = add i64 [[INDEX]], 1 | ||||||
; PRED-NEXT: [[TMP13:%.*]] = getelementptr { [100 x i32], i32, i32 }, ptr [[DST]], i64 [[TMP12]], i32 2 | ||||||
; PRED-NEXT: store i32 0, ptr [[TMP13]], align 8 | ||||||
; PRED-NEXT: br label [[PRED_STORE_CONTINUE6]] | ||||||
; PRED: pred.store.continue6: | ||||||
; PRED: pred.store.continue5: | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (introduced mismatch) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should also be fixed now |
||||||
; PRED-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 2 | ||||||
; PRED-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] | ||||||
; PRED-NEXT: br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[LOOP]], !llvm.loop [[LOOP10:![0-9]+]] | ||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -243,9 +243,8 @@ define void @wide_truncated_iv(ptr %dst) { | |
; CHECK: vec.epilog.iter.check: | ||
; CHECK-NEXT: br i1 false, label [[SCALAR_PH]], label [[VEC_EPILOG_PH]] | ||
; CHECK: vec.epilog.ph: | ||
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 192, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_PH]] ] | ||
; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ 192, [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_PH]] ] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (Some replicated phi's are removed) |
||
; CHECK-NEXT: [[TMP7:%.*]] = trunc i64 [[BC_RESUME_VAL]] to i8 | ||
; CHECK-NEXT: [[TMP7:%.*]] = trunc i64 [[VEC_EPILOG_RESUME_VAL]] to i8 | ||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <8 x i8> poison, i8 [[TMP7]], i64 0 | ||
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <8 x i8> [[DOTSPLATINSERT]], <8 x i8> poison, <8 x i32> zeroinitializer | ||
; CHECK-NEXT: [[INDUCTION:%.*]] = add <8 x i8> [[DOTSPLAT]], <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7> | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Independent fix, but testable only now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not needed in the latest version, remove, thanks