mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-11 21:57:55 +00:00
[SCCP] Remove manual folding of terminator instructions.
Summary: BranchInst, SwitchInst (with non-default case) with Undef as input is not possible at this point. As we always default-fold terminator to one target in ResolvedUndefsIn and set the input accordingly. So we should only have constantint/blockaddress here. If ConstantFoldTerminator fails, that could mean 2 things. 1. ConstantFoldTerminator is doing something unexpected, i.e. not folding on constantint or blockaddress and not making blocks that should be dead dead. 2. This is not a terminator on constantint or blockaddress. Its on a constant or overdefined, then this block should not be dead. In both cases, we should assert. Reviewers: davide, efriedma, sanjoy Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D30381 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296281 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a11dc45cbd
commit
650a66fb4c
@ -1824,32 +1824,9 @@ static bool runIPSCCP(Module &M, const DataLayout &DL,
|
||||
if (!I) continue;
|
||||
|
||||
bool Folded = ConstantFoldTerminator(I->getParent());
|
||||
if (!Folded) {
|
||||
// The constant folder may not have been able to fold the terminator
|
||||
// if this is a branch or switch on undef. Fold it manually as a
|
||||
// branch to the first successor.
|
||||
#ifndef NDEBUG
|
||||
if (auto *BI = dyn_cast<BranchInst>(I)) {
|
||||
assert(BI->isConditional() && isa<UndefValue>(BI->getCondition()) &&
|
||||
"Branch should be foldable!");
|
||||
} else if (auto *SI = dyn_cast<SwitchInst>(I)) {
|
||||
assert(isa<UndefValue>(SI->getCondition()) && "Switch should fold");
|
||||
} else {
|
||||
llvm_unreachable("Didn't fold away reference to block!");
|
||||
}
|
||||
#endif
|
||||
|
||||
// Make this an uncond branch to the first successor.
|
||||
TerminatorInst *TI = I->getParent()->getTerminator();
|
||||
BranchInst::Create(TI->getSuccessor(0), TI);
|
||||
|
||||
// Remove entries in successor phi nodes to remove edges.
|
||||
for (unsigned i = 1, e = TI->getNumSuccessors(); i != e; ++i)
|
||||
TI->getSuccessor(i)->removePredecessor(TI->getParent());
|
||||
|
||||
// Remove the old terminator.
|
||||
TI->eraseFromParent();
|
||||
}
|
||||
assert(Folded &&
|
||||
"Expect TermInst on constantint or blockaddress to be folded");
|
||||
(void) Folded;
|
||||
}
|
||||
|
||||
// Finally, delete the basic block.
|
||||
|
Loading…
Reference in New Issue
Block a user