[llvm] r295300 - [ARM] GlobalISel: Legalize 64-bit G_FADD and G_LOAD

Diana Picus via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 17 06:15:36 PST 2017


r295439.

Diana

On 17 February 2017 at 10:52, Diana Picus <diana.picus at linaro.org> wrote:
> Hi,
>
> That's right, it should be illegal if we don't have the VFP extension,
> that's pretty much what I meant. Now that you mention it, I think I'll
> add that check here already instead of procrastinating.
>
> The idea was that since I'm only supporting a subset of things in the
> instruction selector, I prefer to check the predicates for each
> instruction there and bail out if they're not satisfied. For instance,
> I only added support for VADDS, and I check in the instruction
> selection that both VFP is enabled and that we don't use NEON for
> single precision FP. I thought that if I moved all the checks to the
> legalizer, it would be less clear where they come from, but then again
> nothing's stopping us from moving just some of the checks to the
> legalizer, where they'll have to be in the end anyway. So, bad plan :)
> I'll fix it.
>
> Thanks,
> Diana
>
>
> On 17 February 2017 at 02:29, Quentin Colombet <qcolombet at apple.com> wrote:
>> Hi Diana,
>>
>>
>>> On Feb 16, 2017, at 1:09 AM, Diana Picus via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>>
>>> Author: rovka
>>> Date: Thu Feb 16 03:09:49 2017
>>> New Revision: 295300
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=295300&view=rev
>>> Log:
>>> [ARM] GlobalISel: Legalize 64-bit G_FADD and G_LOAD
>>>
>>> For now we just mark them as legal all the time and let the other passes bail
>>> out if they can't handle it. In the future, we'll want to move more of the
>>> brains into the legalizer.
>>>
>>> Modified:
>>>    llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp
>>>    llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalizer.mir
>>>
>>> Modified: llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp?rev=295300&r1=295299&r2=295300&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp (original)
>>> +++ llvm/trunk/lib/Target/ARM/ARMLegalizerInfo.cpp Thu Feb 16 03:09:49 2017
>>> @@ -32,6 +32,7 @@ ARMLegalizerInfo::ARMLegalizerInfo() {
>>>   const LLT s8 = LLT::scalar(8);
>>>   const LLT s16 = LLT::scalar(16);
>>>   const LLT s32 = LLT::scalar(32);
>>> +  const LLT s64 = LLT::scalar(64);
>>>
>>>   setAction({G_FRAME_INDEX, p0}, Legal);
>>>
>>> @@ -39,6 +40,11 @@ ARMLegalizerInfo::ARMLegalizerInfo() {
>>>     setAction({G_LOAD, Ty}, Legal);
>>>   setAction({G_LOAD, 1, p0}, Legal);
>>>
>>> +  // FIXME: This is strictly for loading double-precision floating point values,
>>> +  // if the hardware allows it. We rely on the instruction selector to complain
>>> +  // otherwise.
>>
>> I’m kind of puzzled by this fixme. If you can load 64-bit value, why would you care about marking this illegal?
>>
>> My understanding is that this should be illegal only because of alignment constraint not match on the load or the absence of VFP (or whatever :)) extension.
>>
>> What is your plan when you say “rely on instruction selector to complain”?
>>
>> Cheers,
>> -Quentin
>>
>>> +  setAction({G_LOAD, s64}, Legal);
>>> +
>>>   for (auto Ty : {s1, s8, s16, s32})
>>>     setAction({G_ADD, Ty}, Legal);
>>>
>>> @@ -51,6 +57,7 @@ ARMLegalizerInfo::ARMLegalizerInfo() {
>>>   // FIXME: This is a bit sloppy, but for now we'll just rely on the instruction
>>>   // selector to complain if it doesn't support floating point.
>>>   setAction({G_FADD, s32}, Legal);
>>> +  setAction({G_FADD, s64}, Legal);
>>>
>>>   computeTables();
>>> }
>>>
>>> Modified: llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalizer.mir
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalizer.mir?rev=295300&r1=295299&r2=295300&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalizer.mir (original)
>>> +++ llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-legalizer.mir Thu Feb 16 03:09:49 2017
>>> @@ -11,6 +11,7 @@
>>>   define void @test_legal_loads() { ret void }
>>>
>>>   define void @test_fadd_s32() { ret void }
>>> +  define void @test_fadd_s64() { ret void }
>>> ...
>>> ---
>>> name:            test_sext_s8
>>> @@ -174,11 +175,13 @@ registers:
>>>   - { id: 3, class: _ }
>>>   - { id: 4, class: _ }
>>>   - { id: 5, class: _ }
>>> +  - { id: 6, class: _ }
>>> body:             |
>>>   bb.0:
>>>     liveins: %r0, %r1, %r2, %r3
>>>
>>>     ; These are all legal, so we should find them unchanged in the output
>>> +    ; CHECK-DAG: {{%[0-9]+}}(s64) = G_LOAD %0
>>>     ; CHECK-DAG: {{%[0-9]+}}(s32) = G_LOAD %0
>>>     ; CHECK-DAG: {{%[0-9]+}}(s16) = G_LOAD %0
>>>     ; CHECK-DAG: {{%[0-9]+}}(s8) = G_LOAD %0
>>> @@ -190,6 +193,7 @@ body:             |
>>>     %3(s8)  = G_LOAD %0(p0)
>>>     %4(s1)  = G_LOAD %0(p0)
>>>     %5(p0)  = G_LOAD %0(p0)
>>> +    %6(s64) = G_LOAD %0(p0)
>>>     BX_RET 14, _
>>> ...
>>> ---
>>> @@ -217,3 +221,28 @@ body:             |
>>>     BX_RET 14, _, implicit %r0
>>>
>>> ...
>>> +---
>>> +name:            test_fadd_s64
>>> +# CHECK-LABEL: name: test_fadd_s64
>>> +legalized:       false
>>> +# CHECK: legalized: true
>>> +regBankSelected: false
>>> +selected:        false
>>> +tracksRegLiveness: true
>>> +registers:
>>> +  - { id: 0, class: _ }
>>> +  - { id: 1, class: _ }
>>> +  - { id: 2, class: _ }
>>> +body:             |
>>> +  bb.0:
>>> +    liveins: %d0, %d1
>>> +
>>> +    %0(s64) = COPY %d0
>>> +    %1(s64) = COPY %d1
>>> +    %2(s64) = G_FADD %0, %1
>>> +    ; G_FADD with s64 is legal, so we should find it unchanged in the output
>>> +    ; CHECK: {{%[0-9]+}}(s64) = G_FADD {{%[0-9]+, %[0-9]+}}
>>> +    %d0 = COPY %2(s64)
>>> +    BX_RET 14, _, implicit %d0
>>> +
>>> +...
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>


More information about the llvm-commits mailing list