summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2016-05-02 17:22:54 +0000
committerHans Wennborg <hans@hanshq.net>2016-05-02 17:22:54 +0000
commitb7599329fc28ec8f7086157ea50202fa5ba47f89 (patch)
tree8eab5e3e0a4b7172f5af45d427da8cfe5dad4f21 /llvm/lib/Transforms/Utils/SimplifyCFG.cpp
parentce18ade406a58aac9cfdea74479a6412f30d920f (diff)
downloadbcm5719-llvm-b7599329fc28ec8f7086157ea50202fa5ba47f89.tar.gz
bcm5719-llvm-b7599329fc28ec8f7086157ea50202fa5ba47f89.zip
[SimplifyCFG] Extend TryToSimplifyUncondBranchFromEmptyBlock for empty block including lifetime intrinsics
Make it possible that TryToSimplifyUncondBranchFromEmptyBlock merges empty basic block including lifetime intrinsics as well as phi nodes and unconditional branch into its successor or predecessor(s). If successor of empty block has single predecessor, all contents including lifetime intrinsics are sinked into the successor. Otherwise, they are hoisted into its predecessor(s) and then merged into the predecessor(s). Patch by Josh Yoon <josh.yoon@samsung.com>! Differential Revision: http://reviews.llvm.org/D19257 llvm-svn: 268254
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyCFG.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 6ac039d8a1a..7454a9607fe 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -5056,14 +5056,15 @@ bool SimplifyCFGOpt::SimplifyUncondBranch(BranchInst *BI, IRBuilder<> &Builder){
if (SinkCommon && SinkThenElseCodeToEnd(BI))
return true;
-
- // If the Terminator is the only non-phi instruction, simplify the block.
- // if LoopHeader is provided, check if the block is a loop header
+ // If the Terminator is the only non-phi instruction except for bitcast
+ // instruction coupled with the following lifetime intrinsic, simplify the
+ // block. If LoopHeader is provided, check if the block is a loop header
// (This is for early invocations before loop simplify and vectorization
// to keep canonical loop forms for nested loops.
// These blocks can be eliminated when the pass is invoked later
// in the back-end.)
- BasicBlock::iterator I = BB->getFirstNonPHIOrDbg()->getIterator();
+ BasicBlock::iterator I =
+ BB->getFirstNonPHIOrDbgOrLifetimeOrBitCast()->getIterator();
if (I->isTerminator() && BB != &BB->getParent()->getEntryBlock() &&
(!LoopHeaders || !LoopHeaders->count(BB)) &&
TryToSimplifyUncondBranchFromEmptyBlock(BB))
OpenPOWER on IntegriCloud