[llvm] r217144 - Enable noalias metadata by default and swap the order of the SLP and Loop vectorizers by default.

James Molloy James.Molloy at arm.com
Thu Sep 11 08:08:11 PDT 2014


Hi Louis,

I’ve spent some time debugging this - looping Arnold in too because it
involves the SLP vectorizer, and Quentin because it involves cross-class
copies in the backend.

The change itself is fairly innocuous. It does however permute IR which
seemingly means that now, the SLP vectorizer decides to have a go at
vectorizing right in the middle of the hottest function, quantum_toffoli.

It ends up putting cross-class “vmov”s right in the middle of the loop.
They’re invariant, and it’s obviously a terrible idea. AArch64 is not
affected because:
  (a) it has a better cost model for arithmetic instructions, that allows
  (b) the loop vectorizer to have a crack at unrolling by 4x, because
  (c) there are more scalar registers available on A64.

Incidentally as part of this I’ve just discovered that libquantum is 50%
slower on A32 than A64! :/

The answer is to fix the SLP vectorizer, but I don’t quite know where it
needs fixing. Below is the code it is producing:

@ BB#4:                                 @ %.lr.ph
        vmov.32 d16[0], r7     /// Costly
        adr     r1, .LCPI1_0
        mov     r2, #1
        sub     r7, r5, #32
        vld1.64 {d18, d19}, [r1:128]
        rsb     r1, r5, #32
        vmov.32 d16[1], r6     /// Costly
        lsr     lr, r2, r1
        ldr     r3, [r8, #12]
        cmp     r7, #0
        lslge   lr, r2, r7
        lsl     r12, r2, r5
        vmovl.u32       q8, d16
        add     r3, r3, #8
        mov     r7, #0
        vshl.u64        q8, q9, q8
.LBB1_5:                                @ =>This Inner Loop Header: Depth=1
        vmov.32 r4, d17[1]     /// Very costly
        vmov.32 r2, d16[1]     /// Very costly
        ldr     r6, [r3]
        ldr     r5, [r3, #4]
        orr     r2, r2, r4
        vmov.32 r4, d17[0]     /// Very costly
        vmov.32 r1, d16[0]     /// Very costly
        bic     r2, r2, r5
        orr     r1, r1, r4
        bic     r1, r1, r6
        orrs    r1, r1, r2
        bne     .LBB1_7
…


I suppose the question here is, is this the SLP vectorizer’s fault? it’s
obviously producing cross-class moves, but these could be moved out of the
loop at the cost of increasing register pressure. So I suspect there are
two problems:

  (1) SLP vectorizer doesn’t know that cross-class copies are costly. How
do we fix this? Where’s the hook to attach a penalty to an inserted
“extractelement”?
  (2) The backend doesn’t know that cross-class copies are costly, and
that spills would be better (if we increased reg pressure enough to
spill). How do we fix this? I know Quentin has done a bunch of work on
cross-class copies - is there a hook missing for A32?

Cheers,

James

On 11/09/2014 08:20, "James Molloy" <James.Molloy at arm.com> wrote:

>Hi Louis,
>
>That’s interesting. We certainly haven’t seen that kind of regression on
>any benchmark, at least not on AArch64. I’m surprised it’s affecting ARM
>more than AArch64 as this is a pure midend commit.
>
>I have been narrowing down a regression caused by this commit of about 3%
>in namd, which I think I’ve solved now. I’ll try and reproduce this on
>AArch32 today and get to the bottom of it.
>
>Cheers,
>
>James
>
>On 10/09/2014 23:32, "Louis Gerbarg" <lgg at apple.com> wrote:
>
>>This patch seems to be causing some performance regressions. In
>>particular, I am seeing 30-50% performance regressions for libquantum
>>targeting armv7 at -Os and -O3 across several different devices. Do you
>>see similar regressions? Any thoughts?
>>
>>Thanks,
>>Louis
>>
>>> On Sep 4, 2014, at 6:23 AM, James Molloy <james.molloy at arm.com> wrote:
>>>
>>> Author: jamesm
>>> Date: Thu Sep  4 08:23:08 2014
>>> New Revision: 217144
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=217144&view=rev
>>> Log:
>>> Enable noalias metadata by default and swap the order of the SLP and
>>>Loop vectorizers by default.
>>>
>>> After some time maturing, hopefully the flags themselves will be
>>>removed.
>>>
>>> Modified:
>>>    llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
>>>    llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
>>>
>>> Modified: llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
>>> URL:
>>>http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PassMa
>>>n
>>>agerBuilder.cpp?rev=217144&r1=217143&r2=217144&view=diff
>>>
>>>========================================================================
>>>=
>>>=====
>>> --- llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp Thu Sep  4
>>>08:23:08 2014
>>> @@ -62,7 +62,7 @@ static cl::opt<bool> RunLoadCombine("com
>>>
>>> static cl::opt<bool>
>>> RunSLPAfterLoopVectorization("run-slp-after-loop-vectorization",
>>> -  cl::init(false), cl::Hidden,
>>> +  cl::init(true), cl::Hidden,
>>>   cl::desc("Run the SLP vectorizer (and BB vectorizer) after the Loop "
>>>            "vectorizer instead of before"));
>>>
>>>
>>> Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
>>> URL:
>>>http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Inli
>>>n
>>>eFunction.cpp?rev=217144&r1=217143&r2=217144&view=diff
>>>
>>>========================================================================
>>>=
>>>=====
>>> --- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Thu Sep  4
>>>08:23:08 2014
>>> @@ -42,7 +42,7 @@
>>> using namespace llvm;
>>>
>>> static cl::opt<bool>
>>> -EnableNoAliasConversion("enable-noalias-to-md-conversion",
>>>cl::init(false),
>>> +EnableNoAliasConversion("enable-noalias-to-md-conversion",
>>>cl::init(true),
>>>   cl::Hidden,
>>>   cl::desc("Convert noalias attributes to metadata during inlining."));
>>>
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>>
>>
>


-- IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium.  Thank you.

ARM Limited, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ, Registered in England & Wales, Company No:  2557590
ARM Holdings plc, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ, Registered in England & Wales, Company No:  2548782




More information about the llvm-commits mailing list