|
1 | | -// RUN: llvm-tblgen -gen-global-isel -warn-on-skipped-patterns -I %p/../../../include -I %p/../Common %s -o /dev/null 2>&1 | FileCheck %s --implicit-check-not="Skipped pattern" |
| 1 | +// RUN: llvm-tblgen -gen-global-isel -optimize-match-table=false \ |
| 2 | +// RUN: -I %p/../../../include -I %p/../Common %s |
2 | 3 |
|
3 | 4 | include "llvm/Target/Target.td" |
4 | 5 | include "GlobalISelEmitterCommon.td" |
5 | 6 |
|
6 | | -// CHECK: Skipped pattern: Pattern defines a physical register |
7 | | -let Uses = [B0], Defs = [B0] in |
8 | | -def tst1 : I<(outs), (ins), [(set B0, (add B0, 1))]>; |
| 7 | +let Defs = [R0, B0] in |
| 8 | +def tst1 : I<(outs), (ins), [(set R0, (i32 42))]>; |
9 | 9 |
|
10 | | -// CHECK: Skipped pattern: Src pattern result has 1 def(s) without the HasNoUse predicate set to true but Dst MI has no def |
11 | | -let Uses = [B0] in |
12 | | -def tst2 : I<(outs), (ins), [(set B0, (add B0, 1))]>; |
| 10 | +let Defs = [R0, R1] in |
| 11 | +def tst2 : I<(outs GPR32:$rd), (ins GPR32:$rs1, GPR32:$rs2), |
| 12 | + [(set GPR32:$rd, R1, (sdivrem i32:$rs1, i32:$rs2))]>; |
| 13 | + |
| 14 | +let Defs = [R0, R1] in |
| 15 | +def tst3 : I<(outs), (ins GPR32:$rs1, GPR32:$rs2), |
| 16 | + [(set R1, R0, (udivrem i32:$rs1, i32:$rs2))]>; |
| 17 | + |
| 18 | +let Defs = [R0] in |
| 19 | +def tst4 : I<(outs GPR32:$rd), (ins GPR32:$rs), []>; |
| 20 | + |
| 21 | +def : Pat<(sdivrem i32:$rs, 42), (tst4 (tst4 $rs))>; |
| 22 | + |
| 23 | +// CHECK-LABEL: // (sdivrem:{ *:[i32] }:{ *:[i32] } i32:{ *:[i32] }:$rs, 42:{ *:[i32] }) => (tst4:{ *:[i32] }:{ *:[i32] } (tst4:{ *:[i32] }:{ *:[i32] } ?:{ *:[i32] }:$rs)) |
| 24 | +// CHECK-NEXT: GIR_MakeTempReg, /*TempRegID*/0, /*TypeID*/GILLT_s32, |
| 25 | +// CHECK-NEXT: GIR_BuildMI, /*InsnID*/2, /*Opcode*/GIMT_Encode2(MyTarget::tst4), |
| 26 | +// CHECK-NEXT: GIR_AddTempRegister, /*InsnID*/2, /*TempRegID*/0, /*TempRegFlags*/GIMT_Encode2(RegState::Define), |
| 27 | +// CHECK-NEXT: GIR_Copy, /*NewInsnID*/2, /*OldInsnID*/0, /*OpIdx*/2, // rs |
| 28 | +// CHECK-NEXT: GIR_SetImplicitDefDead, /*InsnID*/2, /*OpIdx for MyTarget::R0*/0, |
| 29 | +// CHECK-NEXT: GIR_ConstrainSelectedInstOperands, /*InsnID*/2, |
| 30 | +// CHECK-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::tst4), |
| 31 | +// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[rd] |
| 32 | +// CHECK-NEXT: GIR_AddSimpleTempRegister, /*InsnID*/0, /*TempRegID*/0, |
| 33 | +// CHECK-NEXT: GIR_BuildMI, /*InsnID*/1, /*Opcode*/GIMT_Encode2(TargetOpcode::COPY), |
| 34 | +// CHECK-NEXT: GIR_Copy, /*NewInsnID*/1, /*OldInsnID*/0, /*OpIdx*/1, // DstI[R0] |
| 35 | +// CHECK-NEXT: GIR_AddRegister, /*InsnID*/1, GIMT_Encode2(MyTarget::R0), /*AddRegisterRegFlags*/GIMT_Encode2(0), |
| 36 | +// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands, |
| 37 | +// CHECK-NEXT: // GIR_Coverage, 3, |
| 38 | +// CHECK-NEXT: GIR_EraseRootFromParent_Done, |
| 39 | + |
| 40 | +// CHECK-LABEL: // 42:{ *:[i32] } => (tst1:{ *:[i32] }) |
| 41 | +// CHECK-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::tst1), |
| 42 | +// CHECK-NEXT: GIR_SetImplicitDefDead, /*InsnID*/0, /*OpIdx for MyTarget::B0*/1, |
| 43 | +// CHECK-NEXT: GIR_BuildMI, /*InsnID*/1, /*Opcode*/GIMT_Encode2(TargetOpcode::COPY), |
| 44 | +// CHECK-NEXT: GIR_Copy, /*NewInsnID*/1, /*OldInsnID*/0, /*OpIdx*/0, // DstI[R0] |
| 45 | +// CHECK-NEXT: GIR_AddRegister, /*InsnID*/1, GIMT_Encode2(MyTarget::R0), /*AddRegisterRegFlags*/GIMT_Encode2(0), |
| 46 | +// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands, |
| 47 | +// CHECK-NEXT: // GIR_Coverage, 0, |
| 48 | +// CHECK-NEXT: GIR_EraseRootFromParent_Done, |
| 49 | + |
| 50 | +// CHECK-LABEL: // (sdivrem:{ *:[i32] }:{ *:[i32] } i32:{ *:[i32] }:$rs1, i32:{ *:[i32] }:$rs2) => (tst2:{ *:[i32] }:{ *:[i32] } i32:{ *:[i32] }:$rs1, i32:{ *:[i32] }:$rs2) |
| 51 | +// CHECK-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::tst2), |
| 52 | +// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[rd] |
| 53 | +// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/2, // rs1 |
| 54 | +// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/3, // rs2 |
| 55 | +// CHECK-NEXT: GIR_SetImplicitDefDead, /*InsnID*/0, /*OpIdx for MyTarget::R1*/1, |
| 56 | +// CHECK-NEXT: GIR_BuildMI, /*InsnID*/1, /*Opcode*/GIMT_Encode2(TargetOpcode::COPY), |
| 57 | +// CHECK-NEXT: GIR_Copy, /*NewInsnID*/1, /*OldInsnID*/0, /*OpIdx*/1, // DstI[R0] |
| 58 | +// CHECK-NEXT: GIR_AddRegister, /*InsnID*/1, GIMT_Encode2(MyTarget::R0), /*AddRegisterRegFlags*/GIMT_Encode2(0), |
| 59 | +// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands, |
| 60 | +// CHECK-NEXT: // GIR_Coverage, 1, |
| 61 | +// CHECK-NEXT: GIR_EraseRootFromParent_Done, |
| 62 | + |
| 63 | +// CHECK-LABEL: // (udivrem:{ *:[i32] }:{ *:[i32] } i32:{ *:[i32] }:$rs1, i32:{ *:[i32] }:$rs2) => (tst3:{ *:[i32] } i32:{ *:[i32] }:$rs1, i32:{ *:[i32] }:$rs2) |
| 64 | +// CHECK-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::tst3), |
| 65 | +// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/2, // rs1 |
| 66 | +// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/3, // rs2 |
| 67 | +// CHECK-NEXT: GIR_BuildMI, /*InsnID*/1, /*Opcode*/GIMT_Encode2(TargetOpcode::COPY), |
| 68 | +// CHECK-NEXT: GIR_Copy, /*NewInsnID*/1, /*OldInsnID*/0, /*OpIdx*/0, // DstI[R0] |
| 69 | +// CHECK-NEXT: GIR_AddRegister, /*InsnID*/1, GIMT_Encode2(MyTarget::R0), /*AddRegisterRegFlags*/GIMT_Encode2(0), |
| 70 | +// CHECK-NEXT: GIR_BuildMI, /*InsnID*/2, /*Opcode*/GIMT_Encode2(TargetOpcode::COPY), |
| 71 | +// CHECK-NEXT: GIR_Copy, /*NewInsnID*/2, /*OldInsnID*/0, /*OpIdx*/1, // DstI[R1] |
| 72 | +// CHECK-NEXT: GIR_AddRegister, /*InsnID*/2, GIMT_Encode2(MyTarget::R1), /*AddRegisterRegFlags*/GIMT_Encode2(0), |
| 73 | +// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands, |
| 74 | +// CHECK-NEXT: // GIR_Coverage, 2, |
| 75 | +// CHECK-NEXT: GIR_EraseRootFromParent_Done, |
0 commit comments