diff options
author | Chris Lattner <sabre@nondot.org> | 2004-02-13 16:47:35 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-02-13 16:47:35 +0000 |
commit | 494b6920b067ec663b28c644f151fe61ef8b4e71 (patch) | |
tree | a07b8ff22407792a4dfa2598f803251f5ae0ced2 /lib/Transforms/Utils/InlineFunction.cpp | |
parent | 0db085baecad690efa1f4afca32b191ae8d12663 (diff) |
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
Diffstat (limited to 'lib/Transforms/Utils/InlineFunction.cpp')
-rw-r--r-- | lib/Transforms/Utils/InlineFunction.cpp | 61 |
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; } |