diff options
author | Duncan Sands <baldrick@free.fr> | 2009-05-06 06:49:50 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2009-05-06 06:49:50 +0000 |
commit | 1efabaaa2ad2a90bb2fe7f79461353b5f1ea63e8 (patch) | |
tree | 719834c43dbeab5fa7413c1e2a259167fc6307b0 /llvm/lib/Transforms/Utils | |
parent | 51f57a419581f772fb06e4c27128e702373177d9 (diff) | |
download | bcm5719-llvm-1efabaaa2ad2a90bb2fe7f79461353b5f1ea63e8.tar.gz bcm5719-llvm-1efabaaa2ad2a90bb2fe7f79461353b5f1ea63e8.zip |
Allow readonly functions to unwind exceptions. Teach
the optimizers about this. For example, a readonly
function with no uses cannot be removed unless it is
also marked nounwind.
llvm-svn: 71071
Diffstat (limited to 'llvm/lib/Transforms/Utils')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index fea739cb46b..4f2bb1e3de7 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -164,17 +164,15 @@ bool llvm::isInstructionTriviallyDead(Instruction *I) { // We don't want debug info removed by anything this general. if (isa<DbgInfoIntrinsic>(I)) return false; - - if (!I->mayWriteToMemory()) - return true; - // Special case intrinsics that "may write to memory" but can be deleted when - // dead. + if (!I->mayHaveSideEffects()) return true; + + // Special case intrinsics that "may have side effects" but can be deleted + // when dead. if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) // Safe to delete llvm.stacksave if dead. if (II->getIntrinsicID() == Intrinsic::stacksave) return true; - return false; } @@ -230,7 +228,7 @@ llvm::RecursivelyDeleteDeadPHINode(PHINode *PN) { SmallPtrSet<PHINode *, 4> PHIs; PHIs.insert(PN); for (Instruction *J = cast<Instruction>(*PN->use_begin()); - J->hasOneUse() && !J->mayWriteToMemory(); + J->hasOneUse() && !J->mayHaveSideEffects(); J = cast<Instruction>(*J->use_begin())) // If we find a PHI more than once, we're on a cycle that // won't prove fruitful. |