[PATCH] D99294: [LV] Track incoming values for reductions in recipe (NFC).
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 6 04:14:05 PDT 2021
fhahn updated this revision to Diff 335473.
fhahn added a comment.
Rebase & ping.
I just pushed a small patch that prints prints VPWidenPHIRecipe using the VPValue operands, if there are operands for all incoming values (a6b06b785cda1bb94dd05f29d66892ccb44cf0cd <https://reviews.llvm.org/rGa6b06b785cda1bb94dd05f29d66892ccb44cf0cd>).
Now the change in this patch (adding the incoming value from the loop backedge) is visible in the printing.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99294/new/
https://reviews.llvm.org/D99294
Files:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/test/Transforms/LoopVectorize/vplan-printing.ll
Index: llvm/test/Transforms/LoopVectorize/vplan-printing.ll
===================================================================
--- llvm/test/Transforms/LoopVectorize/vplan-printing.ll
+++ llvm/test/Transforms/LoopVectorize/vplan-printing.ll
@@ -79,7 +79,7 @@
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
; CHECK-NEXT: for.body:
; CHECK-NEXT: WIDEN-INDUCTION %iv = phi %iv.next, 0
-; CHECK-NEXT: WIDEN-PHI %red = phi %red.next, 0.000000e+00
+; CHECK-NEXT: WIDEN-PHI ir<%red> = phi ir<0.000000e+00>, ir<%red.next>
; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr ir<%y>, ir<%iv>
; CHECK-NEXT: WIDEN ir<%lv> = load ir<%arrayidx>
; CHECK-NEXT: REDUCE ir<%red.next> = ir<%red> + reduce.fadd (ir<%lv>)
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -4291,14 +4291,11 @@
// Reductions do not have to start at zero. They can start with
// any loop invariant values.
- BasicBlock *Latch = OrigLoop->getLoopLatch();
- Value *LoopVal = OrigPhi->getIncomingValueForBlock(Latch);
-
for (unsigned Part = 0; Part < UF; ++Part) {
- Value *VecRdxPhi = State.get(PhiR->getVPValue(), Part);
- Value *Val = State.get(State.Plan->getVPValue(LoopVal), Part);
- cast<PHINode>(VecRdxPhi)
- ->addIncoming(Val, LI->getLoopFor(LoopVectorBody)->getLoopLatch());
+ Value *VecRdxPhi = State.get(PhiR->getVPValue(0), Part);
+ cast<PHINode>(VecRdxPhi)->addIncoming(
+ State.get(PhiR->getOperand(1), Part),
+ LI->getLoopFor(LoopVectorBody)->getLoopLatch());
}
// Before each round, move the insertion point right between
@@ -8813,6 +8810,18 @@
RecipeBuilder.recordRecipeOf(Entry.first);
RecipeBuilder.recordRecipeOf(Entry.second);
}
+
+ SmallVector<PHINode *, 4> PhisToFix;
+ BasicBlock *OrigLatch = OrigLoop->getLoopLatch();
+ for (PHINode &Phi : OrigLoop->getHeader()->phis()) {
+ if (!Legal->isReductionVariable(&Phi))
+ continue;
+ PhisToFix.push_back(&Phi);
+ RecipeBuilder.recordRecipeOf(&Phi);
+ RecipeBuilder.recordRecipeOf(
+ cast<Instruction>(Phi.getIncomingValueForBlock(OrigLatch)));
+ }
+
for (auto &Reduction : CM.getInLoopReductionChains()) {
PHINode *Phi = Reduction.first;
RecurKind Kind = Legal->getReductionVars()[Phi].getRecurrenceKind();
@@ -8920,6 +8929,14 @@
}
}
+ for (PHINode *PN : PhisToFix) {
+ VPWidenPHIRecipe *R = cast<VPWidenPHIRecipe>(RecipeBuilder.getRecipe(PN));
+ VPRecipeBase *IncR = RecipeBuilder.getRecipe(
+ cast<Instruction>(PN->getIncomingValueForBlock(OrigLatch)));
+ assert(IncR->getNumDefinedValues() == 1);
+ R->addOperand(IncR->getVPValue(0));
+ }
+
// Discard empty dummy pre-entry VPBasicBlock. Note that other VPBasicBlocks
// may also be empty, such as the last one VPBB, reflecting original
// basic-blocks with no recipes.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D99294.335473.patch
Type: text/x-patch
Size: 3004 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210406/25f61f3f/attachment.bin>
More information about the llvm-commits
mailing list