diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-01-24 05:26:18 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-01-24 05:26:18 +0000 |
commit | 35c46d3e0b587d3d8f2d9daf533e3566e841b943 (patch) | |
tree | 43957709f2f58260fc1667b08d8479beed096d88 /llvm/lib/Transforms/Utils/Local.cpp | |
parent | 7e15272bbe2e3e3fa3698d8f8fbfa8f3c9557292 (diff) | |
download | bcm5719-llvm-35c46d3e0b587d3d8f2d9daf533e3566e841b943.tar.gz bcm5719-llvm-35c46d3e0b587d3d8f2d9daf533e3566e841b943.zip |
[InstCombine, SCCP] Consolidate code used to remove instructions
InstCombine and SCCP both want to remove dead code in a very particular
way but using identical means to do so. Share the code between the two.
No functionality change is intended.
llvm-svn: 258653
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index ed941a7d61a..d2ac9890b62 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -1222,6 +1222,27 @@ bool llvm::replaceDbgDeclareForAlloca(AllocaInst *AI, Value *NewAllocaAddress, Deref, Offset); } +unsigned llvm::removeAllNonTerminatorAndEHPadInstructions(BasicBlock *BB) { + unsigned NumDeadInst = 0; + // Delete the instructions backwards, as it has a reduced likelihood of + // having to update as many def-use and use-def chains. + Instruction *EndInst = BB->getTerminator(); // Last not to be deleted. + while (EndInst != BB->begin()) { + // Delete the next to last instruction. + Instruction *Inst = &*--EndInst->getIterator(); + if (!Inst->use_empty() && !Inst->getType()->isTokenTy()) + Inst->replaceAllUsesWith(UndefValue::get(Inst->getType())); + if (Inst->isEHPad() || Inst->getType()->isTokenTy()) { + EndInst = Inst; + continue; + } + if (!isa<DbgInfoIntrinsic>(Inst)) + ++NumDeadInst; + Inst->eraseFromParent(); + } + return NumDeadInst; +} + void llvm::changeToUnreachable(Instruction *I, bool UseLLVMTrap) { BasicBlock *BB = I->getParent(); // Loop over all of the successors, removing BB's entry from any PHI |