mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
TRE: Just erase dead BBs and tweak the iteration loop not to increment the deleted BB iterator.
Leaving empty blocks around just opens up a can of bugs like PR22704. Deleting them early also slightly simplifies code. Thanks to Sanjay for the IR test case. llvm-svn: 230856
This commit is contained in:
parent
4d39ffa2aa
commit
1a8767d1c0
@ -403,28 +403,19 @@ bool TailCallElim::runTRE(Function &F) {
|
||||
// alloca' is changed from being a static alloca to being a dynamic alloca.
|
||||
// Until this is resolved, disable this transformation if that would ever
|
||||
// happen. This bug is PR962.
|
||||
SmallVector<BasicBlock*, 8> BBToErase;
|
||||
for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
|
||||
for (Function::iterator BBI = F.begin(), E = F.end(); BBI != E; /*in loop*/) {
|
||||
BasicBlock *BB = BBI++; // FoldReturnAndProcessPred may delete BB.
|
||||
if (ReturnInst *Ret = dyn_cast<ReturnInst>(BB->getTerminator())) {
|
||||
bool Change = ProcessReturningBlock(Ret, OldEntry, TailCallsAreMarkedTail,
|
||||
ArgumentPHIs, !CanTRETailMarkedCall);
|
||||
if (!Change && BB->getFirstNonPHIOrDbg() == Ret) {
|
||||
if (!Change && BB->getFirstNonPHIOrDbg() == Ret)
|
||||
Change = FoldReturnAndProcessPred(BB, Ret, OldEntry,
|
||||
TailCallsAreMarkedTail, ArgumentPHIs,
|
||||
!CanTRETailMarkedCall);
|
||||
// FoldReturnAndProcessPred may have emptied some BB. Remember to
|
||||
// erase them.
|
||||
if (Change && BB->empty())
|
||||
BBToErase.push_back(BB);
|
||||
|
||||
}
|
||||
MadeChange |= Change;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto BB: BBToErase)
|
||||
BB->eraseFromParent();
|
||||
|
||||
// If we eliminated any tail recursions, it's possible that we inserted some
|
||||
// silly PHI nodes which just merge an initial value (the incoming operand)
|
||||
// with themselves. Check to see if we did and clean up our mess if so. This
|
||||
@ -831,14 +822,11 @@ bool TailCallElim::FoldReturnAndProcessPred(BasicBlock *BB,
|
||||
ReturnInst *RI = FoldReturnIntoUncondBranch(Ret, BB, Pred);
|
||||
|
||||
// Cleanup: if all predecessors of BB have been eliminated by
|
||||
// FoldReturnIntoUncondBranch, we would like to delete it, but we
|
||||
// can not just nuke it as it is being used as an iterator by our caller.
|
||||
// Just empty it, and the caller will erase it when it is safe to do so.
|
||||
// It is important to empty it, because the ret instruction in there is
|
||||
// still using a value which EliminateRecursiveTailCall will attempt
|
||||
// to remove.
|
||||
// FoldReturnIntoUncondBranch, delete it. It is important to empty it,
|
||||
// because the ret instruction in there is still using a value which
|
||||
// EliminateRecursiveTailCall will attempt to remove.
|
||||
if (!BB->hasAddressTaken() && pred_begin(BB) == pred_end(BB))
|
||||
BB->getInstList().clear();
|
||||
BB->eraseFromParent();
|
||||
|
||||
EliminateRecursiveTailCall(CI, RI, OldEntry, TailCallsAreMarkedTail,
|
||||
ArgumentPHIs,
|
||||
|
@ -31,3 +31,24 @@ define float @fabsf(float %f) {
|
||||
}
|
||||
|
||||
declare x86_fp80 @fabsl(x86_fp80 %f)
|
||||
|
||||
; Don't crash while transforming a function with infinite recursion.
|
||||
define i32 @PR22704(i1 %bool) {
|
||||
entry:
|
||||
br i1 %bool, label %t, label %f
|
||||
|
||||
t:
|
||||
%call1 = call i32 @PR22704(i1 1)
|
||||
br label %return
|
||||
|
||||
f:
|
||||
%call = call i32 @PR22704(i1 1)
|
||||
br label %return
|
||||
|
||||
return:
|
||||
ret i32 0
|
||||
|
||||
; CHECK-LABEL: @PR22704(
|
||||
; CHECK: %bool.tr = phi i1 [ %bool, %entry ], [ true, %t ], [ true, %f ]
|
||||
; CHECK: br i1 %bool.tr, label %t, label %f
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user