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 -o - %s  | FileCheck -check-prefix=GFX8 %s
3# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=instruction-select -verify-machineinstrs -o - %s  | FileCheck -check-prefix=GFX9 %s
4# RUN: llc -march=amdgcn -mcpu=gfx1010 -run-pass=instruction-select -verify-machineinstrs -o - %s  | FileCheck -check-prefix=GFX9 %s
5# RUN: llc -march=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs -o - %s  | FileCheck -check-prefix=GFX9 %s
6
7---
8
9name:            add_s32_sgpr_sgpr_sgpr
10legalized:       true
11regBankSelected: true
12tracksRegLiveness: true
13
14body: |
15  bb.0:
16    liveins: $sgpr0, $sgpr1, $sgpr2
17    ; GFX8-LABEL: name: add_s32_sgpr_sgpr_sgpr
18    ; GFX8: liveins: $sgpr0, $sgpr1, $sgpr2
19    ; GFX8-NEXT: {{  $}}
20    ; GFX8-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0
21    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1
22    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:sreg_32 = COPY $sgpr2
23    ; GFX8-NEXT: [[S_ADD_I32_:%[0-9]+]]:sreg_32 = S_ADD_I32 [[COPY]], [[COPY1]], implicit-def $scc
24    ; GFX8-NEXT: [[S_ADD_I32_1:%[0-9]+]]:sreg_32 = S_ADD_I32 [[S_ADD_I32_]], [[COPY2]], implicit-def $scc
25    ; GFX8-NEXT: S_ENDPGM 0, implicit [[S_ADD_I32_1]]
26    ; GFX9-LABEL: name: add_s32_sgpr_sgpr_sgpr
27    ; GFX9: liveins: $sgpr0, $sgpr1, $sgpr2
28    ; GFX9-NEXT: {{  $}}
29    ; GFX9-NEXT: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0
30    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:sreg_32 = COPY $sgpr1
31    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:sreg_32 = COPY $sgpr2
32    ; GFX9-NEXT: [[S_ADD_I32_:%[0-9]+]]:sreg_32 = S_ADD_I32 [[COPY]], [[COPY1]], implicit-def $scc
33    ; GFX9-NEXT: [[S_ADD_I32_1:%[0-9]+]]:sreg_32 = S_ADD_I32 [[S_ADD_I32_]], [[COPY2]], implicit-def $scc
34    ; GFX9-NEXT: S_ENDPGM 0, implicit [[S_ADD_I32_1]]
35    %0:sgpr(s32) = COPY $sgpr0
36    %1:sgpr(s32) = COPY $sgpr1
37    %2:sgpr(s32) = COPY $sgpr2
38    %3:sgpr(s32) = G_ADD %0, %1
39    %4:sgpr(s32) = G_ADD %3, %2
40    S_ENDPGM 0, implicit %4
41...
42
43---
44
45name:            add_s32_vgpr_vgpr_vgpr
46legalized:       true
47regBankSelected: true
48tracksRegLiveness: true
49
50body: |
51  bb.0:
52    liveins: $vgpr0, $vgpr1, $vgpr2
53    ; GFX8-LABEL: name: add_s32_vgpr_vgpr_vgpr
54    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
55    ; GFX8-NEXT: {{  $}}
56    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
57    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
58    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
59    ; GFX8-NEXT: %3:vgpr_32, dead %6:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
60    ; GFX8-NEXT: %4:vgpr_32, dead %5:sreg_64_xexec = V_ADD_CO_U32_e64 %3, [[COPY2]], 0, implicit $exec
61    ; GFX8-NEXT: S_ENDPGM 0, implicit %4
62    ; GFX9-LABEL: name: add_s32_vgpr_vgpr_vgpr
63    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
64    ; GFX9-NEXT: {{  $}}
65    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
66    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
67    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
68    ; GFX9-NEXT: [[V_ADD3_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD3_U32_e64 [[COPY]], [[COPY1]], [[COPY2]], implicit $exec
69    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_ADD3_U32_e64_]]
70    %0:vgpr(s32) = COPY $vgpr0
71    %1:vgpr(s32) = COPY $vgpr1
72    %2:vgpr(s32) = COPY $vgpr2
73    %3:vgpr(s32) = G_ADD %0, %1
74    %4:vgpr(s32) = G_ADD %3, %2
75    S_ENDPGM 0, implicit %4
76...
77
78---
79
80name:            add_s32_vgpr_vgpr_vgpr_multi_use
81legalized:       true
82regBankSelected: true
83tracksRegLiveness: true
84
85body: |
86  bb.0:
87    liveins: $vgpr0, $vgpr1, $vgpr2
88    ; GFX8-LABEL: name: add_s32_vgpr_vgpr_vgpr_multi_use
89    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
90    ; GFX8-NEXT: {{  $}}
91    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
92    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
93    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
94    ; GFX8-NEXT: %3:vgpr_32, dead %6:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
95    ; GFX8-NEXT: %4:vgpr_32, dead %5:sreg_64_xexec = V_ADD_CO_U32_e64 %3, [[COPY2]], 0, implicit $exec
96    ; GFX8-NEXT: S_ENDPGM 0, implicit %4, implicit %3
97    ; GFX9-LABEL: name: add_s32_vgpr_vgpr_vgpr_multi_use
98    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
99    ; GFX9-NEXT: {{  $}}
100    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
101    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
102    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
103    ; GFX9-NEXT: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
104    ; GFX9-NEXT: [[V_ADD_U32_e64_1:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[V_ADD_U32_e64_]], [[COPY2]], 0, implicit $exec
105    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_ADD_U32_e64_1]], implicit [[V_ADD_U32_e64_]]
106    %0:vgpr(s32) = COPY $vgpr0
107    %1:vgpr(s32) = COPY $vgpr1
108    %2:vgpr(s32) = COPY $vgpr2
109    %3:vgpr(s32) = G_ADD %0, %1
110    %4:vgpr(s32) = G_ADD %3, %2
111    S_ENDPGM 0, implicit %4, implicit %3
112...
113
114---
115
116name:            add_p3_vgpr_vgpr_vgpr
117legalized:       true
118regBankSelected: true
119tracksRegLiveness: true
120
121body: |
122  bb.0:
123    liveins: $vgpr0, $vgpr1, $vgpr2
124
125    ; GFX8-LABEL: name: add_p3_vgpr_vgpr_vgpr
126    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
127    ; GFX8-NEXT: {{  $}}
128    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
129    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
130    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
131    ; GFX8-NEXT: %3:vgpr_32, dead %6:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
132    ; GFX8-NEXT: %4:vgpr_32, dead %5:sreg_64_xexec = V_ADD_CO_U32_e64 %3, [[COPY2]], 0, implicit $exec
133    ; GFX8-NEXT: S_ENDPGM 0, implicit %4
134    ; GFX9-LABEL: name: add_p3_vgpr_vgpr_vgpr
135    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
136    ; GFX9-NEXT: {{  $}}
137    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
138    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
139    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
140    ; GFX9-NEXT: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
141    ; GFX9-NEXT: [[V_ADD_U32_e64_1:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[V_ADD_U32_e64_]], [[COPY2]], 0, implicit $exec
142    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_ADD_U32_e64_1]]
143    %0:vgpr(p3) = COPY $vgpr0
144    %1:vgpr(s32) = COPY $vgpr1
145    %2:vgpr(s32) = COPY $vgpr2
146    %3:vgpr(p3) = G_PTR_ADD %0, %1
147    %4:vgpr(p3) = G_PTR_ADD %3, %2
148    S_ENDPGM 0, implicit %4
149...
150
151---
152
153name:            add_p5_vgpr_vgpr_vgpr
154legalized:       true
155regBankSelected: true
156tracksRegLiveness: true
157
158body: |
159  bb.0:
160    liveins: $vgpr0, $vgpr1, $vgpr2
161
162    ; GFX8-LABEL: name: add_p5_vgpr_vgpr_vgpr
163    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
164    ; GFX8-NEXT: {{  $}}
165    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
166    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
167    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
168    ; GFX8-NEXT: %3:vgpr_32, dead %6:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
169    ; GFX8-NEXT: %4:vgpr_32, dead %5:sreg_64_xexec = V_ADD_CO_U32_e64 %3, [[COPY2]], 0, implicit $exec
170    ; GFX8-NEXT: S_ENDPGM 0, implicit %4
171    ; GFX9-LABEL: name: add_p5_vgpr_vgpr_vgpr
172    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
173    ; GFX9-NEXT: {{  $}}
174    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
175    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
176    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
177    ; GFX9-NEXT: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
178    ; GFX9-NEXT: [[V_ADD_U32_e64_1:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[V_ADD_U32_e64_]], [[COPY2]], 0, implicit $exec
179    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_ADD_U32_e64_1]]
180    %0:vgpr(p5) = COPY $vgpr0
181    %1:vgpr(s32) = COPY $vgpr1
182    %2:vgpr(s32) = COPY $vgpr2
183    %3:vgpr(p5) = G_PTR_ADD %0, %1
184    %4:vgpr(p5) = G_PTR_ADD %3, %2
185    S_ENDPGM 0, implicit %4
186...
187
188---
189
190name:            add_p3_s32_vgpr_vgpr_vgpr
191legalized:       true
192regBankSelected: true
193tracksRegLiveness: true
194
195body: |
196  bb.0:
197    liveins: $vgpr0, $vgpr1, $vgpr2
198
199    ; GFX8-LABEL: name: add_p3_s32_vgpr_vgpr_vgpr
200    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
201    ; GFX8-NEXT: {{  $}}
202    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
203    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
204    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
205    ; GFX8-NEXT: %3:vgpr_32, dead %6:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
206    ; GFX8-NEXT: %4:vgpr_32, dead %5:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY2]], %3, 0, implicit $exec
207    ; GFX8-NEXT: S_ENDPGM 0, implicit %4
208    ; GFX9-LABEL: name: add_p3_s32_vgpr_vgpr_vgpr
209    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
210    ; GFX9-NEXT: {{  $}}
211    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
212    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
213    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
214    ; GFX9-NEXT: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
215    ; GFX9-NEXT: [[V_ADD_U32_e64_1:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY2]], [[V_ADD_U32_e64_]], 0, implicit $exec
216    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_ADD_U32_e64_1]]
217    %0:vgpr(s32) = COPY $vgpr0
218    %1:vgpr(s32) = COPY $vgpr1
219    %2:vgpr(p3) = COPY $vgpr2
220    %3:vgpr(s32) = G_ADD %0, %1
221    %4:vgpr(p3) = G_PTR_ADD %2, %3
222    S_ENDPGM 0, implicit %4
223...
224
225---
226
227name:            add_p5_s32_vgpr_vgpr_vgpr
228legalized:       true
229regBankSelected: true
230tracksRegLiveness: true
231
232body: |
233  bb.0:
234    liveins: $vgpr0, $vgpr1, $vgpr2
235
236    ; GFX8-LABEL: name: add_p5_s32_vgpr_vgpr_vgpr
237    ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2
238    ; GFX8-NEXT: {{  $}}
239    ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
240    ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
241    ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
242    ; GFX8-NEXT: %3:vgpr_32, dead %6:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
243    ; GFX8-NEXT: %4:vgpr_32, dead %5:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY2]], %3, 0, implicit $exec
244    ; GFX8-NEXT: S_ENDPGM 0, implicit %4
245    ; GFX9-LABEL: name: add_p5_s32_vgpr_vgpr_vgpr
246    ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2
247    ; GFX9-NEXT: {{  $}}
248    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
249    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
250    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2
251    ; GFX9-NEXT: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY]], [[COPY1]], 0, implicit $exec
252    ; GFX9-NEXT: [[V_ADD_U32_e64_1:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY2]], [[V_ADD_U32_e64_]], 0, implicit $exec
253    ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_ADD_U32_e64_1]]
254    %0:vgpr(s32) = COPY $vgpr0
255    %1:vgpr(s32) = COPY $vgpr1
256    %2:vgpr(p5) = COPY $vgpr2
257    %3:vgpr(s32) = G_ADD %0, %1
258    %4:vgpr(p5) = G_PTR_ADD %2, %3
259    S_ENDPGM 0, implicit %4
260...
261