diff options
author | Chris Lattner <sabre@nondot.org> | 2009-10-17 05:39:39 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-10-17 05:39:39 +0000 |
commit | 8a5b9f815bc8bcbac451d4d6e9c4f23fc2376683 (patch) | |
tree | fe9b1eae457d127c217791d9efd7392636810cda | |
parent | 14bff688ddb01a7b6c8dee87934d4535b27e71c0 (diff) | |
download | external_llvm-8a5b9f815bc8bcbac451d4d6e9c4f23fc2376683.zip external_llvm-8a5b9f815bc8bcbac451d4d6e9c4f23fc2376683.tar.gz external_llvm-8a5b9f815bc8bcbac451d4d6e9c4f23fc2376683.tar.bz2 |
Simplify some code (first hunk) and fix PR5208 (second hunk) by
updating the callgraph when introducing a call.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84310 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Utils/InlineFunction.cpp | 14 | ||||
-rw-r--r-- | test/Transforms/Inline/crash.ll | 33 |
2 files changed, 38 insertions, 9 deletions
diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp index 0d00d69..619c939 100644 --- a/lib/Transforms/Utils/InlineFunction.cpp +++ b/lib/Transforms/Utils/InlineFunction.cpp @@ -444,18 +444,15 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD, if (InlinedFunctionInfo.ContainsDynamicAllocas) { Module *M = Caller->getParent(); // Get the two intrinsics we care about. - Constant *StackSave, *StackRestore; - StackSave = Intrinsic::getDeclaration(M, Intrinsic::stacksave); - StackRestore = Intrinsic::getDeclaration(M, Intrinsic::stackrestore); + Function *StackSave = Intrinsic::getDeclaration(M, Intrinsic::stacksave); + Function *StackRestore=Intrinsic::getDeclaration(M,Intrinsic::stackrestore); // If we are preserving the callgraph, add edges to the stacksave/restore // functions for the calls we insert. CallGraphNode *StackSaveCGN = 0, *StackRestoreCGN = 0, *CallerNode = 0; if (CG) { - // We know that StackSave/StackRestore are Function*'s, because they are - // intrinsics which must have the right types. - StackSaveCGN = CG->getOrInsertFunction(cast<Function>(StackSave)); - StackRestoreCGN = CG->getOrInsertFunction(cast<Function>(StackRestore)); + StackSaveCGN = CG->getOrInsertFunction(StackSave); + StackRestoreCGN = CG->getOrInsertFunction(StackRestore); CallerNode = (*CG)[Caller]; } @@ -480,7 +477,8 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD, for (Function::iterator BB = FirstNewBlock, E = Caller->end(); BB != E; ++BB) if (UnwindInst *UI = dyn_cast<UnwindInst>(BB->getTerminator())) { - CallInst::Create(StackRestore, SavedPtr, "", UI); + CallInst *CI = CallInst::Create(StackRestore, SavedPtr, "", UI); + if (CG) CallerNode->addCalledFunction(CI, StackRestoreCGN); ++NumStackRestores; } } diff --git a/test/Transforms/Inline/crash.ll b/test/Transforms/Inline/crash.ll index 30eae7a..f34b44c 100644 --- a/test/Transforms/Inline/crash.ll +++ b/test/Transforms/Inline/crash.ll @@ -51,7 +51,38 @@ entry: unreachable } +declare fastcc void @list_Rplacd1284() nounwind ssp -declare fastcc void @list_Rplacd1284() nounwind ssp + +;============================ +; PR5208 + +define void @AAA() { +entry: + %A = alloca i8, i32 undef, align 1 + invoke fastcc void @XXX() + to label %invcont98 unwind label %lpad156 + +invcont98: + unreachable + +lpad156: + unreachable +} + +declare fastcc void @YYY() + +define internal fastcc void @XXX() { +entry: + %B = alloca i8, i32 undef, align 1 + invoke fastcc void @YYY() + to label %bb260 unwind label %lpad + +bb260: + ret void + +lpad: + unwind +} |