Check the alwaysinline attribute on the call as well as on the caller.

Differential Revision: http://reviews.llvm.org/D3815

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209150 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Peter Collingbourne 2014-05-19 18:25:54 +00:00
parent 234227f375
commit 20a6a27bea
3 changed files with 13 additions and 3 deletions

View File

@ -1259,7 +1259,7 @@ InlineCost InlineCostAnalysis::getInlineCost(CallSite CS, Function *Callee,
// Calls to functions with always-inline attributes should be inlined
// whenever possible.
if (Callee->hasFnAttribute(Attribute::AlwaysInline)) {
if (CS.hasFnAttr(Attribute::AlwaysInline)) {
if (isInlineViable(*Callee))
return llvm::InlineCost::getAlways();
return llvm::InlineCost::getNever();

View File

@ -95,8 +95,7 @@ InlineCost AlwaysInliner::getInlineCost(CallSite CS) {
// that are viable for inlining. FIXME: We shouldn't even get here for
// declarations.
if (Callee && !Callee->isDeclaration() &&
Callee->getAttributes().hasAttribute(AttributeSet::FunctionIndex,
Attribute::AlwaysInline) &&
CS.hasFnAttr(Attribute::AlwaysInline) &&
ICA->isInlineViable(*Callee))
return InlineCost::getAlways();

View File

@ -122,3 +122,14 @@ entry:
ret void
}
define i32 @inner7() {
ret i32 1
}
define i32 @outer7() {
; CHECK-LABEL: @outer7(
; CHECK-NOT: call
; CHECK: ret
%r = call i32 @inner7() alwaysinline
ret i32 %r
}