diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-03-10 07:57:50 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-03-10 07:57:50 +0000 |
commit | 8c7848f17f2eff731c9f46e286fdd337a5c7e642 (patch) | |
tree | f5f7148ba72736147f096054c7ad6cc49cf40e9e | |
parent | 3528e38fdf579685f32ebbea209359d91d4a4524 (diff) |
If a function is marked alwaysinline, it must be inlined (possibly for correctness). Do so even if the callee has dynamic alloca and the caller doesn't.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66539 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Utils/InlineCost.cpp | 14 | ||||
-rw-r--r-- | test/Transforms/Inline/always_inline_dyn_alloca.ll | 15 |
2 files changed, 22 insertions, 7 deletions
diff --git a/lib/Transforms/Utils/InlineCost.cpp b/lib/Transforms/Utils/InlineCost.cpp index 209ba92718..ce8b542bdf 100644 --- a/lib/Transforms/Utils/InlineCost.cpp +++ b/lib/Transforms/Utils/InlineCost.cpp @@ -224,6 +224,13 @@ InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS, if (CalleeFI.NeverInline) return InlineCost::getNever(); + // FIXME: It would be nice to kill off CalleeFI.NeverInline. Then we + // could move this up and avoid computing the FunctionInfo for + // things we are going to just return always inline for. This + // requires handling setjmp somewhere else, however. + if (!Callee->isDeclaration() && Callee->hasFnAttr(Attribute::AlwaysInline)) + return InlineCost::getAlways(); + if (CalleeFI.usesDynamicAlloca) { // Get infomation about the caller... FunctionInfo &CallerFI = CachedFunctionInfo[Caller]; @@ -239,13 +246,6 @@ InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS, return InlineCost::getNever(); } - // FIXME: It would be nice to kill off CalleeFI.NeverInline. Then we - // could move this up and avoid computing the FunctionInfo for - // things we are going to just return always inline for. This - // requires handling setjmp somewhere else, however. - if (!Callee->isDeclaration() && Callee->hasFnAttr(Attribute::AlwaysInline)) - return InlineCost::getAlways(); - // Add to the inline quality for properties that make the call valuable to // inline. This includes factors that indicate that the result of inlining // the function will be optimizable. Currently this just looks at arguments diff --git a/test/Transforms/Inline/always_inline_dyn_alloca.ll b/test/Transforms/Inline/always_inline_dyn_alloca.ll new file mode 100644 index 0000000000..933925e502 --- /dev/null +++ b/test/Transforms/Inline/always_inline_dyn_alloca.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | opt -inline | llvm-dis | not grep callee +; rdar://6655932 + +; If callee is marked alwaysinline, inline it! Even if callee has dynamic +; alloca and caller does not, + +define internal void @callee(i32 %N) alwaysinline { + %P = alloca i32, i32 %N + ret void +} + +define void @foo(i32 %N) { + call void @callee( i32 %N ) + ret void +} |