[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / TableGen / DefaultOpsGlobalISel.td
blob13ee2631ecb078414af3161bbb89751d6d37a74e
1 // RUN: llvm-tblgen %s -gen-global-isel -optimize-match-table=false -I %p/../../include -I %p/Common -o - | FileCheck %s
3 include "llvm/Target/Target.td"
4 include "GlobalISelEmitterCommon.td"
7 def SelectClamp  : ComplexPattern<untyped, 2, "SelectClamp">;
8 def SelectOMod  : ComplexPattern<untyped, 2, "SelectOMod">;
9 def SelectClampOMod  : ComplexPattern<untyped, 3, "SelectClampOMod">;
10 def SelectSrcMods  : ComplexPattern<untyped, 2, "SelectSrcMods">;
12 def gi_SelectClamp :
13     GIComplexOperandMatcher<s32, "selectClamp">,
14     GIComplexPatternEquiv<SelectClamp>;
16 def gi_SelectOMod :
17     GIComplexOperandMatcher<s32, "selectOMod">,
18     GIComplexPatternEquiv<SelectOMod>;
20 def gi_SelectClampOMod :
21     GIComplexOperandMatcher<s32, "selectClampOMod">,
22     GIComplexPatternEquiv<SelectClampOMod>;
24 def gi_SelectSrcMods :
25     GIComplexOperandMatcher<s32, "selectSrcMods">,
26     GIComplexPatternEquiv<SelectSrcMods>;
29 def src_mods : Operand <i32>;
30 def omod : OperandWithDefaultOps <i32, (ops (i32 0))>;
31 def clamp : OperandWithDefaultOps <i1, (ops (i1 0))>;
34 // CHECK: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_FMAXNUM,
35 // CHECK: GIM_CheckComplexPattern, /*MI*/0, /*Op*/1, /*Renderer*/0, GICP_gi_SelectSrcMods,
36 // CHECK: GIM_CheckComplexPattern, /*MI*/0, /*Op*/2, /*Renderer*/1, GICP_gi_SelectSrcMods,
37 // CHECK: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::FMAX,
38 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
39 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/1, // mods0
40 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/0, // src0
41 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/1, /*SubOperand*/1, // mods1
42 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/1, /*SubOperand*/0, // src1
43 // CHECK-NEXT: GIR_AddImm, /*InsnID*/0, /*Imm*/0,
44 // CHECK-NEXT: GIR_EraseFromParent, /*InsnID*/0,
47 // CHECK: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_FFLOOR,
48 // CHECK: GIM_CheckComplexPattern, /*MI*/0, /*Op*/1, /*Renderer*/0, GICP_gi_SelectClampOMod,
49 // CHECK: // (ffloor:{ *:[f32] } (SelectClampOMod:{ *:[f32] } f32:{ *:[f32] }:$src0, omod:{ *:[i32] }:$omod, i1:{ *:[i1] }:$clamp))  =>  (FLOMP:{ *:[f32] } f32:{ *:[f32] }:$src0, i1:{ *:[i1] }:$clamp, omod:{ *:[i32] }:$omod)
50 // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::FLOMP,
51 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
52 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/0, // src0
53 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/2, // clamp
54 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/1, // omod
57 // CHECK: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_FCANONICALIZE,
58 // CHECK: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::FMAX,
59 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
60 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/1, // mods
61 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/0, // src
62 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/1, // mods
63 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/0, // src
64 // CHECK-NEXT: GIR_AddImm, /*InsnID*/0, /*Imm*/0,
65 // CHECK-NEXT: GIR_EraseFromParent, /*InsnID*/0,
68 // CHECK: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_FCOS,
69 // CHECK: // (fcos:{ *:[f32] } (SelectOMod:{ *:[f32] } f32:{ *:[f32] }:$src0, i32:{ *:[i32] }:$omod))  =>  (FLAMP:{ *:[f32] } FPR32:{ *:[f32] }:$src0, omod:{ *:[i32] }:$omod)
70 // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::FLAMP,
71 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
72 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/0, // src0
73 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/1, // omod
74 // CHECK-NEXT: GIR_AddImm, /*InsnID*/0, /*Imm*/0,
77 // CHECK: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_FEXP2,
78 // CHECK: // (fexp2:{ *:[f32] } (SelectClamp:{ *:[f32] } f32:{ *:[f32] }:$src0, i1:{ *:[i1] }:$clamp))  =>  (FEEPLE:{ *:[f32] } FPR32:{ *:[f32] }:$src0, (FFOO:{ *:[f32] } FPR32:{ *:[f32] }:$src0), clamp:{ *:[i1] }:$clamp)
80 // CHECK-NEXT: GIR_MakeTempReg, /*TempRegID*/0, /*TypeID*/GILLT_s32,
81 // CHECK-NEXT: GIR_BuildMI, /*InsnID*/1, /*Opcode*/MyTarget::FFOO,
82 // CHECK-NEXT: GIR_AddTempRegister, /*InsnID*/1, /*TempRegID*/0, /*TempRegFlags*/RegState::Define,
83 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/1, /*RendererID*/0, /*SubOperand*/0, // src0
84 // CHECK-NEXT: GIR_AddImm, /*InsnID*/1, /*Imm*/0,
85 // CHECK-NEXT: GIR_ConstrainSelectedInstOperands, /*InsnID*/1,
86 // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::FEEPLE,
87 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
88 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/0, // src0
89 // CHECK-NEXT: GIR_AddTempRegister, /*InsnID*/0, /*TempRegID*/0, /*TempRegFlags*/0,
90 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/1, // clamp
91 // CHECK-NEXT: GIR_EraseFromParent, /*InsnID*/0,
92 // CHECK-NEXT: GIR_ConstrainSelectedInstOperands, /*InsnID*/0,
95 // CHECK: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_FSIN,
96 // CHECK: // (fsin:{ *:[f32] } (SelectClamp:{ *:[f32] } f32:{ *:[f32] }:$src0, i1:{ *:[i1] }:$clamp))  =>  (FFOO:{ *:[f32] } f32:{ *:[f32] }:$src0, i1:{ *:[i1] }:$clamp)
97 // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::FFOO,
98 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
99 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/0, // src0
100 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/1, // clamp
101 // CHECK-NEXT: GIR_EraseFromParent, /*InsnID*/0,
104 // CHECK: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_FSQRT,
105 // CHECK: // (fsqrt:{ *:[f32] } (SelectClamp:{ *:[f32] } f32:{ *:[f32] }:$src0, i1:{ *:[i1] }:$clamp))  =>  (FLAMP:{ *:[f32] } FPR32:{ *:[f32] }:$src0, 93:{ *:[i32] }, clamp:{ *:[i1] }:$clamp)
106 // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::FLAMP,
107 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
108 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/0, // src0
109 // CHECK-NEXT: GIR_AddImm, /*InsnID*/0, /*Imm*/93,
110 // CHECK-NEXT: GIR_ComplexSubOperandRenderer, /*InsnID*/0, /*RendererID*/0, /*SubOperand*/1, // clamp
111 // CHECK-NEXT: GIR_EraseFromParent, /*InsnID*/0,
113 // CHECK: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_INTRINSIC_ROUND,
114 // CHECK: // (fround:{ *:[f32] } f32:{ *:[f32] }:$src0)  =>  (FBAR:{ *:[f32] } f32:{ *:[f32] }:$src0)
115 // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::FBAR,
116 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
117 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/1, // src0
118 // CHECK-NEXT: GIR_AddImm, /*InsnID*/0, /*Imm*/0,
119 // CHECK-NEXT: GIR_EraseFromParent, /*InsnID*/0,
121 // CHECK: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_INTRINSIC_TRUNC,
122 // CHECK: // (ftrunc:{ *:[f32] } f32:{ *:[f32] }:$src0)  =>  (FFOO:{ *:[f32] } FPR32:{ *:[f32] }:$src0)
123 // CHECK-NEXT: GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::FFOO,
124 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
125 // CHECK-NEXT: GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/1, // src0
126 // CHECK-NEXT: GIR_AddImm, /*InsnID*/0, /*Imm*/0,
127 // CHECK-NEXT: GIR_EraseFromParent, /*InsnID*/0,
130 // Have default operand with explicit value from complex pattern.
131 def FFOO : I<(outs FPR32:$dst), (ins FPR32:$src0, clamp:$clamp),
132             [(set FPR32:$dst, (fsin (SelectClamp f32:$src0, i1:$clamp)))]>;
135 // Have default operand, not explicitly specified in a standalone
136 // pattern.
137 def : Pat <
138   (ftrunc f32:$src0),
139   (FFOO FPR32:$src0)
142 // Have default operand, not explicitly specified in an instruction
143 // definition pattern.
144 def FBAR : I<(outs FPR32:$dst), (ins FPR32:$src0, clamp:$clamp),
145             [(set FPR32:$dst, (fround f32:$src0))]>;
148 // // Swapped order in instruction from pattern
149 def FLOMP : I<
150   (outs FPR32:$dst), (ins FPR32:$src0, clamp:$clamp, omod:$omod),
151   [(set FPR32:$dst, (ffloor (SelectClampOMod f32:$src0, omod:$omod, i1:$clamp)))]>;
153 def FLAMP : I<(outs FPR32:$dst), (ins FPR32:$src0, omod:$omod, clamp:$clamp), []>;
155 // // Have 2 default operands, and the first is specified
156 def : Pat <
157   (fcos (SelectOMod f32:$src0, i32:$omod)),
158   (FLAMP FPR32:$src0, omod:$omod)
161 // Immediate used for first defaulted operand
162 def : Pat <
163   (fsqrt (SelectClamp f32:$src0, i1:$clamp)),
164   (FLAMP FPR32:$src0, 93, clamp:$clamp)
167 def FEEPLE : I<(outs FPR32:$dst),
168                (ins FPR32:$src0, FPR32:$src1, clamp:$clamp), []>;
170 // Default operand isn't on the root ouput instruction
171 def : Pat <
172   (fexp2 (SelectClamp f32:$src0, i1:$clamp)),
173   (FEEPLE FPR32:$src0, (FFOO FPR32:$src0), clamp:$clamp)
176 // Same instruction is used in two different pattern contexts, one
177 // uses the default and one does not.
178 def FMAX : I<(outs FPR32:$dst),
179   (ins src_mods:$mods0, FPR32:$src0, src_mods:$mods1, FPR32:$src1, clamp:$clamp),
180   [(set FPR32:$dst, (f32 (fmaxnum (SelectSrcMods f32:$src0, src_mods:$mods0),
181                                   (SelectSrcMods f32:$src1, src_mods:$mods1))))]
184 def : Pat<
185   (fcanonicalize (f32 (SelectSrcMods f32:$src, i32:$mods))),
186   (FMAX $mods, $src, $mods, $src, 0)