mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-10 08:40:41 +00:00
Fix bugs in the inliner having to do with single-entry phi nodes and valuemap
updating. These were exposed by Devang's recent passmgr changes (with non-default passorderings) because now the inliner can be interleved with the LCSSA pass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33760 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6f46e59d2a
commit
8e8eda78cc
@ -431,18 +431,12 @@ void llvm::CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
PN->eraseFromParent();
|
||||
++OldI;
|
||||
}
|
||||
} else if (PN->getNumIncomingValues() == 1) {
|
||||
BasicBlock::iterator I = NewBB->begin();
|
||||
BasicBlock::const_iterator OldI = OldBB->begin();
|
||||
while ((PN = dyn_cast<PHINode>(I++))) {
|
||||
Value *NV = PN->getIncomingValue(0);
|
||||
PN->replaceAllUsesWith(NV);
|
||||
assert(ValueMap[OldI] == PN && "ValueMap mismatch");
|
||||
ValueMap[OldI] = NV;
|
||||
PN->eraseFromParent();
|
||||
++OldI;
|
||||
}
|
||||
}
|
||||
// NOTE: We cannot eliminate single entry phi nodes here, because of
|
||||
// ValueMap. Single entry phi nodes can have multiple ValueMap entries
|
||||
// pointing at them. Thus, deleting one would require scanning the ValueMap
|
||||
// to update any entries in it that would require that. This would be
|
||||
// really slow.
|
||||
}
|
||||
|
||||
// Now that the inlined function body has been fully constructed, go through
|
||||
@ -454,8 +448,14 @@ void llvm::CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
BranchInst *BI = dyn_cast<BranchInst>(I->getTerminator());
|
||||
if (!BI || BI->isConditional()) { ++I; continue; }
|
||||
|
||||
// Note that we can't eliminate uncond branches if the destination has
|
||||
// single-entry PHI nodes. Eliminating the single-entry phi nodes would
|
||||
// require scanning the ValueMap to update any entries that point to the phi
|
||||
// node.
|
||||
BasicBlock *Dest = BI->getSuccessor(0);
|
||||
if (!Dest->getSinglePredecessor()) { ++I; continue; }
|
||||
if (!Dest->getSinglePredecessor() || isa<PHINode>(Dest->begin())) {
|
||||
++I; continue;
|
||||
}
|
||||
|
||||
// We know all single-entry PHI nodes in the inlined function have been
|
||||
// removed, so we just need to splice the blocks.
|
||||
|
Loading…
x
Reference in New Issue
Block a user