[llvm] r295306 - [ARM] GlobalISel: Add reg bank mappings for G_SEQUENCE and G_EXTRACT

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


I added some checks in r295441, I hope that addresses your concerns.
Please let me know if it doesn't :)

Thanks,
Diana

On 17 February 2017 at 10:34, Diana Picus <diana.picus at linaro.org> wrote:
> On 17 February 2017 at 02:31, Quentin Colombet <qcolombet at apple.com> wrote:
>> Hi Diana,
>>
>>> On Feb 16, 2017, at 3:00 AM, Diana Picus via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>>
>>> Author: rovka
>>> Date: Thu Feb 16 05:00:31 2017
>>> New Revision: 295306
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=295306&view=rev
>>> Log:
>>> [ARM] GlobalISel: Add reg bank mappings for G_SEQUENCE and G_EXTRACT
>>>
>>> Support G_SEQUENCE and G_EXTRACT as needed for passing double precision floating
>>> point values in the soft-fp float mode.
>>>
>>> Modified:
>>>    llvm/trunk/lib/Target/ARM/ARMRegisterBankInfo.cpp
>>>    llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-regbankselect.mir
>>>
>>> Modified: llvm/trunk/lib/Target/ARM/ARMRegisterBankInfo.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMRegisterBankInfo.cpp?rev=295306&r1=295305&r2=295306&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/Target/ARM/ARMRegisterBankInfo.cpp (original)
>>> +++ llvm/trunk/lib/Target/ARM/ARMRegisterBankInfo.cpp Thu Feb 16 05:00:31 2017
>>> @@ -143,6 +143,32 @@ ARMRegisterBankInfo::getInstrMapping(con
>>>   case G_FRAME_INDEX:
>>>     OperandsMapping = getOperandsMapping({&ARM::ValueMappings[0], nullptr});
>>>     break;
>>> +  case G_SEQUENCE: {
>>> +    // We only support G_SEQUENCE for creating a double precision floating point
>>> +    // value out of two GPRs.
>>> +    LLT Ty1 = MRI.getType(MI.getOperand(1).getReg());
>>> +    LLT Ty2 = MRI.getType(MI.getOperand(3).getReg());
>>> +    if (Ty.getSizeInBits() != 64 || Ty1.getSizeInBits() != 32 ||
>>> +        Ty2.getSizeInBits() != 32)
>>> +      return InstructionMapping{};
>>> +    OperandsMapping =
>>> +        getOperandsMapping({&ARM::ValueMappings[6], &ARM::ValueMappings[0],
>>> +                            nullptr, &ARM::ValueMappings[0], nullptr});
>>
>> Could you use enum or some other sort of constant instead of hardcoded numbers for the indices of the ValueMappings?
>
> Sure, I'll look into it, thanks for suggesting!
>
>>
>> Otherwise I am afraid we might silently great that when the mapping gets generated by tablegen.
>>
>> Cheers,
>> -Quentin
>>
>>> +    break;
>>> +  }
>>> +  case G_EXTRACT: {
>>> +    // We only support G_EXTRACT for splitting a double precision floating point
>>> +    // value into two GPRs.
>>> +    LLT Ty1 = MRI.getType(MI.getOperand(1).getReg());
>>> +    LLT Ty2 = MRI.getType(MI.getOperand(2).getReg());
>>> +    if (Ty.getSizeInBits() != 32 || Ty1.getSizeInBits() != 32 ||
>>> +        Ty2.getSizeInBits() != 64)
>>> +      return InstructionMapping{};
>>> +    OperandsMapping =
>>> +        getOperandsMapping({&ARM::ValueMappings[0], &ARM::ValueMappings[0],
>>> +                            &ARM::ValueMappings[6], nullptr, nullptr});
>>> +    break;
>>> +  }
>>>   default:
>>>     return InstructionMapping{};
>>>   }
>>>
>>> Modified: llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-regbankselect.mir
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-regbankselect.mir?rev=295306&r1=295305&r2=295306&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-regbankselect.mir (original)
>>> +++ llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-regbankselect.mir Thu Feb 16 05:00:31 2017
>>> @@ -9,6 +9,8 @@
>>>
>>>   define void @test_fadd_s32() { ret void }
>>>   define void @test_fadd_s64() { ret void }
>>> +
>>> +  define void @test_soft_fp_s64() { ret void }
>>> ...
>>> ---
>>> name:            test_add_s32
>>> @@ -202,5 +204,35 @@ body:             |
>>>     BX_RET 14, _, implicit %d0
>>>
>>> ...
>>> +---
>>> +name:            test_soft_fp_s64
>>> +# CHECK-LABEL: name: test_soft_fp_s64
>>> +legalized:       true
>>> +regBankSelected: false
>>> +selected:        false
>>> +# CHECK: registers:
>>> +# CHECK: - { id: 0, class: gprb }
>>> +# CHECK: - { id: 1, class: gprb }
>>> +# CHECK: - { id: 2, class: fprb }
>>> +# CHECK: - { id: 3, class: gprb }
>>> +# CHECK: - { id: 4, class: gprb }
>>> +
>>> +registers:
>>> +  - { id: 0, class: _ }
>>> +  - { id: 1, class: _ }
>>> +  - { id: 2, class: _ }
>>> +  - { id: 3, class: _ }
>>> +  - { id: 4, class: _ }
>>> +body:             |
>>> +  bb.0:
>>> +    liveins: %r0, %r1
>>> +
>>> +    %0(s32) = COPY %r0
>>> +    %1(s32) = COPY %r1
>>> +    %2(s64) = G_SEQUENCE %0(s32), 0, %1(s32), 32
>>> +    %3(s32), %4(s32) = G_EXTRACT %2(s64), 0, 32
>>> +    %r0 = COPY %3(s32)
>>> +    %r1 = COPY %4(s32)
>>> +    BX_RET 14, _, implicit %r0, implicit %r1
>>>
>>> ...
>>>
>>>
>>> _______________________________________________
>>> 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