From: Chris Lattner Date: Wed, 13 May 2009 17:39:14 +0000 (+0000) Subject: calls in nothrow functions can be marked nothrow even if the callee X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=aab6ec49d24e8ecec766cf90954a3a58c64bf7c4;p=oota-llvm.git calls in nothrow functions can be marked nothrow even if the callee is not known to be nothrow. This allows readnone/readonly functions to be deleted even if we don't know whether the callee can throw. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71676 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index c76403e0390..527ed430106 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -9578,6 +9578,16 @@ Instruction *InstCombiner::SimplifyMemSet(MemSetInst *MI) { /// the heavy lifting. /// Instruction *InstCombiner::visitCallInst(CallInst &CI) { + // If the caller function is nounwind, mark the call as nounwind, even if the + // callee isn't. + if (CI.getParent()->getParent()->doesNotThrow() && + !CI.doesNotThrow()) { + CI.setDoesNotThrow(); + return &CI; + } + + + IntrinsicInst *II = dyn_cast(&CI); if (!II) return visitCallSite(&CI); diff --git a/test/Transforms/InstCombine/nothrow.ll b/test/Transforms/InstCombine/nothrow.ll new file mode 100644 index 00000000000..fbf162a1db8 --- /dev/null +++ b/test/Transforms/InstCombine/nothrow.ll @@ -0,0 +1,8 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep call +; rdar://6880732 +declare double @t1(i32) readonly + +define void @t2() nounwind { + call double @t1(i32 42) ;; dead call even though callee is not nothrow. + ret void +}