patch for functions with indirect calls and always_inline attribute
Eric Christopher
echristo at gmail.com
Mon Apr 14 16:11:06 PDT 2014
On Mon, Apr 14, 2014 at 4:09 PM, Gerolf Hoflehner <ghoflehner at apple.com> wrote:
> Please see below.
>
> On Apr 14, 2014, at 2:56 PM, Eric Christopher <echristo at gmail.com> wrote:
>
>> I could be down for this...
>>
>> Do you have any numbers?
> No. I ran into this when creating a test case for another bug fix.
OK, would you mind running some performance numbers on this? It passes
my sniff test as well, but I'd like to not be wrong :)
If the numbers come out neutral/ahead/no change feel free to commit.
Thanks!
-eric
>>
>> Nits on the patch:
>>
>> // Disallow inlining of functions which contain an indirect branch.
>> - if (isa<IndirectBrInst>(BI->getTerminator()))
>> + if (isa<IndirectBrInst>(BI->getTerminator()) &&
>> + !F.hasFnAttribute(Attribute::AlwaysInline))
>>
>> Update the comment.
> Ok.
>> I'm assuming this can't be hoisted because of the
>> returns_twice aspect yes?
>
> Yes, for now I only wanted to address indirect branches and leave
> remaining checks as they are.
>
>>
>> -define i32 @inner5(i8* %addr) alwaysinline {
>> +define i32 @inner5(i8* %addr) {
>>
>> Why the change?
> This is to keep the old test behavior which relied on *not* inlining inner5 because of an indirect branch.
>>
>> -eric
>>
>> On Mon, Apr 14, 2014 at 2:49 PM, Gerolf Hoflehner <ghoflehner at apple.com> wrote:
>>> Hi
>>>
>>> llvm currently does not inline functions with indirect branches. We had some
>>> internal discussion and think the always_inline attribute should overrule
>>> that restriction.
>>>
>>> Gerolf
>>>
>>>
>>>
>>>
>>>
>>> Index: lib/Analysis/IPA/InlineCost.cpp
>>> ===================================================================
>>> --- lib/Analysis/IPA/InlineCost.cpp (revision 206204)
>>> +++ lib/Analysis/IPA/InlineCost.cpp (working copy)
>>> @@ -1301,7 +1301,8 @@
>>> Attribute::ReturnsTwice);
>>> for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; ++BI) {
>>> // Disallow inlining of functions which contain an indirect branch.
>>> - if (isa<IndirectBrInst>(BI->getTerminator()))
>>> + if (isa<IndirectBrInst>(BI->getTerminator()) &&
>>> + !F.hasFnAttribute(Attribute::AlwaysInline))
>>> return false;
>>>
>>>
>>>
>>> for (BasicBlock::iterator II = BI->begin(), IE = BI->end(); II != IE;
>>> Index: test/Transforms/Inline/always-inline-attribute.ll
>>> ===================================================================
>>> --- test/Transforms/Inline/always-inline-attribute.ll (revision 0)
>>> +++ test/Transforms/Inline/always-inline-attribute.ll (working copy)
>>> @@ -0,0 +1,26 @@
>>> +; RUN: opt < %s -O3 -S | FileCheck %s
>>> + at gv = external global i32
>>> +
>>> +define i32 @main() nounwind {
>>> +; CHECK-NOT: call i32 @foo
>>> + %1 = load i32* @gv, align 4
>>> + %2 = tail call i32 @foo(i32 %1)
>>> + unreachable
>>> +}
>>> +
>>> +define internal i32 @foo(i32) alwaysinline {
>>> + br label %2
>>> +
>>> +; <label>:2 ; preds = %8, %1
>>> + %3 = phi i32 [ %0, %1 ], [ %10, %8 ]
>>> + %4 = phi i8* [ blockaddress(@foo, %2), %1 ], [ %6, %8 ]
>>> + %5 = icmp eq i32 %3, 1
>>> + %6 = select i1 %5, i8* blockaddress(@foo, %8), i8* %4
>>> + %7 = add nsw i32 %3, -1
>>> + br label %8
>>> +
>>> +; <label>:8 ; preds = %8, %2
>>> + %9 = phi i32 [ %7, %2 ], [ %10, %8 ]
>>> + %10 = add nsw i32 %9, -1
>>> + indirectbr i8* %6, [label %2, label %8]
>>> +}
>>> Index: test/Transforms/Inline/always-inline.ll
>>> ===================================================================
>>> --- test/Transforms/Inline/always-inline.ll (revision 206203)
>>> +++ test/Transforms/Inline/always-inline.ll (working copy)
>>> @@ -78,7 +78,7 @@
>>> ret i32 %add
>>> }
>>>
>>>
>>>
>>> -define i32 @inner5(i8* %addr) alwaysinline {
>>> +define i32 @inner5(i8* %addr) {
>>> entry:
>>> indirectbr i8* %addr, [ label %one, label %two ]
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>
More information about the llvm-commits
mailing list