From: Evan Cheng Date: Tue, 10 Mar 2009 07:57:50 +0000 (+0000) Subject: If a function is marked alwaysinline, it must be inlined (possibly for correctness... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8c7848f17f2eff731c9f46e286fdd337a5c7e642;p=oota-llvm.git 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 --- diff --git a/lib/Transforms/Utils/InlineCost.cpp b/lib/Transforms/Utils/InlineCost.cpp index 209ba927181..ce8b542bdf4 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 00000000000..933925e5025 --- /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 +}