Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / inst-select-pattern-smed3.s16.mir
blobe0ce71e0b0919a86c62c48ef165cb87d48f05de2
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -march=amdgcn -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX8 %s
3 # RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX9 %s
4 # RUN: llc -march=amdgcn -mcpu=gfx1010 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX9 %s
5 # RUN: llc -march=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX11 %s
7 ---
8 name: smed3_s16_vvv
9 legalized: true
10 regBankSelected: true
12 body: |
13   bb.0:
14     liveins: $vgpr0, $vgpr1, $vgpr2
16     ; GFX8-LABEL: name: smed3_s16_vvv
17     ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
18     ; GFX8-NEXT: {{  $}}
19     ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
20     ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
21     ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
22     ; GFX8-NEXT: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
23     ; GFX8-NEXT: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
24     ; GFX8-NEXT: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
25     ; GFX8-NEXT: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
26     ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]]
27     ; GFX9-LABEL: name: smed3_s16_vvv
28     ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
29     ; GFX9-NEXT: {{  $}}
30     ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
31     ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
32     ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
33     ; GFX9-NEXT: [[V_MED3_I16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_I16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
34     ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_I16_e64_]]
35     ; GFX11-LABEL: name: smed3_s16_vvv
36     ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2
37     ; GFX11-NEXT: {{  $}}
38     ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
39     ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
40     ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
41     ; GFX11-NEXT: [[V_MED3_I16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_I16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
42     ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_I16_e64_]]
43     %0:vgpr(s32) = COPY $vgpr0
44     %1:vgpr(s32) = COPY $vgpr1
45     %2:vgpr(s32) = COPY $vgpr2
46     %3:vgpr(s16) = G_TRUNC %0
47     %4:vgpr(s16) = G_TRUNC %1
48     %5:vgpr(s16) = G_TRUNC %2
50     %6:vgpr(s16) = G_SMAX %3, %4
51     %7:vgpr(s16) = G_SMIN %3, %4
52     %8:vgpr(s16) = G_SMAX %7, %5
53     %9:vgpr(s16) = G_SMIN %6, %8
55     S_ENDPGM 0, implicit %9
56 ...
58 ---
59 name: smed3_s16_vvv_multiuse0
60 legalized: true
61 regBankSelected: true
63 body: |
64   bb.0:
65     liveins: $vgpr0, $vgpr1, $vgpr2
67     ; GFX8-LABEL: name: smed3_s16_vvv_multiuse0
68     ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
69     ; GFX8-NEXT: {{  $}}
70     ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
71     ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
72     ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
73     ; GFX8-NEXT: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
74     ; GFX8-NEXT: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
75     ; GFX8-NEXT: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
76     ; GFX8-NEXT: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
77     ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]], implicit [[V_MAX_I16_e64_]]
78     ; GFX9-LABEL: name: smed3_s16_vvv_multiuse0
79     ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
80     ; GFX9-NEXT: {{  $}}
81     ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
82     ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
83     ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
84     ; GFX9-NEXT: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
85     ; GFX9-NEXT: [[V_MED3_I16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_I16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
86     ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_I16_e64_]], implicit [[V_MAX_I16_e64_]]
87     ; GFX11-LABEL: name: smed3_s16_vvv_multiuse0
88     ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2
89     ; GFX11-NEXT: {{  $}}
90     ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
91     ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
92     ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
93     ; GFX11-NEXT: [[V_MAX_I16_t16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_t16_e64 [[COPY]], [[COPY1]], implicit $exec
94     ; GFX11-NEXT: [[V_MED3_I16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_I16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
95     ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_I16_e64_]], implicit [[V_MAX_I16_t16_e64_]]
96     %0:vgpr(s32) = COPY $vgpr0
97     %1:vgpr(s32) = COPY $vgpr1
98     %2:vgpr(s32) = COPY $vgpr2
99     %3:vgpr(s16) = G_TRUNC %0
100     %4:vgpr(s16) = G_TRUNC %1
101     %5:vgpr(s16) = G_TRUNC %2
103     %6:vgpr(s16) = G_SMAX %3, %4
104     %7:vgpr(s16) = G_SMIN %3, %4
105     %8:vgpr(s16) = G_SMAX %7, %5
106     %9:vgpr(s16) = G_SMIN %6, %8
108     S_ENDPGM 0, implicit %9, implicit %6
112 name: smed3_s16_vvv_multiuse1
113 legalized: true
114 regBankSelected: true
116 body: |
117   bb.0:
118     liveins: $vgpr0, $vgpr1, $vgpr2
120     ; GFX8-LABEL: name: smed3_s16_vvv_multiuse1
121     ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
122     ; GFX8-NEXT: {{  $}}
123     ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
124     ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
125     ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
126     ; GFX8-NEXT: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
127     ; GFX8-NEXT: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
128     ; GFX8-NEXT: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
129     ; GFX8-NEXT: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
130     ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]], implicit [[V_MIN_I16_e64_]]
131     ; GFX9-LABEL: name: smed3_s16_vvv_multiuse1
132     ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
133     ; GFX9-NEXT: {{  $}}
134     ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
135     ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
136     ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
137     ; GFX9-NEXT: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
138     ; GFX9-NEXT: [[V_MED3_I16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_I16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
139     ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_I16_e64_]], implicit [[V_MIN_I16_e64_]]
140     ; GFX11-LABEL: name: smed3_s16_vvv_multiuse1
141     ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2
142     ; GFX11-NEXT: {{  $}}
143     ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
144     ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
145     ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
146     ; GFX11-NEXT: [[V_MIN_I16_t16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_t16_e64 [[COPY]], [[COPY1]], implicit $exec
147     ; GFX11-NEXT: [[V_MED3_I16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_I16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
148     ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_I16_e64_]], implicit [[V_MIN_I16_t16_e64_]]
149     %0:vgpr(s32) = COPY $vgpr0
150     %1:vgpr(s32) = COPY $vgpr1
151     %2:vgpr(s32) = COPY $vgpr2
152     %3:vgpr(s16) = G_TRUNC %0
153     %4:vgpr(s16) = G_TRUNC %1
154     %5:vgpr(s16) = G_TRUNC %2
156     %6:vgpr(s16) = G_SMAX %3, %4
157     %7:vgpr(s16) = G_SMIN %3, %4
158     %8:vgpr(s16) = G_SMAX %7, %5
159     %9:vgpr(s16) = G_SMIN %6, %8
161     S_ENDPGM 0, implicit %9, implicit %7
165 name: smed3_s16_vvv_multiuse2
166 legalized: true
167 regBankSelected: true
169 body: |
170   bb.0:
171     liveins: $vgpr0, $vgpr1, $vgpr2
173     ; GFX8-LABEL: name: smed3_s16_vvv_multiuse2
174     ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
175     ; GFX8-NEXT: {{  $}}
176     ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
177     ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
178     ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
179     ; GFX8-NEXT: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[COPY]], [[COPY1]], implicit $exec
180     ; GFX8-NEXT: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
181     ; GFX8-NEXT: [[V_MAX_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
182     ; GFX8-NEXT: [[V_MIN_I16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[V_MAX_I16_e64_]], [[V_MAX_I16_e64_1]], implicit $exec
183     ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_I16_e64_1]], implicit [[V_MAX_I16_e64_1]]
184     ; GFX9-LABEL: name: smed3_s16_vvv_multiuse2
185     ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
186     ; GFX9-NEXT: {{  $}}
187     ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
188     ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
189     ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
190     ; GFX9-NEXT: [[V_MIN_I16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_e64 [[COPY]], [[COPY1]], implicit $exec
191     ; GFX9-NEXT: [[V_MAX_I16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_e64 [[V_MIN_I16_e64_]], [[COPY2]], implicit $exec
192     ; GFX9-NEXT: [[V_MED3_I16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_I16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
193     ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_I16_e64_]], implicit [[V_MAX_I16_e64_]]
194     ; GFX11-LABEL: name: smed3_s16_vvv_multiuse2
195     ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2
196     ; GFX11-NEXT: {{  $}}
197     ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
198     ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
199     ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
200     ; GFX11-NEXT: [[V_MIN_I16_t16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_I16_t16_e64 [[COPY]], [[COPY1]], implicit $exec
201     ; GFX11-NEXT: [[V_MAX_I16_t16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_I16_t16_e64 [[V_MIN_I16_t16_e64_]], [[COPY2]], implicit $exec
202     ; GFX11-NEXT: [[V_MED3_I16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_I16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec
203     ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_I16_e64_]], implicit [[V_MAX_I16_t16_e64_]]
204     %0:vgpr(s32) = COPY $vgpr0
205     %1:vgpr(s32) = COPY $vgpr1
206     %2:vgpr(s32) = COPY $vgpr2
207     %3:vgpr(s16) = G_TRUNC %0
208     %4:vgpr(s16) = G_TRUNC %1
209     %5:vgpr(s16) = G_TRUNC %2
211     %6:vgpr(s16) = G_SMAX %3, %4
212     %7:vgpr(s16) = G_SMIN %3, %4
213     %8:vgpr(s16) = G_SMAX %7, %5
214     %9:vgpr(s16) = G_SMIN %6, %8
216     S_ENDPGM 0, implicit %9, implicit %8