[llvm] r286183 - GlobalISel: constrain PHI registers on AArch64.
Quentin Colombet via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 10 14:37:15 PST 2016
Hi Tim,
Could we have this handled by the generic pass?
I expect all targets to encounter the same problem.
Cheers,
-Quentin
> On Nov 7, 2016, at 4:34 PM, Tim Northover via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> Author: tnorthover
> Date: Mon Nov 7 18:34:06 2016
> New Revision: 286183
>
> URL: http://llvm.org/viewvc/llvm-project?rev=286183&view=rev
> Log:
> GlobalISel: constrain PHI registers on AArch64.
>
> Self-referencing PHI nodes need their destination operands to be constrained
> because nothing else is likely to do so. For now we just pick a register class
> naively.
>
> Patch mostly by Ahmed again.
>
> Modified:
> llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp
> llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp?rev=286183&r1=286182&r2=286183&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64InstructionSelector.cpp Mon Nov 7 18:34:06 2016
> @@ -484,10 +484,40 @@ bool AArch64InstructionSelector::select(
>
> if (Opcode == TargetOpcode::LOAD_STACK_GUARD)
> return constrainSelectedInstRegOperands(I, TII, TRI, RBI);
> - else if (I.isCopy())
> +
> + if (Opcode == TargetOpcode::PHI) {
> + const unsigned DefReg = I.getOperand(0).getReg();
> + const LLT DefTy = MRI.getType(DefReg);
> +
> + const TargetRegisterClass *DefRC = nullptr;
> + if (TargetRegisterInfo::isPhysicalRegister(DefReg)) {
> + DefRC = TRI.getRegClass(DefReg);
> + } else {
> + const RegClassOrRegBank &RegClassOrBank =
> + MRI.getRegClassOrRegBank(DefReg);
> +
> + DefRC = RegClassOrBank.dyn_cast<const TargetRegisterClass *>();
> + if (!DefRC) {
> + if (!DefTy.isValid()) {
> + DEBUG(dbgs() << "PHI operand has no type, not a gvreg?\n");
> + return false;
> + }
> + const RegisterBank &RB = *RegClassOrBank.get<const RegisterBank *>();
> + DefRC = getRegClassForTypeOnBank(DefTy, RB, RBI);
> + if (!DefRC) {
> + DEBUG(dbgs() << "PHI operand has unexpected size/bank\n");
> + return false;
> + }
> + }
> + }
> +
> + return RBI.constrainGenericRegister(DefReg, *DefRC, MRI);
> + }
> +
> + if (I.isCopy())
> return selectCopy(I, TII, MRI, TRI, RBI);
> - else
> - return true;
> +
> + return true;
> }
>
>
>
> Modified: llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir?rev=286183&r1=286182&r2=286183&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir (original)
> +++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir Mon Nov 7 18:34:06 2016
> @@ -147,6 +147,9 @@
>
> define void @icmp() { ret void }
> define void @fcmp() { ret void }
> +
> + define void @phi() { ret void }
> +
> ...
>
> ---
> @@ -2834,3 +2837,40 @@ body: |
> %3(s1) = G_FCMP floatpred(uge), %2, %2
>
> ...
> +
> +---
> +# CHECK-LABEL: name: phi
> +name: phi
> +legalized: true
> +regBankSelected: true
> +tracksRegLiveness: true
> +
> +# CHECK: registers:
> +# CHECK-NEXT: - { id: 0, class: fpr32 }
> +# CHECK-NEXT: - { id: 1, class: gpr32 }
> +# CHECK-NEXT: - { id: 2, class: fpr32 }
> +registers:
> + - { id: 0, class: fpr }
> + - { id: 1, class: gpr }
> + - { id: 2, class: fpr }
> +
> +# CHECK: body:
> +# CHECK: bb.1:
> +# CHECK: %2 = PHI %0, %bb.0, %2, %bb.1
> +
> +body: |
> + bb.0:
> + liveins: %s0, %w0
> + successors: %bb.1
> + %0(s32) = COPY %s0
> + %1(s1) = COPY %w0
> +
> + bb.1:
> + successors: %bb.1, %bb.2
> + %2(s32) = PHI %0, %bb.0, %2, %bb.1
> + G_BRCOND %1, %bb.1
> +
> + bb.2:
> + %s0 = COPY %2
> + RET_ReallyLR implicit %s0
> +...
>
>
> _______________________________________________
> 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