diff options
| author | Daniel Sanders <daniel_l_sanders@apple.com> | 2018-01-29 21:09:12 +0000 |
|---|---|---|
| committer | Daniel Sanders <daniel_l_sanders@apple.com> | 2018-01-29 21:09:12 +0000 |
| commit | 08464524c34daa350ba4eaafd6231ddc1c3edee0 (patch) | |
| tree | 12ca7a840e60dc80b7783a097f1866130ef798ba /llvm/test | |
| parent | bf750c80e9dce1b6e2c270adba64fc85f7fbc861 (diff) | |
| download | bcm5719-llvm-08464524c34daa350ba4eaafd6231ddc1c3edee0.tar.gz bcm5719-llvm-08464524c34daa350ba4eaafd6231ddc1c3edee0.zip | |
[ARM][GISel] PR35965 Constrain RegClasses of nested instructions built from Dst Pattern
Summary:
Apparently, we missed on constraining register classes of VReg-operands of all the instructions
built from a destination pattern but the root (top-level) one. The issue exposed itself
while selecting G_FPTOSI for armv7: the corresponding pattern generates VTOSIZS wrapped
into COPY_TO_REGCLASS, so top-level COPY_TO_REGCLASS gets properly constrained,
while nested VTOSIZS (or rather its destination virtual register to be exact) does not.
Fixing this by issuing GIR_ConstrainSelectedInstOperands for every nested GIR_BuildMI.
https://bugs.llvm.org/show_bug.cgi?id=35965
rdar://problem/36886530
Patch by Roman Tereshin
Reviewers: dsanders, qcolombet, rovka, bogner, aditya_nandakumar, volkan
Reviewed By: dsanders, qcolombet, rovka
Subscribers: aemerson, javed.absar, kristof.beyls, llvm-commits
Differential Revision: https://reviews.llvm.org/D42565
llvm-svn: 323692
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/CodeGen/ARM/GlobalISel/arm-select-copy_to_regclass-of-fptosi.mir | 30 | ||||
| -rw-r--r-- | llvm/test/TableGen/GlobalISelEmitter.td | 1 |
2 files changed, 31 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM/GlobalISel/arm-select-copy_to_regclass-of-fptosi.mir b/llvm/test/CodeGen/ARM/GlobalISel/arm-select-copy_to_regclass-of-fptosi.mir new file mode 100644 index 00000000000..9045f31ff75 --- /dev/null +++ b/llvm/test/CodeGen/ARM/GlobalISel/arm-select-copy_to_regclass-of-fptosi.mir @@ -0,0 +1,30 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple armv7-gnueabihf -run-pass instruction-select \ +# RUN: -verify-machineinstrs -o - %s | FileCheck %s +--- +# Test that we constrain register classes of temporary virtual registers +# defined by nested instructions built from a Dst Pattern +# +# G_FPTOSI selects to a (COPY_TO_REGCLASS (VTOSIZS SPR:$a), GPR), where +# COPY_TO_REGCLASS doesn't constrain its source register class. It exposes the +# bug as we create a tmp reg for VTOSIZS' result and don't constrain its +# register class as COPY_TO_REGCLASS' source (which is fine) nor as VTOSIZS' +# destination (which is not). +# +# https://bugs.llvm.org/show_bug.cgi?id=35965 +name: test_fptosi +legalized: true +regBankSelected: true +body: | + bb.1: + ; CHECK-LABEL: name: test_fptosi + ; CHECK: [[COPY:%[0-9]+]]:spr = COPY %s0 + ; CHECK: [[VTOSIZS:%[0-9]+]]:spr = VTOSIZS [[COPY]], 14, %noreg + ; CHECK: [[COPY1:%[0-9]+]]:gpr = COPY [[VTOSIZS]] + ; CHECK: %r0 = COPY [[COPY1]] + ; CHECK: MOVPCLR 14, %noreg, implicit %r0 + %0:fprb(s32) = COPY %s0 + %1:gprb(s32) = G_FPTOSI %0(s32) + %r0 = COPY %1(s32) + MOVPCLR 14, %noreg, implicit %r0 +... diff --git a/llvm/test/TableGen/GlobalISelEmitter.td b/llvm/test/TableGen/GlobalISelEmitter.td index fe2f355f871..a6d61d61f6a 100644 --- a/llvm/test/TableGen/GlobalISelEmitter.td +++ b/llvm/test/TableGen/GlobalISelEmitter.td @@ -308,6 +308,7 @@ def : Pat<(select GPR32:$src1, (complex_rr GPR32:$src2a, GPR32:$src2b), // CHECK-NEXT: GIR_ComplexRenderer, /*InsnID*/1, /*RendererID*/1, // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/1, /*RendererID*/2, /*SubOperand*/0, // src5a // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/1, /*RendererID*/2, /*SubOperand*/1, // src5b +// CHECK-NEXT: GIR_ConstrainSelectedInstOperands, /*InsnID*/1, // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::INSN3, // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/1, // src1 |

