diff options
author | Hans Wennborg <hans@hanshq.net> | 2016-05-02 17:22:54 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2016-05-02 17:22:54 +0000 |
commit | b7599329fc28ec8f7086157ea50202fa5ba47f89 (patch) | |
tree | 8eab5e3e0a4b7172f5af45d427da8cfe5dad4f21 /llvm/lib/IR/BasicBlock.cpp | |
parent | ce18ade406a58aac9cfdea74479a6412f30d920f (diff) | |
download | llvm-b7599329fc28ec8f7086157ea50202fa5ba47f89.zip llvm-b7599329fc28ec8f7086157ea50202fa5ba47f89.tar.gz llvm-b7599329fc28ec8f7086157ea50202fa5ba47f89.tar.bz2 |
[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/IR/BasicBlock.cpp')
-rw-r--r-- | llvm/lib/IR/BasicBlock.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp index 9f806fa..604ea3a 100644 --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -206,6 +206,30 @@ Instruction* BasicBlock::getFirstNonPHIOrDbgOrLifetime() { return nullptr; } +Instruction *BasicBlock::getFirstNonPHIOrDbgOrLifetimeOrBitCast() { + for (Instruction &I : *this) { + if (isa<PHINode>(I) || isa<DbgInfoIntrinsic>(I)) + continue; + + if (auto *II = dyn_cast<IntrinsicInst>(&I)) + if (II->getIntrinsicID() == Intrinsic::lifetime_start || + II->getIntrinsicID() == Intrinsic::lifetime_end) + continue; + + if (auto *BCI = dyn_cast<BitCastInst>(&I)) { + if (auto *II = dyn_cast<IntrinsicInst>(++I.getIterator())) { + if ((II->getIntrinsicID() == Intrinsic::lifetime_start || + II->getIntrinsicID() == Intrinsic::lifetime_end) && + II->getOperand(1) == BCI) { + continue; + } + } + } + return &I; + } + return nullptr; +} + BasicBlock::iterator BasicBlock::getFirstInsertionPt() { Instruction *FirstNonPHI = getFirstNonPHI(); if (!FirstNonPHI) |