mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[SimplifyCFG] simplifySingleResume(): FoldReturnIntoUncondBranch() already knows how to preserve DomTree
... so just ensure that we pass DomTreeUpdater it into it. Apparently, there were no dedicated tests just for that functionality, so i'm adding one here.
This commit is contained in:
parent
a314860e9c
commit
8e036d3e3a
@ -4424,7 +4424,7 @@ bool SimplifyCFGOpt::simplifyReturn(ReturnInst *RI, IRBuilder<> &Builder) {
|
|||||||
BasicBlock *Pred = UncondBranchPreds.pop_back_val();
|
BasicBlock *Pred = UncondBranchPreds.pop_back_val();
|
||||||
LLVM_DEBUG(dbgs() << "FOLDING: " << *BB
|
LLVM_DEBUG(dbgs() << "FOLDING: " << *BB
|
||||||
<< "INTO UNCOND BRANCH PRED: " << *Pred);
|
<< "INTO UNCOND BRANCH PRED: " << *Pred);
|
||||||
(void)FoldReturnIntoUncondBranch(RI, BB, Pred);
|
(void)FoldReturnIntoUncondBranch(RI, BB, Pred, DTU);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we eliminated all predecessors of the block, delete the block now.
|
// If we eliminated all predecessors of the block, delete the block now.
|
||||||
@ -4432,6 +4432,9 @@ bool SimplifyCFGOpt::simplifyReturn(ReturnInst *RI, IRBuilder<> &Builder) {
|
|||||||
// We know there are no successors, so just nuke the block.
|
// We know there are no successors, so just nuke the block.
|
||||||
if (LoopHeaders)
|
if (LoopHeaders)
|
||||||
LoopHeaders->erase(BB);
|
LoopHeaders->erase(BB);
|
||||||
|
if (DTU)
|
||||||
|
DTU->deleteBB(BB);
|
||||||
|
else
|
||||||
BB->eraseFromParent();
|
BB->eraseFromParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
31
test/Transforms/SimplifyCFG/duplicate-ret-into-uncond-br.ll
Normal file
31
test/Transforms/SimplifyCFG/duplicate-ret-into-uncond-br.ll
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||||
|
; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -simplifycfg-dup-ret -S | FileCheck %s
|
||||||
|
|
||||||
|
declare void @bar()
|
||||||
|
declare void @baz()
|
||||||
|
|
||||||
|
define void @foo(i1 %c) {
|
||||||
|
; CHECK-LABEL: @foo(
|
||||||
|
; CHECK-NEXT: entry:
|
||||||
|
; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
|
||||||
|
; CHECK: true:
|
||||||
|
; CHECK-NEXT: call void @bar()
|
||||||
|
; CHECK-NEXT: ret void
|
||||||
|
; CHECK: false:
|
||||||
|
; CHECK-NEXT: call void @baz()
|
||||||
|
; CHECK-NEXT: ret void
|
||||||
|
;
|
||||||
|
entry:
|
||||||
|
br i1 %c, label %true, label %false
|
||||||
|
|
||||||
|
true:
|
||||||
|
call void @bar()
|
||||||
|
br label %end
|
||||||
|
|
||||||
|
false:
|
||||||
|
call void @baz()
|
||||||
|
br label %end
|
||||||
|
|
||||||
|
end:
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user