[llvm-commits] [llvm] r63600 - in /llvm/trunk: lib/Transforms/Utils/InlineFunction.cpp test/Transforms/Inline/2009-02-02-InvokeUpdateCG.ll
Nick Lewycky
nicholas at mxc.ca
Mon Feb 2 20:34:42 PST 2009
Author: nicholas
Date: Mon Feb 2 22:34:40 2009
New Revision: 63600
URL: http://llvm.org/viewvc/llvm-project?rev=63600&view=rev
Log:
Update the callgraph when replacing InvokeInst with CallInst when inlining.
Added:
llvm/trunk/test/Transforms/Inline/2009-02-02-InvokeUpdateCG.ll
Modified:
llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=63600&r1=63599&r2=63600&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Mon Feb 2 22:34:40 2009
@@ -37,11 +37,12 @@
/// in the body of the inlined function into invokes and turn unwind
/// instructions into branches to the invoke unwind dest.
///
-/// II is the invoke instruction begin inlined. FirstNewBlock is the first
+/// II is the invoke instruction being inlined. FirstNewBlock is the first
/// block of the inlined code (the last block is the end of the function),
/// and InlineCodeInfo is information about the code that got inlined.
static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
- ClonedCodeInfo &InlinedCodeInfo) {
+ ClonedCodeInfo &InlinedCodeInfo,
+ CallGraph *CG) {
BasicBlock *InvokeDest = II->getUnwindDest();
std::vector<Value*> InvokeDestPHIValues;
@@ -93,6 +94,10 @@
// Make sure that anything using the call now uses the invoke!
CI->replaceAllUsesWith(II);
+ // Update the callgraph.
+ if (CG)
+ (*CG)[Caller]->replaceCallSite(CI, II);
+
// Delete the unconditional branch inserted by splitBasicBlock
BB->getInstList().pop_back();
Split->getInstList().pop_front(); // Delete the original call
@@ -433,7 +438,7 @@
// any inlined 'unwind' instructions into branches to the invoke exception
// destination, and call instructions into invoke instructions.
if (InvokeInst *II = dyn_cast<InvokeInst>(TheCall))
- HandleInlinedInvoke(II, FirstNewBlock, InlinedFunctionInfo);
+ HandleInlinedInvoke(II, FirstNewBlock, InlinedFunctionInfo, CG);
// If we cloned in _exactly one_ basic block, and if that block ends in a
// return instruction, we splice the body of the inlined callee directly into
Added: llvm/trunk/test/Transforms/Inline/2009-02-02-InvokeUpdateCG.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/2009-02-02-InvokeUpdateCG.ll?rev=63600&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/Inline/2009-02-02-InvokeUpdateCG.ll (added)
+++ llvm/trunk/test/Transforms/Inline/2009-02-02-InvokeUpdateCG.ll Mon Feb 2 22:34:40 2009
@@ -0,0 +1,32 @@
+; RUN: llvm-as < %s | opt -inline -prune-eh
+; PR3367
+
+define void @f2() {
+ invoke void @f6()
+ to label %ok1 unwind label %lpad1
+
+ok1:
+ ret void
+
+lpad1:
+ invoke void @f4()
+ to label %ok2 unwind label %lpad2
+
+ok2:
+ call void @f8()
+ unreachable
+
+lpad2:
+ unreachable
+}
+
+declare void @f3()
+
+define void @f4() {
+ call void @f3()
+ ret void
+}
+
+declare void @f6() nounwind
+
+declare void @f8()
More information about the llvm-commits
mailing list