1# RUN: llc -march=amdgcn -run-pass peephole-opt -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s
2
3--- |
4  define amdgpu_kernel void @no_fold_imm_madak_mac_clamp_f32() #0 {
5    ret void
6  }
7
8  define amdgpu_kernel void @no_fold_imm_madak_mac_omod_f32() #0 {
9    ret void
10  }
11
12  define amdgpu_kernel void @no_fold_imm_madak_mad_clamp_f32() #0 {
13    ret void
14  }
15
16  define amdgpu_kernel void @no_fold_imm_madak_mad_omod_f32() #0 {
17    ret void
18  }
19
20  attributes #0 = { nounwind }
21
22...
23---
24# GCN-LABEL: name: no_fold_imm_madak_mac_clamp_f32
25# GCN: %23 = V_MOV_B32_e32 1090519040, implicit %exec
26# GCN-NEXT: %24 = V_MAC_F32_e64 0, killed %19, 0, killed %21, 0, %23, 1, 0, implicit %exec
27
28name:            no_fold_imm_madak_mac_clamp_f32
29tracksRegLiveness: true
30registers:
31  - { id: 0, class: sgpr_64 }
32  - { id: 1, class: sreg_32_xm0 }
33  - { id: 2, class: sgpr_32 }
34  - { id: 3, class: vgpr_32 }
35  - { id: 4, class: sreg_64_xexec }
36  - { id: 5, class: sreg_64_xexec }
37  - { id: 6, class: sreg_64_xexec }
38  - { id: 7, class: sreg_32 }
39  - { id: 8, class: sreg_32 }
40  - { id: 9, class: sreg_32_xm0 }
41  - { id: 10, class: sreg_64 }
42  - { id: 11, class: sreg_32_xm0 }
43  - { id: 12, class: sreg_32_xm0 }
44  - { id: 13, class: sgpr_64 }
45  - { id: 14, class: sgpr_128 }
46  - { id: 15, class: sreg_32_xm0 }
47  - { id: 16, class: sreg_64 }
48  - { id: 17, class: sgpr_128 }
49  - { id: 18, class: sgpr_128 }
50  - { id: 19, class: vgpr_32 }
51  - { id: 20, class: vreg_64 }
52  - { id: 21, class: vgpr_32 }
53  - { id: 22, class: vreg_64 }
54  - { id: 23, class: vgpr_32 }
55  - { id: 24, class: vgpr_32 }
56  - { id: 25, class: vgpr_32 }
57  - { id: 26, class: vreg_64 }
58  - { id: 27, class: vgpr_32 }
59  - { id: 28, class: vreg_64 }
60  - { id: 29, class: vreg_64 }
61liveins:
62  - { reg: '%sgpr0_sgpr1', virtual-reg: '%0' }
63  - { reg: '%vgpr0', virtual-reg: '%3' }
64body:             |
65  bb.0 (%ir-block.0):
66    liveins: %sgpr0_sgpr1, %vgpr0
67
68    %3 = COPY %vgpr0
69    %0 = COPY %sgpr0_sgpr1
70    %4 = S_LOAD_DWORDX2_IMM %0, 9, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
71    %5 = S_LOAD_DWORDX2_IMM %0, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
72    %6 = S_LOAD_DWORDX2_IMM %0, 13, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
73    %27 = V_ASHRREV_I32_e32 31, %3, implicit %exec
74    %28 = REG_SEQUENCE %3, 1, %27, 2
75    %11 = S_MOV_B32 61440
76    %12 = S_MOV_B32 0
77    %13 = REG_SEQUENCE killed %12, 1, killed %11, 2
78    %14 = REG_SEQUENCE killed %5, 17, %13, 18
79    %15 = S_MOV_B32 2
80    %29 = V_LSHL_B64 killed %28, killed %15, implicit %exec
81    %17 = REG_SEQUENCE killed %6, 17, %13, 18
82    %18 = REG_SEQUENCE killed %4, 17, %13, 18
83    %20 = COPY %29
84    %19 = BUFFER_LOAD_DWORD_ADDR64 %20, killed %14, 0, 0, 0, 0, 0, implicit %exec
85    %22 = COPY %29
86    %21 = BUFFER_LOAD_DWORD_ADDR64 %22, killed %17, 0, 0, 0, 0, 0, implicit %exec
87    %23 = V_MOV_B32_e32 1090519040, implicit %exec
88    %24 = V_MAC_F32_e64 0, killed %19, 0, killed %21, 0, %23, 1, 0, implicit %exec
89    %26 = COPY %29
90    BUFFER_STORE_DWORD_ADDR64 killed %24, %26, killed %18, 0, 0, 0, 0, 0, implicit %exec
91    S_ENDPGM
92
93...
94---
95# GCN-LABEL: name: no_fold_imm_madak_mac_omod_f32
96# GCN: %23 = V_MOV_B32_e32 1090519040, implicit %exec
97# GCN: %24 = V_MAC_F32_e64 0, killed %19, 0, killed %21, 0, %23, 0, 2, implicit %exec
98
99name:            no_fold_imm_madak_mac_omod_f32
100tracksRegLiveness: true
101registers:
102  - { id: 0, class: sgpr_64 }
103  - { id: 1, class: sreg_32_xm0 }
104  - { id: 2, class: sgpr_32 }
105  - { id: 3, class: vgpr_32 }
106  - { id: 4, class: sreg_64_xexec }
107  - { id: 5, class: sreg_64_xexec }
108  - { id: 6, class: sreg_64_xexec }
109  - { id: 7, class: sreg_32 }
110  - { id: 8, class: sreg_32 }
111  - { id: 9, class: sreg_32_xm0 }
112  - { id: 10, class: sreg_64 }
113  - { id: 11, class: sreg_32_xm0 }
114  - { id: 12, class: sreg_32_xm0 }
115  - { id: 13, class: sgpr_64 }
116  - { id: 14, class: sgpr_128 }
117  - { id: 15, class: sreg_32_xm0 }
118  - { id: 16, class: sreg_64 }
119  - { id: 17, class: sgpr_128 }
120  - { id: 18, class: sgpr_128 }
121  - { id: 19, class: vgpr_32 }
122  - { id: 20, class: vreg_64 }
123  - { id: 21, class: vgpr_32 }
124  - { id: 22, class: vreg_64 }
125  - { id: 23, class: vgpr_32 }
126  - { id: 24, class: vgpr_32 }
127  - { id: 25, class: vgpr_32 }
128  - { id: 26, class: vreg_64 }
129  - { id: 27, class: vgpr_32 }
130  - { id: 28, class: vreg_64 }
131  - { id: 29, class: vreg_64 }
132liveins:
133  - { reg: '%sgpr0_sgpr1', virtual-reg: '%0' }
134  - { reg: '%vgpr0', virtual-reg: '%3' }
135body:             |
136  bb.0 (%ir-block.0):
137    liveins: %sgpr0_sgpr1, %vgpr0
138
139    %3 = COPY %vgpr0
140    %0 = COPY %sgpr0_sgpr1
141    %4 = S_LOAD_DWORDX2_IMM %0, 9, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
142    %5 = S_LOAD_DWORDX2_IMM %0, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
143    %6 = S_LOAD_DWORDX2_IMM %0, 13, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
144    %27 = V_ASHRREV_I32_e32 31, %3, implicit %exec
145    %28 = REG_SEQUENCE %3, 1, %27, 2
146    %11 = S_MOV_B32 61440
147    %12 = S_MOV_B32 0
148    %13 = REG_SEQUENCE killed %12, 1, killed %11, 2
149    %14 = REG_SEQUENCE killed %5, 17, %13, 18
150    %15 = S_MOV_B32 2
151    %29 = V_LSHL_B64 killed %28, killed %15, implicit %exec
152    %17 = REG_SEQUENCE killed %6, 17, %13, 18
153    %18 = REG_SEQUENCE killed %4, 17, %13, 18
154    %20 = COPY %29
155    %19 = BUFFER_LOAD_DWORD_ADDR64 %20, killed %14, 0, 0, 0, 0, 0, implicit %exec
156    %22 = COPY %29
157    %21 = BUFFER_LOAD_DWORD_ADDR64 %22, killed %17, 0, 0, 0, 0, 0, implicit %exec
158    %23 = V_MOV_B32_e32 1090519040, implicit %exec
159    %24 = V_MAC_F32_e64 0, killed %19, 0, killed %21, 0, %23, 0, 2, implicit %exec
160    %26 = COPY %29
161    BUFFER_STORE_DWORD_ADDR64 killed %24, %26, killed %18, 0, 0, 0, 0, 0, implicit %exec
162    S_ENDPGM
163
164...
165---
166# GCN: name: no_fold_imm_madak_mad_clamp_f32
167# GCN: %23 = V_MOV_B32_e32 1090519040, implicit %exec
168# GCN: %24 = V_MAD_F32 0, killed %19, 0, killed %21, 0, %23, 1, 0, implicit %exec
169
170name:            no_fold_imm_madak_mad_clamp_f32
171tracksRegLiveness: true
172registers:
173  - { id: 0, class: sgpr_64 }
174  - { id: 1, class: sreg_32_xm0 }
175  - { id: 2, class: sgpr_32 }
176  - { id: 3, class: vgpr_32 }
177  - { id: 4, class: sreg_64_xexec }
178  - { id: 5, class: sreg_64_xexec }
179  - { id: 6, class: sreg_64_xexec }
180  - { id: 7, class: sreg_32 }
181  - { id: 8, class: sreg_32 }
182  - { id: 9, class: sreg_32_xm0 }
183  - { id: 10, class: sreg_64 }
184  - { id: 11, class: sreg_32_xm0 }
185  - { id: 12, class: sreg_32_xm0 }
186  - { id: 13, class: sgpr_64 }
187  - { id: 14, class: sgpr_128 }
188  - { id: 15, class: sreg_32_xm0 }
189  - { id: 16, class: sreg_64 }
190  - { id: 17, class: sgpr_128 }
191  - { id: 18, class: sgpr_128 }
192  - { id: 19, class: vgpr_32 }
193  - { id: 20, class: vreg_64 }
194  - { id: 21, class: vgpr_32 }
195  - { id: 22, class: vreg_64 }
196  - { id: 23, class: vgpr_32 }
197  - { id: 24, class: vgpr_32 }
198  - { id: 25, class: vgpr_32 }
199  - { id: 26, class: vreg_64 }
200  - { id: 27, class: vgpr_32 }
201  - { id: 28, class: vreg_64 }
202  - { id: 29, class: vreg_64 }
203liveins:
204  - { reg: '%sgpr0_sgpr1', virtual-reg: '%0' }
205  - { reg: '%vgpr0', virtual-reg: '%3' }
206body:             |
207  bb.0 (%ir-block.0):
208    liveins: %sgpr0_sgpr1, %vgpr0
209
210    %3 = COPY %vgpr0
211    %0 = COPY %sgpr0_sgpr1
212    %4 = S_LOAD_DWORDX2_IMM %0, 9, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
213    %5 = S_LOAD_DWORDX2_IMM %0, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
214    %6 = S_LOAD_DWORDX2_IMM %0, 13, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
215    %27 = V_ASHRREV_I32_e32 31, %3, implicit %exec
216    %28 = REG_SEQUENCE %3, 1, %27, 2
217    %11 = S_MOV_B32 61440
218    %12 = S_MOV_B32 0
219    %13 = REG_SEQUENCE killed %12, 1, killed %11, 2
220    %14 = REG_SEQUENCE killed %5, 17, %13, 18
221    %15 = S_MOV_B32 2
222    %29 = V_LSHL_B64 killed %28, killed %15, implicit %exec
223    %17 = REG_SEQUENCE killed %6, 17, %13, 18
224    %18 = REG_SEQUENCE killed %4, 17, %13, 18
225    %20 = COPY %29
226    %19 = BUFFER_LOAD_DWORD_ADDR64 %20, killed %14, 0, 0, 0, 0, 0, implicit %exec
227    %22 = COPY %29
228    %21 = BUFFER_LOAD_DWORD_ADDR64 %22, killed %17, 0, 0, 0, 0, 0, implicit %exec
229    %23 = V_MOV_B32_e32 1090519040, implicit %exec
230    %24 = V_MAD_F32 0, killed %19, 0, killed %21, 0, %23, 1, 0, implicit %exec
231    %26 = COPY %29
232    BUFFER_STORE_DWORD_ADDR64 killed %24, %26, killed %18, 0, 0, 0, 0, 0, implicit %exec
233    S_ENDPGM
234
235...
236---
237# GCN: name: no_fold_imm_madak_mad_omod_f32
238# GCN: %23 = V_MOV_B32_e32 1090519040, implicit %exec
239# GCN: %24 = V_MAD_F32 0, killed %19, 0, killed %21, 0, %23, 0, 1, implicit %exec
240
241name:            no_fold_imm_madak_mad_omod_f32
242tracksRegLiveness: true
243registers:
244  - { id: 0, class: sgpr_64 }
245  - { id: 1, class: sreg_32_xm0 }
246  - { id: 2, class: sgpr_32 }
247  - { id: 3, class: vgpr_32 }
248  - { id: 4, class: sreg_64_xexec }
249  - { id: 5, class: sreg_64_xexec }
250  - { id: 6, class: sreg_64_xexec }
251  - { id: 7, class: sreg_32 }
252  - { id: 8, class: sreg_32 }
253  - { id: 9, class: sreg_32_xm0 }
254  - { id: 10, class: sreg_64 }
255  - { id: 11, class: sreg_32_xm0 }
256  - { id: 12, class: sreg_32_xm0 }
257  - { id: 13, class: sgpr_64 }
258  - { id: 14, class: sgpr_128 }
259  - { id: 15, class: sreg_32_xm0 }
260  - { id: 16, class: sreg_64 }
261  - { id: 17, class: sgpr_128 }
262  - { id: 18, class: sgpr_128 }
263  - { id: 19, class: vgpr_32 }
264  - { id: 20, class: vreg_64 }
265  - { id: 21, class: vgpr_32 }
266  - { id: 22, class: vreg_64 }
267  - { id: 23, class: vgpr_32 }
268  - { id: 24, class: vgpr_32 }
269  - { id: 25, class: vgpr_32 }
270  - { id: 26, class: vreg_64 }
271  - { id: 27, class: vgpr_32 }
272  - { id: 28, class: vreg_64 }
273  - { id: 29, class: vreg_64 }
274liveins:
275  - { reg: '%sgpr0_sgpr1', virtual-reg: '%0' }
276  - { reg: '%vgpr0', virtual-reg: '%3' }
277body:             |
278  bb.0 (%ir-block.0):
279    liveins: %sgpr0_sgpr1, %vgpr0
280
281    %3 = COPY %vgpr0
282    %0 = COPY %sgpr0_sgpr1
283    %4 = S_LOAD_DWORDX2_IMM %0, 9, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
284    %5 = S_LOAD_DWORDX2_IMM %0, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
285    %6 = S_LOAD_DWORDX2_IMM %0, 13, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
286    %27 = V_ASHRREV_I32_e32 31, %3, implicit %exec
287    %28 = REG_SEQUENCE %3, 1, %27, 2
288    %11 = S_MOV_B32 61440
289    %12 = S_MOV_B32 0
290    %13 = REG_SEQUENCE killed %12, 1, killed %11, 2
291    %14 = REG_SEQUENCE killed %5, 17, %13, 18
292    %15 = S_MOV_B32 2
293    %29 = V_LSHL_B64 killed %28, killed %15, implicit %exec
294    %17 = REG_SEQUENCE killed %6, 17, %13, 18
295    %18 = REG_SEQUENCE killed %4, 17, %13, 18
296    %20 = COPY %29
297    %19 = BUFFER_LOAD_DWORD_ADDR64 %20, killed %14, 0, 0, 0, 0, 0, implicit %exec
298    %22 = COPY %29
299    %21 = BUFFER_LOAD_DWORD_ADDR64 %22, killed %17, 0, 0, 0, 0, 0, implicit %exec
300    %23 = V_MOV_B32_e32 1090519040, implicit %exec
301    %24 = V_MAD_F32 0, killed %19, 0, killed %21, 0, %23, 0, 1, implicit %exec
302    %26 = COPY %29
303    BUFFER_STORE_DWORD_ADDR64 killed %24, %26, killed %18, 0, 0, 0, 0, 0, implicit %exec
304    S_ENDPGM
305
306...
307