Skip to content

Commit d0f122b

Browse files
authored
[LV] Update incoming blocks in VPWidenPHIRecipe in reassociateBlocks (#125481)
This is extracted from #118638 After c7ebe4f we will crash in fixNonInductionPHIs if we use a VPWidenPHIRecipe with the vector preheader as an incoming block, because the phi will reference the old non-IRBB vector preheader. This fixes this by updating VPBlockUtils::reassociateBlocks to update any VPWidenPHIRecipes's incoming blocks. This assumes that if the VPWidenPHIRecipe is in a VPRegionBlock, it's in the entry block, and that we are replacing a VPBasicBlock with another VPBasicBlock.
1 parent 4590f75 commit d0f122b

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

llvm/lib/Transforms/Vectorize/VPlan.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2000,6 +2000,11 @@ class VPWidenPHIRecipe : public VPSingleDefRecipe {
20002000
/// Returns the \p I th incoming VPBasicBlock.
20012001
VPBasicBlock *getIncomingBlock(unsigned I) { return IncomingBlocks[I]; }
20022002

2003+
/// Set the \p I th incoming VPBasicBlock to \p IncomingBlock.
2004+
void setIncomingBlock(unsigned I, VPBasicBlock *IncomingBlock) {
2005+
IncomingBlocks[I] = IncomingBlock;
2006+
}
2007+
20032008
/// Returns the \p I th incoming VPValue.
20042009
VPValue *getIncomingValue(unsigned I) { return getOperand(I); }
20052010
};

llvm/lib/Transforms/Vectorize/VPlanUtils.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,16 @@ class VPBlockUtils {
169169
static void reassociateBlocks(VPBlockBase *Old, VPBlockBase *New) {
170170
for (auto *Pred : to_vector(Old->getPredecessors()))
171171
Pred->replaceSuccessor(Old, New);
172-
for (auto *Succ : to_vector(Old->getSuccessors()))
172+
for (auto *Succ : to_vector(Old->getSuccessors())) {
173173
Succ->replacePredecessor(Old, New);
174+
175+
// Replace any references to Old in widened phi incoming blocks.
176+
for (auto &R : Succ->getEntryBasicBlock()->phis())
177+
if (auto *WidenPhiR = dyn_cast<VPWidenPHIRecipe>(&R))
178+
for (unsigned I = 0; I < WidenPhiR->getNumOperands(); I++)
179+
if (WidenPhiR->getIncomingBlock(I) == Old)
180+
WidenPhiR->setIncomingBlock(I, cast<VPBasicBlock>(New));
181+
}
174182
New->setPredecessors(Old->getPredecessors());
175183
New->setSuccessors(Old->getSuccessors());
176184
Old->clearPredecessors();

llvm/unittests/Transforms/Vectorize/VPlanTest.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,49 @@ TEST_F(VPBasicBlockTest, TraversingIteratorTest) {
660660
}
661661
}
662662

663+
TEST_F(VPBasicBlockTest, reassociateBlocks) {
664+
{
665+
// Ensure that when we reassociate a basic block, we make sure to update any
666+
// references to it in VPWidenPHIRecipes' incoming blocks.
667+
VPlan &Plan = getPlan();
668+
VPBasicBlock *VPBB1 = Plan.createVPBasicBlock("VPBB1");
669+
VPBasicBlock *VPBB2 = Plan.createVPBasicBlock("VPBB2");
670+
VPBlockUtils::connectBlocks(VPBB1, VPBB2);
671+
672+
auto *WidenPhi = new VPWidenPHIRecipe(nullptr);
673+
IntegerType *Int32 = IntegerType::get(C, 32);
674+
VPValue *Val = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1));
675+
WidenPhi->addIncoming(Val, VPBB1);
676+
VPBB2->appendRecipe(WidenPhi);
677+
678+
VPBasicBlock *VPBBNew = Plan.createVPBasicBlock("VPBBNew");
679+
VPBlockUtils::reassociateBlocks(VPBB1, VPBBNew);
680+
EXPECT_EQ(VPBB2->getSinglePredecessor(), VPBBNew);
681+
EXPECT_EQ(WidenPhi->getIncomingBlock(0), VPBBNew);
682+
}
683+
684+
{
685+
// Ensure that we update VPWidenPHIRecipes that are nested inside a
686+
// VPRegionBlock.
687+
VPlan &Plan = getPlan();
688+
VPBasicBlock *VPBB1 = Plan.createVPBasicBlock("VPBB1");
689+
VPBasicBlock *VPBB2 = Plan.createVPBasicBlock("VPBB2");
690+
VPRegionBlock *R1 = Plan.createVPRegionBlock(VPBB2, VPBB2, "R1");
691+
VPBlockUtils::connectBlocks(VPBB1, R1);
692+
693+
auto *WidenPhi = new VPWidenPHIRecipe(nullptr);
694+
IntegerType *Int32 = IntegerType::get(C, 32);
695+
VPValue *Val = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 1));
696+
WidenPhi->addIncoming(Val, VPBB1);
697+
VPBB2->appendRecipe(WidenPhi);
698+
699+
VPBasicBlock *VPBBNew = Plan.createVPBasicBlock("VPBBNew");
700+
VPBlockUtils::reassociateBlocks(VPBB1, VPBBNew);
701+
EXPECT_EQ(R1->getSinglePredecessor(), VPBBNew);
702+
EXPECT_EQ(WidenPhi->getIncomingBlock(0), VPBBNew);
703+
}
704+
}
705+
663706
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
664707
TEST_F(VPBasicBlockTest, print) {
665708
VPInstruction *TC = new VPInstruction(Instruction::Add, {});

0 commit comments

Comments
 (0)