Skip to content

Commit 105032f

Browse files
committed
[LV] Use PHI recipe instead of PredRecipe for subsequent uses.
At the moment, the VPPRedInstPHIRecipe is not used in subsequent uses of the predicate recipe. This incorrectly models the def-use chains, as all later uses should use the phi recipe. Fix that by delaying recording of the recipe. Reviewed By: Ayal Differential Revision: https://reviews.llvm.org/D129436
1 parent b94ea8b commit 105032f

File tree

4 files changed

+20
-17
lines changed

4 files changed

+20
-17
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8415,8 +8415,6 @@ VPBasicBlock *VPRecipeBuilder::handleReplication(
84158415

84168416
auto *Recipe = new VPReplicateRecipe(I, Plan->mapToVPValues(I->operands()),
84178417
IsUniform, IsPredicated);
8418-
setRecipe(I, Recipe);
8419-
Plan->addVPValue(I, Recipe);
84208418

84218419
// Find if I uses a predicated instruction. If so, it will use its scalar
84228420
// value. Avoid hoisting the insert-element which packs the scalar value into
@@ -8435,6 +8433,8 @@ VPBasicBlock *VPRecipeBuilder::handleReplication(
84358433
// Finalize the recipe for Instr, first if it is not predicated.
84368434
if (!IsPredicated) {
84378435
LLVM_DEBUG(dbgs() << "LV: Scalarizing:" << *I << "\n");
8436+
setRecipe(I, Recipe);
8437+
Plan->addVPValue(I, Recipe);
84388438
VPBB->appendRecipe(Recipe);
84398439
return VPBB;
84408440
}
@@ -8445,19 +8445,20 @@ VPBasicBlock *VPRecipeBuilder::handleReplication(
84458445
"predicated replication.");
84468446
VPBlockUtils::disconnectBlocks(VPBB, SingleSucc);
84478447
// Record predicated instructions for above packing optimizations.
8448-
VPBlockBase *Region = createReplicateRegion(I, Recipe, Plan);
8448+
VPBlockBase *Region = createReplicateRegion(Recipe, Plan);
84498449
VPBlockUtils::insertBlockAfter(Region, VPBB);
84508450
auto *RegSucc = new VPBasicBlock();
84518451
VPBlockUtils::insertBlockAfter(RegSucc, Region);
84528452
VPBlockUtils::connectBlocks(RegSucc, SingleSucc);
84538453
return RegSucc;
84548454
}
84558455

8456-
VPRegionBlock *VPRecipeBuilder::createReplicateRegion(
8457-
Instruction *Instr, VPReplicateRecipe *PredRecipe, VPlanPtr &Plan) {
8456+
VPRegionBlock *
8457+
VPRecipeBuilder::createReplicateRegion(VPReplicateRecipe *PredRecipe,
8458+
VPlanPtr &Plan) {
8459+
Instruction *Instr = PredRecipe->getUnderlyingInstr();
84588460
// Instructions marked for predication are replicated and placed under an
84598461
// if-then construct to prevent side-effects.
8460-
84618462
// Generate recipes to compute the block mask for this region.
84628463
VPValue *BlockInMask = createBlockInMask(Instr->getParent(), Plan);
84638464

@@ -8470,9 +8471,13 @@ VPRegionBlock *VPRecipeBuilder::createReplicateRegion(
84708471
? nullptr
84718472
: new VPPredInstPHIRecipe(PredRecipe);
84728473
if (PHIRecipe) {
8473-
Plan->removeVPValueFor(Instr);
8474+
setRecipe(Instr, PHIRecipe);
84748475
Plan->addVPValue(Instr, PHIRecipe);
8476+
} else {
8477+
setRecipe(Instr, PredRecipe);
8478+
Plan->addVPValue(Instr, PredRecipe);
84758479
}
8480+
84768481
auto *Exiting = new VPBasicBlock(Twine(RegionName) + ".continue", PHIRecipe);
84778482
auto *Pred = new VPBasicBlock(Twine(RegionName) + ".if", PredRecipe);
84788483
VPRegionBlock *Region = new VPRegionBlock(Entry, Exiting, RegionName, true);

llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,8 @@ class VPRecipeBuilder {
157157
return Ingredient2Recipe[I];
158158
}
159159

160-
/// Create a replicating region for instruction \p I that requires
161-
/// predication. \p PredRecipe is a VPReplicateRecipe holding \p I.
162-
VPRegionBlock *createReplicateRegion(Instruction *I,
163-
VPReplicateRecipe *PredRecipe,
160+
/// Create a replicating region for \p PredRecipe.
161+
VPRegionBlock *createReplicateRegion(VPReplicateRecipe *PredRecipe,
164162
VPlanPtr &Plan);
165163

166164
/// Build a VPReplicationRecipe for \p I and enclose it within a Region if it

llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ define void @need_new_block_after_sinking_pr56146(i32 %x, i32* %src) {
447447
; CHECK-NEXT: <x1> vector loop: {
448448
; CHECK-NEXT: vector.body:
449449
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
450-
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%.pn> = phi ir<0>, ir<%l>
450+
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%.pn> = phi ir<0>, vp<[[P_L:%.+]]>
451451
; CHECK-NEXT: EMIT vp<[[WIDE_IV:%.+]]> = WIDEN-CANONICAL-INDUCTION vp<[[CAN_IV]]>
452452
; CHECK-NEXT: EMIT vp<[[CMP:%.+]]> = icmp ule vp<[[WIDE_IV]]> vp<[[BTC]]>
453453
; CHECK-NEXT: Successor(s): loop.0
@@ -465,13 +465,13 @@ define void @need_new_block_after_sinking_pr56146(i32 %x, i32* %src) {
465465
; CHECK-NEXT: Successor(s): pred.load.continue
466466
; CHECK-EMPTY:
467467
; CHECK-NEXT: pred.load.continue:
468-
; CHECK-NEXT: PHI-PREDICATED-INSTRUCTION vp<[[P_L:%.+]]> = ir<%l>
468+
; CHECK-NEXT: PHI-PREDICATED-INSTRUCTION vp<[[P_L]]> = ir<%l>
469469
; CHECK-NEXT: No successors
470470
; CHECK-NEXT: }
471471
; CHECK-NEXT: Successor(s): pred.load.succ
472472
; CHECK-EMPTY:
473473
; CHECK-NEXT: pred.load.succ:
474-
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%.pn> ir<%l>
474+
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%.pn> vp<[[P_L]]>
475475
; CHECK-NEXT: Successor(s): pred.sdiv
476476
; CHECK-EMPTY:
477477
; CHECK-NEXT: <xVFxUF> pred.sdiv: {

llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@ define void @recipe_in_merge_candidate_used_by_first_order_recurrence(i32 %k) {
851851
; CHECK-NEXT: vector.body:
852852
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
853853
; CHECK-NEXT: WIDEN-INDUCTION %iv = phi 0, %iv.next, ir<1>
854-
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for> = phi ir<0>, ir<%lv.a>
854+
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%for> = phi ir<0>, vp<[[PRED:%.+]]>
855855
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<0>, ir<1>
856856
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
857857
; CHECK-NEXT: REPLICATE ir<%gep.a> = getelementptr ir<@a>, ir<0>, vp<[[STEPS]]>
@@ -867,13 +867,13 @@ define void @recipe_in_merge_candidate_used_by_first_order_recurrence(i32 %k) {
867867
; CHECK-NEXT: Successor(s): pred.load.continue
868868
; CHECK-EMPTY:
869869
; CHECK-NEXT: pred.load.continue:
870-
; CHECK-NEXT: PHI-PREDICATED-INSTRUCTION vp<[[PRED:%.+]]> = ir<%lv.a>
870+
; CHECK-NEXT: PHI-PREDICATED-INSTRUCTION vp<[[PRED]]> = ir<%lv.a>
871871
; CHECK-NEXT: No successors
872872
; CHECK-NEXT: }
873873
; CHECK-NEXT: Successor(s): loop.0
874874
; CHECK-EMPTY:
875875
; CHECK-NEXT: loop.0:
876-
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%for> ir<%lv.a>
876+
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%for> vp<[[PRED]]>
877877
; CHECK-NEXT: Successor(s): loop.1
878878
; CHECK-EMPTY:
879879
; CHECK-NEXT: loop.1:

0 commit comments

Comments
 (0)