summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-13 16:47:35 +0000
committerChris Lattner <sabre@nondot.org>2004-02-13 16:47:35 +0000
commit494b6920b067ec663b28c644f151fe61ef8b4e71 (patch)
treea07b8ff22407792a4dfa2598f803251f5ae0ced2
parent0db085baecad690efa1f4afca32b191ae8d12663 (diff)
downloadllvm-494b6920b067ec663b28c644f151fe61ef8b4e71.tar.gz
llvm-494b6920b067ec663b28c644f151fe61ef8b4e71.tar.bz2
llvm-494b6920b067ec663b28c644f151fe61ef8b4e71.tar.xz
Fix compilation of 126.gcc: intrinsic functions cannot throw, so they are not
allowed in invoke instructions. Thus, if we are inlining a call to an intrinsic function into an invoke site, we don't need to turn the call into an invoke! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11384 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Utils/InlineFunction.cpp61
1 files changed, 33 insertions, 28 deletions
diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp
index 3c88659698..1b7ae72a5e 100644
--- a/lib/Transforms/Utils/InlineFunction.cpp
+++ b/lib/Transforms/Utils/InlineFunction.cpp
@@ -123,34 +123,39 @@ bool llvm::InlineFunction(CallSite CS) {
// We only need to check for function calls: inlined invoke instructions
// require no special handling...
if (CallInst *CI = dyn_cast<CallInst>(I)) {
- // Convert this function call into an invoke instruction...
-
- // First, split the basic block...
- BasicBlock *Split = BB->splitBasicBlock(CI, CI->getName()+".noexc");
-
- // Next, create the new invoke instruction, inserting it at the end
- // of the old basic block.
- InvokeInst *II =
- new InvokeInst(CI->getCalledValue(), Split, InvokeDest,
- std::vector<Value*>(CI->op_begin()+1, CI->op_end()),
- CI->getName(), BB->getTerminator());
-
- // Make sure that anything using the call now uses the invoke!
- CI->replaceAllUsesWith(II);
-
- // Delete the unconditional branch inserted by splitBasicBlock
- BB->getInstList().pop_back();
- Split->getInstList().pop_front(); // Delete the original call
-
- // Update any PHI nodes in the exceptional block to indicate that
- // there is now a new entry in them.
- unsigned i = 0;
- for (BasicBlock::iterator I = InvokeDest->begin();
- PHINode *PN = dyn_cast<PHINode>(I); ++I, ++i)
- PN->addIncoming(InvokeDestPHIValues[i], BB);
-
- // This basic block is now complete, start scanning the next one.
- break;
+ // Convert this function call into an invoke instruction... if it's
+ // not an intrinsic function call (which are known to not throw).
+ if (CI->getCalledFunction() &&
+ CI->getCalledFunction()->getIntrinsicID()) {
+ ++I;
+ } else {
+ // First, split the basic block...
+ BasicBlock *Split = BB->splitBasicBlock(CI, CI->getName()+".noexc");
+
+ // Next, create the new invoke instruction, inserting it at the end
+ // of the old basic block.
+ InvokeInst *II =
+ new InvokeInst(CI->getCalledValue(), Split, InvokeDest,
+ std::vector<Value*>(CI->op_begin()+1, CI->op_end()),
+ CI->getName(), BB->getTerminator());
+
+ // Make sure that anything using the call now uses the invoke!
+ CI->replaceAllUsesWith(II);
+
+ // Delete the unconditional branch inserted by splitBasicBlock
+ BB->getInstList().pop_back();
+ Split->getInstList().pop_front(); // Delete the original call
+
+ // Update any PHI nodes in the exceptional block to indicate that
+ // there is now a new entry in them.
+ unsigned i = 0;
+ for (BasicBlock::iterator I = InvokeDest->begin();
+ PHINode *PN = dyn_cast<PHINode>(I); ++I, ++i)
+ PN->addIncoming(InvokeDestPHIValues[i], BB);
+
+ // This basic block is now complete, start scanning the next one.
+ break;
+ }
} else {
++I;
}