[llvm] r295309 - [ARM] GlobalISel: Select double G_FADD and copies
Quentin Colombet via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 16 17:34:34 PST 2017
Hi Diana,
Out of curiosity, what is missing in the current TableGen support to just pick up those patterns?
For copies I guess we don’t have anything, but for ADDs I would have expected the existing patterns, at least some, to be generated.
Thanks,
-Quentin
> On Feb 16, 2017, at 4:19 AM, Diana Picus via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> Author: rovka
> Date: Thu Feb 16 06:19:52 2017
> New Revision: 295309
>
> URL: http://llvm.org/viewvc/llvm-project?rev=295309&view=rev
> Log:
> [ARM] GlobalISel: Select double G_FADD and copies
>
> Just use VADDD if available, bail out if not.
>
> Modified:
> llvm/trunk/lib/Target/ARM/ARMInstructionSelector.cpp
> llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-instruction-select.mir
>
> Modified: llvm/trunk/lib/Target/ARM/ARMInstructionSelector.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstructionSelector.cpp?rev=295309&r1=295308&r2=295309&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMInstructionSelector.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMInstructionSelector.cpp Thu Feb 16 06:19:52 2017
> @@ -61,8 +61,12 @@ static bool selectCopy(MachineInstr &I,
> const TargetRegisterClass *RC = &ARM::GPRRegClass;
>
> if (RegBank->getID() == ARM::FPRRegBankID) {
> - assert(DstSize == 32 && "Only 32-bit FP values are supported");
> - RC = &ARM::SPRRegClass;
> + if (DstSize == 32)
> + RC = &ARM::SPRRegClass;
> + else if (DstSize == 64)
> + RC = &ARM::DPRRegClass;
> + else
> + llvm_unreachable("Unsupported destination size");
> }
>
> // No need to constrain SrcReg. It will get constrained when
> @@ -76,6 +80,28 @@ static bool selectCopy(MachineInstr &I,
> return true;
> }
>
> +static bool selectFAdd(MachineInstrBuilder &MIB, const ARMBaseInstrInfo &TII,
> + MachineRegisterInfo &MRI) {
> + assert(TII.getSubtarget().hasVFP2() && "Can't select fp add without vfp");
> +
> + LLT Ty = MRI.getType(MIB->getOperand(0).getReg());
> + unsigned ValSize = Ty.getSizeInBits();
> +
> + if (ValSize == 32) {
> + if (TII.getSubtarget().useNEONForSinglePrecisionFP())
> + return false;
> + MIB->setDesc(TII.get(ARM::VADDS));
> + } else {
> + assert(ValSize == 64 && "Unsupported size for floating point value");
> + if (TII.getSubtarget().isFPOnlySP())
> + return false;
> + MIB->setDesc(TII.get(ARM::VADDD));
> + }
> + MIB.add(predOps(ARMCC::AL));
> +
> + return true;
> +}
> +
> /// Select the opcode for simple extensions (that translate to a single SXT/UXT
> /// instruction). Extension operations more complicated than that should not
> /// invoke this.
> @@ -186,11 +212,8 @@ bool ARMInstructionSelector::select(Mach
> MIB.add(predOps(ARMCC::AL)).add(condCodeOp());
> break;
> case G_FADD:
> - if (!TII.getSubtarget().hasVFP2() ||
> - TII.getSubtarget().useNEONForSinglePrecisionFP())
> + if (!selectFAdd(MIB, TII, MRI))
> return false;
> - I.setDesc(TII.get(ARM::VADDS));
> - MIB.add(predOps(ARMCC::AL));
> break;
> case G_FRAME_INDEX:
> // Add 0 to the given frame index and hope it will eventually be folded into
>
> Modified: llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-instruction-select.mir
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-instruction-select.mir?rev=295309&r1=295308&r2=295309&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-instruction-select.mir (original)
> +++ llvm/trunk/test/CodeGen/ARM/GlobalISel/arm-instruction-select.mir Thu Feb 16 06:19:52 2017
> @@ -10,6 +10,7 @@
> define void @test_add_s32() { ret void }
>
> define void @test_fadd_s32() #0 { ret void }
> + define void @test_fadd_s64() #0 { ret void }
>
> define void @test_load_from_stack() { ret void }
>
> @@ -254,6 +255,39 @@ body: |
> ; CHECK: BX_RET 14, _, implicit %s0
> ...
> ---
> +name: test_fadd_s64
> +# CHECK-LABEL: name: test_fadd_s64
> +legalized: true
> +regBankSelected: true
> +selected: false
> +# CHECK: selected: true
> +registers:
> + - { id: 0, class: fprb }
> + - { id: 1, class: fprb }
> + - { id: 2, class: fprb }
> +# CHECK: id: 0, class: dpr
> +# CHECK: id: 1, class: dpr
> +# CHECK: id: 2, class: dpr
> +body: |
> + bb.0:
> + liveins: %d0, %d1
> +
> + %0(s64) = COPY %d0
> + ; CHECK: [[VREGX:%[0-9]+]] = COPY %d0
> +
> + %1(s64) = COPY %d1
> + ; CHECK: [[VREGY:%[0-9]+]] = COPY %d1
> +
> + %2(s64) = G_FADD %0, %1
> + ; CHECK: [[VREGSUM:%[0-9]+]] = VADDD [[VREGX]], [[VREGY]], 14, _
> +
> + %d0 = COPY %2(s64)
> + ; CHECK: %d0 = COPY [[VREGSUM]]
> +
> + BX_RET 14, _, implicit %d0
> + ; CHECK: BX_RET 14, _, implicit %d0
> +...
> +---
> name: test_load_from_stack
> # CHECK-LABEL: name: test_load_from_stack
> legalized: true
>
>
> _______________________________________________
> 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