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/Utils | |
| 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/Utils')
| -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;          } | 

