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 | 283ffdfac589baf3dd9c29c90d73df8211cac9d4 (patch) | |
tree | 2b32889720977ad4e31370c4dc971fde2e4a04af /llvm/lib/Transforms | |
parent | 7db49ce5b4a783059b304fa1ea436e143644bfce (diff) | |
download | bcm5719-llvm-283ffdfac589baf3dd9c29c90d73df8211cac9d4.tar.gz bcm5719-llvm-283ffdfac589baf3dd9c29c90d73df8211cac9d4.zip |
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!
llvm-svn: 11384
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 3c886596983..1b7ae72a5eb 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/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; } |