Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / fma-combine.ll
blob6316bbd021461ba0cc69af27c7fe21de87689cc9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -mcpu=tahiti -denormal-fp-math-f32=preserve-sign -verify-machineinstrs -fp-contract=fast < %s | FileCheck -enable-var-scope -check-prefixes=SI,SI-NOFMA %s
3 ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -mcpu=verde -denormal-fp-math-f32=preserve-sign -verify-machineinstrs -fp-contract=fast < %s | FileCheck -enable-var-scope -check-prefixes=SI,SI-NOFMA %s
4 ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -mcpu=tahiti -denormal-fp-math-f32=ieee -verify-machineinstrs -fp-contract=fast -enable-no-infs-fp-math -enable-unsafe-fp-math < %s | FileCheck -enable-var-scope -check-prefixes=SI,SI-FMA %s
5 ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -mcpu=gfx1100 -denormal-fp-math-f32=preserve-sign -verify-machineinstrs -fp-contract=fast < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-NOFMA %s
6 ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -mcpu=gfx1100 -denormal-fp-math-f32=ieee -verify-machineinstrs -fp-contract=fast -enable-no-infs-fp-math -enable-unsafe-fp-math < %s | FileCheck -enable-var-scope -check-prefixes=GFX11,GFX11-FMA %s
8 ; FIXME: Remove enable-unsafe-fp-math in RUN line and add flags to IR instrs
10 ; Note: The SI-FMA conversions of type x * (y + 1) --> x * y + x would be
11 ; beneficial even without fp32 denormals, but they do require no-infs-fp-math
12 ; for correctness.
14 declare i32 @llvm.amdgcn.workitem.id.x() #0
15 declare double @llvm.fabs.f64(double) #0
16 declare double @llvm.fma.f64(double, double, double) #0
17 declare float @llvm.fma.f32(float, float, float) #0
18 declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>) #0
20 ; (fadd (fmul x, y), z) -> (fma x, y, z)
21 define amdgpu_kernel void @combine_to_fma_f64_0(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
22 ; SI-LABEL: combine_to_fma_f64_0:
23 ; SI:       ; %bb.0:
24 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
25 ; SI-NEXT:    s_mov_b32 s7, 0xf000
26 ; SI-NEXT:    s_mov_b32 s6, 0
27 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
28 ; SI-NEXT:    v_mov_b32_e32 v1, 0
29 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
30 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
31 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
32 ; SI-NEXT:    s_waitcnt vmcnt(0)
33 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
34 ; SI-NEXT:    s_waitcnt vmcnt(0)
35 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
36 ; SI-NEXT:    s_waitcnt vmcnt(0)
37 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
38 ; SI-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[6:7]
39 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
40 ; SI-NEXT:    s_endpgm
42 ; GFX11-LABEL: combine_to_fma_f64_0:
43 ; GFX11:       ; %bb.0:
44 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
45 ; GFX11-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
46 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
47 ; GFX11-NEXT:    global_load_b64 v[0:1], v6, s[2:3] glc dlc
48 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
49 ; GFX11-NEXT:    global_load_b64 v[2:3], v6, s[2:3] offset:8 glc dlc
50 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
51 ; GFX11-NEXT:    global_load_b64 v[4:5], v6, s[2:3] offset:16 glc dlc
52 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
53 ; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
54 ; GFX11-NEXT:    global_store_b64 v6, v[0:1], s[0:1]
55 ; GFX11-NEXT:    s_nop 0
56 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
57 ; GFX11-NEXT:    s_endpgm
58   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
59   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
60   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
61   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
62   %gep.out = getelementptr double, ptr addrspace(1) %out, i32 %tid
64   %a = load volatile double, ptr addrspace(1) %gep.0
65   %b = load volatile double, ptr addrspace(1) %gep.1
66   %c = load volatile double, ptr addrspace(1) %gep.2
68   %mul = fmul double %a, %b
69   %fma = fadd double %mul, %c
70   store double %fma, ptr addrspace(1) %gep.out
71   ret void
74 ; (fadd (fmul x, y), z) -> (fma x, y, z)
75 define amdgpu_kernel void @combine_to_fma_f64_0_2use(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
76 ; SI-LABEL: combine_to_fma_f64_0_2use:
77 ; SI:       ; %bb.0:
78 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
79 ; SI-NEXT:    s_mov_b32 s7, 0xf000
80 ; SI-NEXT:    s_mov_b32 s6, 0
81 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
82 ; SI-NEXT:    v_mov_b32_e32 v1, 0
83 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
84 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
85 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
86 ; SI-NEXT:    s_waitcnt vmcnt(0)
87 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
88 ; SI-NEXT:    s_waitcnt vmcnt(0)
89 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
90 ; SI-NEXT:    s_waitcnt vmcnt(0)
91 ; SI-NEXT:    buffer_load_dwordx2 v[8:9], v[0:1], s[4:7], 0 addr64 offset:24 glc
92 ; SI-NEXT:    s_waitcnt vmcnt(0)
93 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
94 ; SI-NEXT:    v_fma_f64 v[6:7], v[2:3], v[4:5], v[6:7]
95 ; SI-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[8:9]
96 ; SI-NEXT:    buffer_store_dwordx2 v[6:7], v[0:1], s[0:3], 0 addr64
97 ; SI-NEXT:    s_waitcnt vmcnt(0)
98 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 offset:8
99 ; SI-NEXT:    s_waitcnt vmcnt(0)
100 ; SI-NEXT:    s_endpgm
102 ; GFX11-LABEL: combine_to_fma_f64_0_2use:
103 ; GFX11:       ; %bb.0:
104 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
105 ; GFX11-NEXT:    v_lshlrev_b32_e32 v8, 3, v0
106 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
107 ; GFX11-NEXT:    global_load_b64 v[0:1], v8, s[2:3] glc dlc
108 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
109 ; GFX11-NEXT:    global_load_b64 v[2:3], v8, s[2:3] offset:8 glc dlc
110 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
111 ; GFX11-NEXT:    global_load_b64 v[4:5], v8, s[2:3] offset:16 glc dlc
112 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
113 ; GFX11-NEXT:    global_load_b64 v[6:7], v8, s[2:3] offset:24 glc dlc
114 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
115 ; GFX11-NEXT:    v_fma_f64 v[4:5], v[0:1], v[2:3], v[4:5]
116 ; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[6:7]
117 ; GFX11-NEXT:    global_store_b64 v8, v[4:5], s[0:1] dlc
118 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
119 ; GFX11-NEXT:    global_store_b64 v8, v[0:1], s[0:1] offset:8 dlc
120 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
121 ; GFX11-NEXT:    s_nop 0
122 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
123 ; GFX11-NEXT:    s_endpgm
124   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
125   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
126   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
127   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
128   %gep.3 = getelementptr double, ptr addrspace(1) %gep.0, i32 3
129   %gep.out.0 = getelementptr double, ptr addrspace(1) %out, i32 %tid
130   %gep.out.1 = getelementptr double, ptr addrspace(1) %gep.out.0, i32 1
132   %a = load volatile double, ptr addrspace(1) %gep.0
133   %b = load volatile double, ptr addrspace(1) %gep.1
134   %c = load volatile double, ptr addrspace(1) %gep.2
135   %d = load volatile double, ptr addrspace(1) %gep.3
137   %mul = fmul double %a, %b
138   %fma0 = fadd double %mul, %c
139   %fma1 = fadd double %mul, %d
140   store volatile double %fma0, ptr addrspace(1) %gep.out.0
141   store volatile double %fma1, ptr addrspace(1) %gep.out.1
142   ret void
145 ; (fadd x, (fmul y, z)) -> (fma y, z, x)
146 define amdgpu_kernel void @combine_to_fma_f64_1(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
147 ; SI-LABEL: combine_to_fma_f64_1:
148 ; SI:       ; %bb.0:
149 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
150 ; SI-NEXT:    s_mov_b32 s7, 0xf000
151 ; SI-NEXT:    s_mov_b32 s6, 0
152 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
153 ; SI-NEXT:    v_mov_b32_e32 v1, 0
154 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
155 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
156 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
157 ; SI-NEXT:    s_waitcnt vmcnt(0)
158 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
159 ; SI-NEXT:    s_waitcnt vmcnt(0)
160 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
161 ; SI-NEXT:    s_waitcnt vmcnt(0)
162 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
163 ; SI-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[6:7]
164 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
165 ; SI-NEXT:    s_endpgm
167 ; GFX11-LABEL: combine_to_fma_f64_1:
168 ; GFX11:       ; %bb.0:
169 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
170 ; GFX11-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
171 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
172 ; GFX11-NEXT:    global_load_b64 v[0:1], v6, s[2:3] glc dlc
173 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
174 ; GFX11-NEXT:    global_load_b64 v[2:3], v6, s[2:3] offset:8 glc dlc
175 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
176 ; GFX11-NEXT:    global_load_b64 v[4:5], v6, s[2:3] offset:16 glc dlc
177 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
178 ; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
179 ; GFX11-NEXT:    global_store_b64 v6, v[0:1], s[0:1]
180 ; GFX11-NEXT:    s_nop 0
181 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
182 ; GFX11-NEXT:    s_endpgm
183   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
184   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
185   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
186   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
187   %gep.out = getelementptr double, ptr addrspace(1) %out, i32 %tid
189   %a = load volatile double, ptr addrspace(1) %gep.0
190   %b = load volatile double, ptr addrspace(1) %gep.1
191   %c = load volatile double, ptr addrspace(1) %gep.2
193   %mul = fmul double %a, %b
194   %fma = fadd double %c, %mul
195   store double %fma, ptr addrspace(1) %gep.out
196   ret void
199 ; (fsub (fmul x, y), z) -> (fma x, y, (fneg z))
200 define amdgpu_kernel void @combine_to_fma_fsub_0_f64(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
201 ; SI-LABEL: combine_to_fma_fsub_0_f64:
202 ; SI:       ; %bb.0:
203 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
204 ; SI-NEXT:    s_mov_b32 s7, 0xf000
205 ; SI-NEXT:    s_mov_b32 s6, 0
206 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
207 ; SI-NEXT:    v_mov_b32_e32 v1, 0
208 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
209 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
210 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
211 ; SI-NEXT:    s_waitcnt vmcnt(0)
212 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
213 ; SI-NEXT:    s_waitcnt vmcnt(0)
214 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
215 ; SI-NEXT:    s_waitcnt vmcnt(0)
216 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
217 ; SI-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], -v[6:7]
218 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
219 ; SI-NEXT:    s_endpgm
221 ; GFX11-LABEL: combine_to_fma_fsub_0_f64:
222 ; GFX11:       ; %bb.0:
223 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
224 ; GFX11-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
225 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
226 ; GFX11-NEXT:    global_load_b64 v[0:1], v6, s[2:3] glc dlc
227 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
228 ; GFX11-NEXT:    global_load_b64 v[2:3], v6, s[2:3] offset:8 glc dlc
229 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
230 ; GFX11-NEXT:    global_load_b64 v[4:5], v6, s[2:3] offset:16 glc dlc
231 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
232 ; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
233 ; GFX11-NEXT:    global_store_b64 v6, v[0:1], s[0:1]
234 ; GFX11-NEXT:    s_nop 0
235 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
236 ; GFX11-NEXT:    s_endpgm
237   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
238   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
239   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
240   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
241   %gep.out = getelementptr double, ptr addrspace(1) %out, i32 %tid
243   %a = load volatile double, ptr addrspace(1) %gep.0
244   %b = load volatile double, ptr addrspace(1) %gep.1
245   %c = load volatile double, ptr addrspace(1) %gep.2
247   %mul = fmul double %a, %b
248   %fma = fsub double %mul, %c
249   store double %fma, ptr addrspace(1) %gep.out
250   ret void
253 ; (fsub (fmul x, y), z) -> (fma x, y, (fneg z))
254 define amdgpu_kernel void @combine_to_fma_fsub_f64_0_2use(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
255 ; SI-LABEL: combine_to_fma_fsub_f64_0_2use:
256 ; SI:       ; %bb.0:
257 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
258 ; SI-NEXT:    s_mov_b32 s7, 0xf000
259 ; SI-NEXT:    s_mov_b32 s6, 0
260 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
261 ; SI-NEXT:    v_mov_b32_e32 v1, 0
262 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
263 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
264 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
265 ; SI-NEXT:    s_waitcnt vmcnt(0)
266 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
267 ; SI-NEXT:    s_waitcnt vmcnt(0)
268 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
269 ; SI-NEXT:    s_waitcnt vmcnt(0)
270 ; SI-NEXT:    buffer_load_dwordx2 v[8:9], v[0:1], s[4:7], 0 addr64 offset:24 glc
271 ; SI-NEXT:    s_waitcnt vmcnt(0)
272 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
273 ; SI-NEXT:    v_fma_f64 v[6:7], v[2:3], v[4:5], -v[6:7]
274 ; SI-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], -v[8:9]
275 ; SI-NEXT:    buffer_store_dwordx2 v[6:7], v[0:1], s[0:3], 0 addr64
276 ; SI-NEXT:    s_waitcnt vmcnt(0)
277 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 offset:8
278 ; SI-NEXT:    s_waitcnt vmcnt(0)
279 ; SI-NEXT:    s_endpgm
281 ; GFX11-LABEL: combine_to_fma_fsub_f64_0_2use:
282 ; GFX11:       ; %bb.0:
283 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
284 ; GFX11-NEXT:    v_lshlrev_b32_e32 v8, 3, v0
285 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
286 ; GFX11-NEXT:    global_load_b64 v[0:1], v8, s[2:3] glc dlc
287 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
288 ; GFX11-NEXT:    global_load_b64 v[2:3], v8, s[2:3] offset:8 glc dlc
289 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
290 ; GFX11-NEXT:    global_load_b64 v[4:5], v8, s[2:3] offset:16 glc dlc
291 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
292 ; GFX11-NEXT:    global_load_b64 v[6:7], v8, s[2:3] offset:24 glc dlc
293 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
294 ; GFX11-NEXT:    v_fma_f64 v[4:5], v[0:1], v[2:3], -v[4:5]
295 ; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[6:7]
296 ; GFX11-NEXT:    global_store_b64 v8, v[4:5], s[0:1] dlc
297 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
298 ; GFX11-NEXT:    global_store_b64 v8, v[0:1], s[0:1] offset:8 dlc
299 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
300 ; GFX11-NEXT:    s_nop 0
301 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
302 ; GFX11-NEXT:    s_endpgm
303   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
304   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
305   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
306   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
307   %gep.3 = getelementptr double, ptr addrspace(1) %gep.0, i32 3
308   %gep.out.0 = getelementptr double, ptr addrspace(1) %out, i32 %tid
309   %gep.out.1 = getelementptr double, ptr addrspace(1) %gep.out.0, i32 1
311   %a = load volatile double, ptr addrspace(1) %gep.0
312   %b = load volatile double, ptr addrspace(1) %gep.1
313   %c = load volatile double, ptr addrspace(1) %gep.2
314   %d = load volatile double, ptr addrspace(1) %gep.3
316   %mul = fmul double %a, %b
317   %fma0 = fsub double %mul, %c
318   %fma1 = fsub double %mul, %d
319   store volatile double %fma0, ptr addrspace(1) %gep.out.0
320   store volatile double %fma1, ptr addrspace(1) %gep.out.1
321   ret void
324 ; (fsub x, (fmul y, z)) -> (fma (fneg y), z, x)
325 define amdgpu_kernel void @combine_to_fma_fsub_1_f64(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
326 ; SI-LABEL: combine_to_fma_fsub_1_f64:
327 ; SI:       ; %bb.0:
328 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
329 ; SI-NEXT:    s_mov_b32 s7, 0xf000
330 ; SI-NEXT:    s_mov_b32 s6, 0
331 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
332 ; SI-NEXT:    v_mov_b32_e32 v1, 0
333 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
334 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
335 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
336 ; SI-NEXT:    s_waitcnt vmcnt(0)
337 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
338 ; SI-NEXT:    s_waitcnt vmcnt(0)
339 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
340 ; SI-NEXT:    s_waitcnt vmcnt(0)
341 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
342 ; SI-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[4:5], v[6:7]
343 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
344 ; SI-NEXT:    s_endpgm
346 ; GFX11-LABEL: combine_to_fma_fsub_1_f64:
347 ; GFX11:       ; %bb.0:
348 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
349 ; GFX11-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
350 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
351 ; GFX11-NEXT:    global_load_b64 v[0:1], v6, s[2:3] glc dlc
352 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
353 ; GFX11-NEXT:    global_load_b64 v[2:3], v6, s[2:3] offset:8 glc dlc
354 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
355 ; GFX11-NEXT:    global_load_b64 v[4:5], v6, s[2:3] offset:16 glc dlc
356 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
357 ; GFX11-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[4:5]
358 ; GFX11-NEXT:    global_store_b64 v6, v[0:1], s[0:1]
359 ; GFX11-NEXT:    s_nop 0
360 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
361 ; GFX11-NEXT:    s_endpgm
362   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
363   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
364   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
365   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
366   %gep.out = getelementptr double, ptr addrspace(1) %out, i32 %tid
368   %a = load volatile double, ptr addrspace(1) %gep.0
369   %b = load volatile double, ptr addrspace(1) %gep.1
370   %c = load volatile double, ptr addrspace(1) %gep.2
372   %mul = fmul double %a, %b
373   %fma = fsub double %c, %mul
374   store double %fma, ptr addrspace(1) %gep.out
375   ret void
378 ; (fsub x, (fmul y, z)) -> (fma (fneg y), z, x)
379 define amdgpu_kernel void @combine_to_fma_fsub_1_f64_2use(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
380 ; SI-LABEL: combine_to_fma_fsub_1_f64_2use:
381 ; SI:       ; %bb.0:
382 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
383 ; SI-NEXT:    s_mov_b32 s7, 0xf000
384 ; SI-NEXT:    s_mov_b32 s6, 0
385 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
386 ; SI-NEXT:    v_mov_b32_e32 v1, 0
387 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
388 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
389 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
390 ; SI-NEXT:    s_waitcnt vmcnt(0)
391 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
392 ; SI-NEXT:    s_waitcnt vmcnt(0)
393 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
394 ; SI-NEXT:    s_waitcnt vmcnt(0)
395 ; SI-NEXT:    buffer_load_dwordx2 v[8:9], v[0:1], s[4:7], 0 addr64 offset:24 glc
396 ; SI-NEXT:    s_waitcnt vmcnt(0)
397 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
398 ; SI-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], v[6:7]
399 ; SI-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[4:5], v[8:9]
400 ; SI-NEXT:    buffer_store_dwordx2 v[6:7], v[0:1], s[0:3], 0 addr64
401 ; SI-NEXT:    s_waitcnt vmcnt(0)
402 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 offset:8
403 ; SI-NEXT:    s_waitcnt vmcnt(0)
404 ; SI-NEXT:    s_endpgm
406 ; GFX11-LABEL: combine_to_fma_fsub_1_f64_2use:
407 ; GFX11:       ; %bb.0:
408 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
409 ; GFX11-NEXT:    v_lshlrev_b32_e32 v8, 3, v0
410 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
411 ; GFX11-NEXT:    global_load_b64 v[0:1], v8, s[2:3] glc dlc
412 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
413 ; GFX11-NEXT:    global_load_b64 v[2:3], v8, s[2:3] offset:8 glc dlc
414 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
415 ; GFX11-NEXT:    global_load_b64 v[4:5], v8, s[2:3] offset:16 glc dlc
416 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
417 ; GFX11-NEXT:    global_load_b64 v[6:7], v8, s[2:3] offset:24 glc dlc
418 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
419 ; GFX11-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], v[4:5]
420 ; GFX11-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[6:7]
421 ; GFX11-NEXT:    global_store_b64 v8, v[4:5], s[0:1] dlc
422 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
423 ; GFX11-NEXT:    global_store_b64 v8, v[0:1], s[0:1] offset:8 dlc
424 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
425 ; GFX11-NEXT:    s_nop 0
426 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
427 ; GFX11-NEXT:    s_endpgm
428   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
429   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
430   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
431   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
432   %gep.3 = getelementptr double, ptr addrspace(1) %gep.0, i32 3
433   %gep.out.0 = getelementptr double, ptr addrspace(1) %out, i32 %tid
434   %gep.out.1 = getelementptr double, ptr addrspace(1) %gep.out.0, i32 1
436   %a = load volatile double, ptr addrspace(1) %gep.0
437   %b = load volatile double, ptr addrspace(1) %gep.1
438   %c = load volatile double, ptr addrspace(1) %gep.2
439   %d = load volatile double, ptr addrspace(1) %gep.3
441   %mul = fmul double %a, %b
442   %fma0 = fsub double %c, %mul
443   %fma1 = fsub double %d, %mul
444   store volatile double %fma0, ptr addrspace(1) %gep.out.0
445   store volatile double %fma1, ptr addrspace(1) %gep.out.1
446   ret void
449 ; (fsub (fneg (fmul x, y)), z) -> (fma (fneg x), y, (fneg z))
450 define amdgpu_kernel void @combine_to_fma_fsub_2_f64(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
451 ; SI-LABEL: combine_to_fma_fsub_2_f64:
452 ; SI:       ; %bb.0:
453 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
454 ; SI-NEXT:    s_mov_b32 s7, 0xf000
455 ; SI-NEXT:    s_mov_b32 s6, 0
456 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
457 ; SI-NEXT:    v_mov_b32_e32 v1, 0
458 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
459 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
460 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
461 ; SI-NEXT:    s_waitcnt vmcnt(0)
462 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
463 ; SI-NEXT:    s_waitcnt vmcnt(0)
464 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
465 ; SI-NEXT:    s_waitcnt vmcnt(0)
466 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
467 ; SI-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[4:5], -v[6:7]
468 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
469 ; SI-NEXT:    s_endpgm
471 ; GFX11-LABEL: combine_to_fma_fsub_2_f64:
472 ; GFX11:       ; %bb.0:
473 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
474 ; GFX11-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
475 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
476 ; GFX11-NEXT:    global_load_b64 v[0:1], v6, s[2:3] glc dlc
477 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
478 ; GFX11-NEXT:    global_load_b64 v[2:3], v6, s[2:3] offset:8 glc dlc
479 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
480 ; GFX11-NEXT:    global_load_b64 v[4:5], v6, s[2:3] offset:16 glc dlc
481 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
482 ; GFX11-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], -v[4:5]
483 ; GFX11-NEXT:    global_store_b64 v6, v[0:1], s[0:1]
484 ; GFX11-NEXT:    s_nop 0
485 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
486 ; GFX11-NEXT:    s_endpgm
487   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
488   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
489   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
490   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
491   %gep.out = getelementptr double, ptr addrspace(1) %out, i32 %tid
493   %a = load volatile double, ptr addrspace(1) %gep.0
494   %b = load volatile double, ptr addrspace(1) %gep.1
495   %c = load volatile double, ptr addrspace(1) %gep.2
497   %mul = fmul double %a, %b
498   %mul.neg = fsub double -0.0, %mul
499   %fma = fsub double %mul.neg, %c
501   store double %fma, ptr addrspace(1) %gep.out
502   ret void
505 ; (fsub (fneg (fmul x, y)), z) -> (fma (fneg x), y, (fneg z))
506 define amdgpu_kernel void @combine_to_fma_fsub_2_f64_2uses_neg(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
507 ; SI-LABEL: combine_to_fma_fsub_2_f64_2uses_neg:
508 ; SI:       ; %bb.0:
509 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
510 ; SI-NEXT:    s_mov_b32 s7, 0xf000
511 ; SI-NEXT:    s_mov_b32 s6, 0
512 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
513 ; SI-NEXT:    v_mov_b32_e32 v1, 0
514 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
515 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
516 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
517 ; SI-NEXT:    s_waitcnt vmcnt(0)
518 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
519 ; SI-NEXT:    s_waitcnt vmcnt(0)
520 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
521 ; SI-NEXT:    s_waitcnt vmcnt(0)
522 ; SI-NEXT:    buffer_load_dwordx2 v[8:9], v[0:1], s[4:7], 0 addr64 offset:24 glc
523 ; SI-NEXT:    s_waitcnt vmcnt(0)
524 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
525 ; SI-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], -v[6:7]
526 ; SI-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[4:5], -v[8:9]
527 ; SI-NEXT:    buffer_store_dwordx2 v[6:7], v[0:1], s[0:3], 0 addr64
528 ; SI-NEXT:    s_waitcnt vmcnt(0)
529 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 offset:8
530 ; SI-NEXT:    s_waitcnt vmcnt(0)
531 ; SI-NEXT:    s_endpgm
533 ; GFX11-LABEL: combine_to_fma_fsub_2_f64_2uses_neg:
534 ; GFX11:       ; %bb.0:
535 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
536 ; GFX11-NEXT:    v_lshlrev_b32_e32 v8, 3, v0
537 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
538 ; GFX11-NEXT:    global_load_b64 v[0:1], v8, s[2:3] glc dlc
539 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
540 ; GFX11-NEXT:    global_load_b64 v[2:3], v8, s[2:3] offset:8 glc dlc
541 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
542 ; GFX11-NEXT:    global_load_b64 v[4:5], v8, s[2:3] offset:16 glc dlc
543 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
544 ; GFX11-NEXT:    global_load_b64 v[6:7], v8, s[2:3] offset:24 glc dlc
545 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
546 ; GFX11-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], -v[4:5]
547 ; GFX11-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], -v[6:7]
548 ; GFX11-NEXT:    global_store_b64 v8, v[4:5], s[0:1] dlc
549 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
550 ; GFX11-NEXT:    global_store_b64 v8, v[0:1], s[0:1] offset:8 dlc
551 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
552 ; GFX11-NEXT:    s_nop 0
553 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
554 ; GFX11-NEXT:    s_endpgm
555   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
556   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
557   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
558   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
559   %gep.3 = getelementptr double, ptr addrspace(1) %gep.0, i32 3
560   %gep.out.0 = getelementptr double, ptr addrspace(1) %out, i32 %tid
561   %gep.out.1 = getelementptr double, ptr addrspace(1) %gep.out.0, i32 1
563   %a = load volatile double, ptr addrspace(1) %gep.0
564   %b = load volatile double, ptr addrspace(1) %gep.1
565   %c = load volatile double, ptr addrspace(1) %gep.2
566   %d = load volatile double, ptr addrspace(1) %gep.3
568   %mul = fmul double %a, %b
569   %mul.neg = fsub double -0.0, %mul
570   %fma0 = fsub double %mul.neg, %c
571   %fma1 = fsub double %mul.neg, %d
573   store volatile double %fma0, ptr addrspace(1) %gep.out.0
574   store volatile double %fma1, ptr addrspace(1) %gep.out.1
575   ret void
578 ; (fsub (fneg (fmul x, y)), z) -> (fma (fneg x), y, (fneg z))
579 define amdgpu_kernel void @combine_to_fma_fsub_2_f64_2uses_mul(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
580 ; SI-LABEL: combine_to_fma_fsub_2_f64_2uses_mul:
581 ; SI:       ; %bb.0:
582 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
583 ; SI-NEXT:    s_mov_b32 s7, 0xf000
584 ; SI-NEXT:    s_mov_b32 s6, 0
585 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
586 ; SI-NEXT:    v_mov_b32_e32 v1, 0
587 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
588 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
589 ; SI-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
590 ; SI-NEXT:    s_waitcnt vmcnt(0)
591 ; SI-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
592 ; SI-NEXT:    s_waitcnt vmcnt(0)
593 ; SI-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
594 ; SI-NEXT:    s_waitcnt vmcnt(0)
595 ; SI-NEXT:    buffer_load_dwordx2 v[8:9], v[0:1], s[4:7], 0 addr64 offset:24 glc
596 ; SI-NEXT:    s_waitcnt vmcnt(0)
597 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
598 ; SI-NEXT:    v_fma_f64 v[6:7], -v[2:3], v[4:5], -v[6:7]
599 ; SI-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], -v[8:9]
600 ; SI-NEXT:    buffer_store_dwordx2 v[6:7], v[0:1], s[0:3], 0 addr64
601 ; SI-NEXT:    s_waitcnt vmcnt(0)
602 ; SI-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 offset:8
603 ; SI-NEXT:    s_waitcnt vmcnt(0)
604 ; SI-NEXT:    s_endpgm
606 ; GFX11-LABEL: combine_to_fma_fsub_2_f64_2uses_mul:
607 ; GFX11:       ; %bb.0:
608 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
609 ; GFX11-NEXT:    v_lshlrev_b32_e32 v8, 3, v0
610 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
611 ; GFX11-NEXT:    global_load_b64 v[0:1], v8, s[2:3] glc dlc
612 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
613 ; GFX11-NEXT:    global_load_b64 v[2:3], v8, s[2:3] offset:8 glc dlc
614 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
615 ; GFX11-NEXT:    global_load_b64 v[4:5], v8, s[2:3] offset:16 glc dlc
616 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
617 ; GFX11-NEXT:    global_load_b64 v[6:7], v8, s[2:3] offset:24 glc dlc
618 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
619 ; GFX11-NEXT:    v_fma_f64 v[4:5], -v[0:1], v[2:3], -v[4:5]
620 ; GFX11-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[6:7]
621 ; GFX11-NEXT:    global_store_b64 v8, v[4:5], s[0:1] dlc
622 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
623 ; GFX11-NEXT:    global_store_b64 v8, v[0:1], s[0:1] offset:8 dlc
624 ; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
625 ; GFX11-NEXT:    s_nop 0
626 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
627 ; GFX11-NEXT:    s_endpgm
628   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
629   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
630   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
631   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
632   %gep.3 = getelementptr double, ptr addrspace(1) %gep.0, i32 3
633   %gep.out.0 = getelementptr double, ptr addrspace(1) %out, i32 %tid
634   %gep.out.1 = getelementptr double, ptr addrspace(1) %gep.out.0, i32 1
636   %a = load volatile double, ptr addrspace(1) %gep.0
637   %b = load volatile double, ptr addrspace(1) %gep.1
638   %c = load volatile double, ptr addrspace(1) %gep.2
639   %d = load volatile double, ptr addrspace(1) %gep.3
641   %mul = fmul double %a, %b
642   %mul.neg = fsub double -0.0, %mul
643   %fma0 = fsub double %mul.neg, %c
644   %fma1 = fsub double %mul, %d
646   store volatile double %fma0, ptr addrspace(1) %gep.out.0
647   store volatile double %fma1, ptr addrspace(1) %gep.out.1
648   ret void
651 ; fold (fsub (fma x, y, (fmul u, v)), z) -> (fma x, y (fma u, v, (fneg z)))
652 define amdgpu_kernel void @aggressive_combine_to_fma_fsub_0_f64(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
653 ; SI-NOFMA-LABEL: aggressive_combine_to_fma_fsub_0_f64:
654 ; SI-NOFMA:       ; %bb.0:
655 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
656 ; SI-NOFMA-NEXT:    s_mov_b32 s7, 0xf000
657 ; SI-NOFMA-NEXT:    s_mov_b32 s6, 0
658 ; SI-NOFMA-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
659 ; SI-NOFMA-NEXT:    v_mov_b32_e32 v1, 0
660 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
661 ; SI-NOFMA-NEXT:    s_mov_b64 s[4:5], s[2:3]
662 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
663 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
664 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
665 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
666 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
667 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
668 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[8:9], v[0:1], s[4:7], 0 addr64 offset:24 glc
669 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
670 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[10:11], v[0:1], s[4:7], 0 addr64 offset:32 glc
671 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
672 ; SI-NOFMA-NEXT:    s_mov_b64 s[2:3], s[6:7]
673 ; SI-NOFMA-NEXT:    v_mul_f64 v[8:9], v[8:9], v[10:11]
674 ; SI-NOFMA-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[8:9]
675 ; SI-NOFMA-NEXT:    v_add_f64 v[2:3], v[2:3], -v[6:7]
676 ; SI-NOFMA-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
677 ; SI-NOFMA-NEXT:    s_endpgm
679 ; SI-FMA-LABEL: aggressive_combine_to_fma_fsub_0_f64:
680 ; SI-FMA:       ; %bb.0:
681 ; SI-FMA-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
682 ; SI-FMA-NEXT:    s_mov_b32 s7, 0xf000
683 ; SI-FMA-NEXT:    s_mov_b32 s6, 0
684 ; SI-FMA-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
685 ; SI-FMA-NEXT:    v_mov_b32_e32 v1, 0
686 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
687 ; SI-FMA-NEXT:    s_mov_b64 s[4:5], s[2:3]
688 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
689 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
690 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
691 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
692 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
693 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
694 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[8:9], v[0:1], s[4:7], 0 addr64 offset:24 glc
695 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
696 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[10:11], v[0:1], s[4:7], 0 addr64 offset:32 glc
697 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
698 ; SI-FMA-NEXT:    s_mov_b64 s[2:3], s[6:7]
699 ; SI-FMA-NEXT:    v_fma_f64 v[6:7], v[8:9], v[10:11], -v[6:7]
700 ; SI-FMA-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[6:7]
701 ; SI-FMA-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
702 ; SI-FMA-NEXT:    s_endpgm
704 ; GFX11-NOFMA-LABEL: aggressive_combine_to_fma_fsub_0_f64:
705 ; GFX11-NOFMA:       ; %bb.0:
706 ; GFX11-NOFMA-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
707 ; GFX11-NOFMA-NEXT:    v_lshlrev_b32_e32 v10, 3, v0
708 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
709 ; GFX11-NOFMA-NEXT:    global_load_b64 v[0:1], v10, s[2:3] glc dlc
710 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
711 ; GFX11-NOFMA-NEXT:    global_load_b64 v[2:3], v10, s[2:3] offset:8 glc dlc
712 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
713 ; GFX11-NOFMA-NEXT:    global_load_b64 v[4:5], v10, s[2:3] offset:16 glc dlc
714 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
715 ; GFX11-NOFMA-NEXT:    global_load_b64 v[6:7], v10, s[2:3] offset:24 glc dlc
716 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
717 ; GFX11-NOFMA-NEXT:    global_load_b64 v[8:9], v10, s[2:3] offset:32 glc dlc
718 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
719 ; GFX11-NOFMA-NEXT:    v_mul_f64 v[6:7], v[6:7], v[8:9]
720 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
721 ; GFX11-NOFMA-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[6:7]
722 ; GFX11-NOFMA-NEXT:    v_add_f64 v[0:1], v[0:1], -v[4:5]
723 ; GFX11-NOFMA-NEXT:    global_store_b64 v10, v[0:1], s[0:1]
724 ; GFX11-NOFMA-NEXT:    s_nop 0
725 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
726 ; GFX11-NOFMA-NEXT:    s_endpgm
728 ; GFX11-FMA-LABEL: aggressive_combine_to_fma_fsub_0_f64:
729 ; GFX11-FMA:       ; %bb.0:
730 ; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
731 ; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v10, 3, v0
732 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
733 ; GFX11-FMA-NEXT:    global_load_b64 v[0:1], v10, s[2:3] glc dlc
734 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
735 ; GFX11-FMA-NEXT:    global_load_b64 v[2:3], v10, s[2:3] offset:8 glc dlc
736 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
737 ; GFX11-FMA-NEXT:    global_load_b64 v[4:5], v10, s[2:3] offset:16 glc dlc
738 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
739 ; GFX11-FMA-NEXT:    global_load_b64 v[6:7], v10, s[2:3] offset:24 glc dlc
740 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
741 ; GFX11-FMA-NEXT:    global_load_b64 v[8:9], v10, s[2:3] offset:32 glc dlc
742 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
743 ; GFX11-FMA-NEXT:    v_fma_f64 v[4:5], v[6:7], v[8:9], -v[4:5]
744 ; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
745 ; GFX11-FMA-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
746 ; GFX11-FMA-NEXT:    global_store_b64 v10, v[0:1], s[0:1]
747 ; GFX11-FMA-NEXT:    s_nop 0
748 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
749 ; GFX11-FMA-NEXT:    s_endpgm
750   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
751   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
752   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
753   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
754   %gep.3 = getelementptr double, ptr addrspace(1) %gep.0, i32 3
755   %gep.4 = getelementptr double, ptr addrspace(1) %gep.0, i32 4
756   %gep.out = getelementptr double, ptr addrspace(1) %out, i32 %tid
758   %x = load volatile double, ptr addrspace(1) %gep.0
759   %y = load volatile double, ptr addrspace(1) %gep.1
760   %z = load volatile double, ptr addrspace(1) %gep.2
761   %u = load volatile double, ptr addrspace(1) %gep.3
762   %v = load volatile double, ptr addrspace(1) %gep.4
764   %tmp0 = fmul double %u, %v
765   %tmp1 = call double @llvm.fma.f64(double %x, double %y, double %tmp0) #0
766   %tmp2 = fsub double %tmp1, %z
768   store double %tmp2, ptr addrspace(1) %gep.out
769   ret void
772 ; fold (fsub x, (fma y, z, (fmul u, v)))
773 ;   -> (fma (fneg y), z, (fma (fneg u), v, x))
774 define amdgpu_kernel void @aggressive_combine_to_fma_fsub_1_f64(ptr addrspace(1) noalias %out, ptr addrspace(1) noalias %in) #1 {
775 ; SI-NOFMA-LABEL: aggressive_combine_to_fma_fsub_1_f64:
776 ; SI-NOFMA:       ; %bb.0:
777 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
778 ; SI-NOFMA-NEXT:    s_mov_b32 s7, 0xf000
779 ; SI-NOFMA-NEXT:    s_mov_b32 s6, 0
780 ; SI-NOFMA-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
781 ; SI-NOFMA-NEXT:    v_mov_b32_e32 v1, 0
782 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
783 ; SI-NOFMA-NEXT:    s_mov_b64 s[4:5], s[2:3]
784 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
785 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
786 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
787 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
788 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
789 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
790 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[8:9], v[0:1], s[4:7], 0 addr64 offset:24 glc
791 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
792 ; SI-NOFMA-NEXT:    buffer_load_dwordx2 v[10:11], v[0:1], s[4:7], 0 addr64 offset:32 glc
793 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
794 ; SI-NOFMA-NEXT:    s_mov_b64 s[2:3], s[6:7]
795 ; SI-NOFMA-NEXT:    v_mul_f64 v[8:9], v[8:9], v[10:11]
796 ; SI-NOFMA-NEXT:    v_fma_f64 v[4:5], v[4:5], v[6:7], v[8:9]
797 ; SI-NOFMA-NEXT:    v_add_f64 v[2:3], v[2:3], -v[4:5]
798 ; SI-NOFMA-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
799 ; SI-NOFMA-NEXT:    s_endpgm
801 ; SI-FMA-LABEL: aggressive_combine_to_fma_fsub_1_f64:
802 ; SI-FMA:       ; %bb.0:
803 ; SI-FMA-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
804 ; SI-FMA-NEXT:    s_mov_b32 s7, 0xf000
805 ; SI-FMA-NEXT:    s_mov_b32 s6, 0
806 ; SI-FMA-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
807 ; SI-FMA-NEXT:    v_mov_b32_e32 v1, 0
808 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
809 ; SI-FMA-NEXT:    s_mov_b64 s[4:5], s[2:3]
810 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64 glc
811 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
812 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64 offset:8 glc
813 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
814 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[6:7], v[0:1], s[4:7], 0 addr64 offset:16 glc
815 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
816 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[8:9], v[0:1], s[4:7], 0 addr64 offset:24 glc
817 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
818 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[10:11], v[0:1], s[4:7], 0 addr64 offset:32 glc
819 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
820 ; SI-FMA-NEXT:    s_mov_b64 s[2:3], s[6:7]
821 ; SI-FMA-NEXT:    v_fma_f64 v[2:3], -v[8:9], v[10:11], v[2:3]
822 ; SI-FMA-NEXT:    v_fma_f64 v[2:3], -v[4:5], v[6:7], v[2:3]
823 ; SI-FMA-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
824 ; SI-FMA-NEXT:    s_endpgm
826 ; GFX11-NOFMA-LABEL: aggressive_combine_to_fma_fsub_1_f64:
827 ; GFX11-NOFMA:       ; %bb.0:
828 ; GFX11-NOFMA-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
829 ; GFX11-NOFMA-NEXT:    v_lshlrev_b32_e32 v10, 3, v0
830 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
831 ; GFX11-NOFMA-NEXT:    global_load_b64 v[0:1], v10, s[2:3] glc dlc
832 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
833 ; GFX11-NOFMA-NEXT:    global_load_b64 v[2:3], v10, s[2:3] offset:8 glc dlc
834 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
835 ; GFX11-NOFMA-NEXT:    global_load_b64 v[4:5], v10, s[2:3] offset:16 glc dlc
836 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
837 ; GFX11-NOFMA-NEXT:    global_load_b64 v[6:7], v10, s[2:3] offset:24 glc dlc
838 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
839 ; GFX11-NOFMA-NEXT:    global_load_b64 v[8:9], v10, s[2:3] offset:32 glc dlc
840 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
841 ; GFX11-NOFMA-NEXT:    v_mul_f64 v[6:7], v[6:7], v[8:9]
842 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
843 ; GFX11-NOFMA-NEXT:    v_fma_f64 v[2:3], v[2:3], v[4:5], v[6:7]
844 ; GFX11-NOFMA-NEXT:    v_add_f64 v[0:1], v[0:1], -v[2:3]
845 ; GFX11-NOFMA-NEXT:    global_store_b64 v10, v[0:1], s[0:1]
846 ; GFX11-NOFMA-NEXT:    s_nop 0
847 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
848 ; GFX11-NOFMA-NEXT:    s_endpgm
850 ; GFX11-FMA-LABEL: aggressive_combine_to_fma_fsub_1_f64:
851 ; GFX11-FMA:       ; %bb.0:
852 ; GFX11-FMA-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
853 ; GFX11-FMA-NEXT:    v_lshlrev_b32_e32 v10, 3, v0
854 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
855 ; GFX11-FMA-NEXT:    global_load_b64 v[0:1], v10, s[2:3] glc dlc
856 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
857 ; GFX11-FMA-NEXT:    global_load_b64 v[2:3], v10, s[2:3] offset:8 glc dlc
858 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
859 ; GFX11-FMA-NEXT:    global_load_b64 v[4:5], v10, s[2:3] offset:16 glc dlc
860 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
861 ; GFX11-FMA-NEXT:    global_load_b64 v[6:7], v10, s[2:3] offset:24 glc dlc
862 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
863 ; GFX11-FMA-NEXT:    global_load_b64 v[8:9], v10, s[2:3] offset:32 glc dlc
864 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
865 ; GFX11-FMA-NEXT:    v_fma_f64 v[0:1], -v[6:7], v[8:9], v[0:1]
866 ; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
867 ; GFX11-FMA-NEXT:    v_fma_f64 v[0:1], -v[2:3], v[4:5], v[0:1]
868 ; GFX11-FMA-NEXT:    global_store_b64 v10, v[0:1], s[0:1]
869 ; GFX11-FMA-NEXT:    s_nop 0
870 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
871 ; GFX11-FMA-NEXT:    s_endpgm
872   %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0
873   %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid
874   %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1
875   %gep.2 = getelementptr double, ptr addrspace(1) %gep.0, i32 2
876   %gep.3 = getelementptr double, ptr addrspace(1) %gep.0, i32 3
877   %gep.4 = getelementptr double, ptr addrspace(1) %gep.0, i32 4
878   %gep.out = getelementptr double, ptr addrspace(1) %out, i32 %tid
880   %x = load volatile double, ptr addrspace(1) %gep.0
881   %y = load volatile double, ptr addrspace(1) %gep.1
882   %z = load volatile double, ptr addrspace(1) %gep.2
883   %u = load volatile double, ptr addrspace(1) %gep.3
884   %v = load volatile double, ptr addrspace(1) %gep.4
886   ; nsz flag is needed since this combine may change sign of zero
887   %tmp0 = fmul nsz double %u, %v
888   %tmp1 = call nsz double @llvm.fma.f64(double %y, double %z, double %tmp0) #0
889   %tmp2 = fsub nsz double %x, %tmp1
891   store double %tmp2, ptr addrspace(1) %gep.out
892   ret void
896 ; Patterns (+ fneg variants): mul(add(1.0,x),y), mul(sub(1.0,x),y), mul(sub(x,1.0),y)
899 define amdgpu_kernel void @test_f32_mul_add_x_one_y(ptr addrspace(1) %out,
900 ; SI-NOFMA-LABEL: test_f32_mul_add_x_one_y:
901 ; SI-NOFMA:       ; %bb.0:
902 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
903 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
904 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
905 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
906 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
907 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
908 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
909 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
910 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
911 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
912 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
913 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0 glc
914 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
915 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0 glc
916 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
917 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
918 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
919 ; SI-NOFMA-NEXT:    v_add_f32_e32 v0, 1.0, v0
920 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v0, v1
921 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
922 ; SI-NOFMA-NEXT:    s_endpgm
924 ; SI-FMA-LABEL: test_f32_mul_add_x_one_y:
925 ; SI-FMA:       ; %bb.0:
926 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
927 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
928 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
929 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
930 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
931 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
932 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
933 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
934 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
935 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
936 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
937 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0 glc
938 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
939 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0 glc
940 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
941 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
942 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
943 ; SI-FMA-NEXT:    v_fma_f32 v0, v0, v1, v1
944 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
945 ; SI-FMA-NEXT:    s_endpgm
947 ; GFX11-NOFMA-LABEL: test_f32_mul_add_x_one_y:
948 ; GFX11-NOFMA:       ; %bb.0:
949 ; GFX11-NOFMA-NEXT:    s_clause 0x1
950 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
951 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
952 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
953 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
954 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7] glc dlc
955 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
956 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1] glc dlc
957 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
958 ; GFX11-NOFMA-NEXT:    v_add_f32_e32 v1, 1.0, v1
959 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
960 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v1, v2
961 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
962 ; GFX11-NOFMA-NEXT:    s_nop 0
963 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
964 ; GFX11-NOFMA-NEXT:    s_endpgm
966 ; GFX11-FMA-LABEL: test_f32_mul_add_x_one_y:
967 ; GFX11-FMA:       ; %bb.0:
968 ; GFX11-FMA-NEXT:    s_clause 0x1
969 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
970 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
971 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
972 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
973 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7] glc dlc
974 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
975 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1] glc dlc
976 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
977 ; GFX11-FMA-NEXT:    v_fmac_f32_e32 v2, v1, v2
978 ; GFX11-FMA-NEXT:    global_store_b32 v0, v2, s[4:5]
979 ; GFX11-FMA-NEXT:    s_nop 0
980 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
981 ; GFX11-FMA-NEXT:    s_endpgm
982                                         ptr addrspace(1) %in1,
983                                         ptr addrspace(1) %in2) {
984   %x = load volatile float, ptr addrspace(1) %in1
985   %y = load volatile float, ptr addrspace(1) %in2
986   %a = fadd float %x, 1.0
987   %m = fmul float %a, %y
988   store float %m, ptr addrspace(1) %out
989   ret void
992 define amdgpu_kernel void @test_f32_mul_y_add_x_one(ptr addrspace(1) %out,
993 ; SI-NOFMA-LABEL: test_f32_mul_y_add_x_one:
994 ; SI-NOFMA:       ; %bb.0:
995 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
996 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
997 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
998 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
999 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1000 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1001 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1002 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1003 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1004 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1005 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1006 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0 glc
1007 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1008 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0 glc
1009 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1010 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1011 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1012 ; SI-NOFMA-NEXT:    v_add_f32_e32 v0, 1.0, v0
1013 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v1, v0
1014 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1015 ; SI-NOFMA-NEXT:    s_endpgm
1017 ; SI-FMA-LABEL: test_f32_mul_y_add_x_one:
1018 ; SI-FMA:       ; %bb.0:
1019 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1020 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1021 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1022 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1023 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1024 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1025 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1026 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1027 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1028 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1029 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1030 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0 glc
1031 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1032 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0 glc
1033 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1034 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1035 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1036 ; SI-FMA-NEXT:    v_fma_f32 v0, v0, v1, v1
1037 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1038 ; SI-FMA-NEXT:    s_endpgm
1040 ; GFX11-NOFMA-LABEL: test_f32_mul_y_add_x_one:
1041 ; GFX11-NOFMA:       ; %bb.0:
1042 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1043 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1044 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1045 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1046 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1047 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7] glc dlc
1048 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1049 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1] glc dlc
1050 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1051 ; GFX11-NOFMA-NEXT:    v_add_f32_e32 v1, 1.0, v1
1052 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1053 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v2, v1
1054 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1055 ; GFX11-NOFMA-NEXT:    s_nop 0
1056 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1057 ; GFX11-NOFMA-NEXT:    s_endpgm
1059 ; GFX11-FMA-LABEL: test_f32_mul_y_add_x_one:
1060 ; GFX11-FMA:       ; %bb.0:
1061 ; GFX11-FMA-NEXT:    s_clause 0x1
1062 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1063 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1064 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1065 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1066 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7] glc dlc
1067 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1068 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1] glc dlc
1069 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1070 ; GFX11-FMA-NEXT:    v_fmac_f32_e32 v2, v1, v2
1071 ; GFX11-FMA-NEXT:    global_store_b32 v0, v2, s[4:5]
1072 ; GFX11-FMA-NEXT:    s_nop 0
1073 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1074 ; GFX11-FMA-NEXT:    s_endpgm
1075                                         ptr addrspace(1) %in1,
1076                                         ptr addrspace(1) %in2) {
1077   %x = load volatile float, ptr addrspace(1) %in1
1078   %y = load volatile float, ptr addrspace(1) %in2
1079   %a = fadd float %x, 1.0
1080   %m = fmul float %y, %a
1081   store float %m, ptr addrspace(1) %out
1082   ret void
1085 define amdgpu_kernel void @test_f32_mul_add_x_negone_y(ptr addrspace(1) %out,
1086 ; SI-NOFMA-LABEL: test_f32_mul_add_x_negone_y:
1087 ; SI-NOFMA:       ; %bb.0:
1088 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1089 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1090 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1091 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1092 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1093 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1094 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1095 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1096 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1097 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1098 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1099 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1100 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1101 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1102 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1103 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1104 ; SI-NOFMA-NEXT:    v_add_f32_e32 v0, -1.0, v0
1105 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1106 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v0, v1
1107 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1108 ; SI-NOFMA-NEXT:    s_endpgm
1110 ; SI-FMA-LABEL: test_f32_mul_add_x_negone_y:
1111 ; SI-FMA:       ; %bb.0:
1112 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1113 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1114 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1115 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1116 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1117 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1118 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1119 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1120 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1121 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1122 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1123 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1124 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1125 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1126 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1127 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1128 ; SI-FMA-NEXT:    v_fma_f32 v0, v0, v1, -v1
1129 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1130 ; SI-FMA-NEXT:    s_endpgm
1132 ; GFX11-NOFMA-LABEL: test_f32_mul_add_x_negone_y:
1133 ; GFX11-NOFMA:       ; %bb.0:
1134 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1135 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1136 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1137 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1138 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1139 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1140 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1141 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1142 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1143 ; GFX11-NOFMA-NEXT:    v_add_f32_e32 v1, -1.0, v1
1144 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1145 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1146 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v1, v2
1147 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1148 ; GFX11-NOFMA-NEXT:    s_nop 0
1149 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1150 ; GFX11-NOFMA-NEXT:    s_endpgm
1152 ; GFX11-FMA-LABEL: test_f32_mul_add_x_negone_y:
1153 ; GFX11-FMA:       ; %bb.0:
1154 ; GFX11-FMA-NEXT:    s_clause 0x1
1155 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1156 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1157 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1158 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1159 ; GFX11-FMA-NEXT:    s_clause 0x1
1160 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1161 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1162 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1163 ; GFX11-FMA-NEXT:    v_fma_f32 v1, v1, v2, -v2
1164 ; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1165 ; GFX11-FMA-NEXT:    s_nop 0
1166 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1167 ; GFX11-FMA-NEXT:    s_endpgm
1168                                            ptr addrspace(1) %in1,
1169                                            ptr addrspace(1) %in2) {
1170   %x = load float, ptr addrspace(1) %in1
1171   %y = load float, ptr addrspace(1) %in2
1172   %a = fadd float %x, -1.0
1173   %m = fmul float %a, %y
1174   store float %m, ptr addrspace(1) %out
1175   ret void
1178 define amdgpu_kernel void @test_f32_mul_y_add_x_negone(ptr addrspace(1) %out,
1179 ; SI-NOFMA-LABEL: test_f32_mul_y_add_x_negone:
1180 ; SI-NOFMA:       ; %bb.0:
1181 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1182 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1183 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1184 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1185 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1186 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1187 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1188 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1189 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1190 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1191 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1192 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1193 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1194 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1195 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1196 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1197 ; SI-NOFMA-NEXT:    v_add_f32_e32 v0, -1.0, v0
1198 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1199 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v1, v0
1200 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1201 ; SI-NOFMA-NEXT:    s_endpgm
1203 ; SI-FMA-LABEL: test_f32_mul_y_add_x_negone:
1204 ; SI-FMA:       ; %bb.0:
1205 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1206 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1207 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1208 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1209 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1210 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1211 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1212 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1213 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1214 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1215 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1216 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1217 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1218 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1219 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1220 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1221 ; SI-FMA-NEXT:    v_fma_f32 v0, v0, v1, -v1
1222 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1223 ; SI-FMA-NEXT:    s_endpgm
1225 ; GFX11-NOFMA-LABEL: test_f32_mul_y_add_x_negone:
1226 ; GFX11-NOFMA:       ; %bb.0:
1227 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1228 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1229 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1230 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1231 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1232 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1233 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1234 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1235 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1236 ; GFX11-NOFMA-NEXT:    v_add_f32_e32 v1, -1.0, v1
1237 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1238 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1239 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v2, v1
1240 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1241 ; GFX11-NOFMA-NEXT:    s_nop 0
1242 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1243 ; GFX11-NOFMA-NEXT:    s_endpgm
1245 ; GFX11-FMA-LABEL: test_f32_mul_y_add_x_negone:
1246 ; GFX11-FMA:       ; %bb.0:
1247 ; GFX11-FMA-NEXT:    s_clause 0x1
1248 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1249 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1250 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1251 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1252 ; GFX11-FMA-NEXT:    s_clause 0x1
1253 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1254 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1255 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1256 ; GFX11-FMA-NEXT:    v_fma_f32 v1, v1, v2, -v2
1257 ; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1258 ; GFX11-FMA-NEXT:    s_nop 0
1259 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1260 ; GFX11-FMA-NEXT:    s_endpgm
1261                                            ptr addrspace(1) %in1,
1262                                            ptr addrspace(1) %in2) {
1263   %x = load float, ptr addrspace(1) %in1
1264   %y = load float, ptr addrspace(1) %in2
1265   %a = fadd float %x, -1.0
1266   %m = fmul float %y, %a
1267   store float %m, ptr addrspace(1) %out
1268   ret void
1271 define amdgpu_kernel void @test_f32_mul_sub_one_x_y(ptr addrspace(1) %out,
1272 ; SI-NOFMA-LABEL: test_f32_mul_sub_one_x_y:
1273 ; SI-NOFMA:       ; %bb.0:
1274 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1275 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1276 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1277 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1278 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1279 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1280 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1281 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1282 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1283 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1284 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1285 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1286 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1287 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1288 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1289 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1290 ; SI-NOFMA-NEXT:    v_sub_f32_e32 v0, 1.0, v0
1291 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1292 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v0, v1
1293 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1294 ; SI-NOFMA-NEXT:    s_endpgm
1296 ; SI-FMA-LABEL: test_f32_mul_sub_one_x_y:
1297 ; SI-FMA:       ; %bb.0:
1298 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1299 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1300 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1301 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1302 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1303 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1304 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1305 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1306 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1307 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1308 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1309 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1310 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1311 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1312 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1313 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1314 ; SI-FMA-NEXT:    v_fma_f32 v0, -v0, v1, v1
1315 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1316 ; SI-FMA-NEXT:    s_endpgm
1318 ; GFX11-NOFMA-LABEL: test_f32_mul_sub_one_x_y:
1319 ; GFX11-NOFMA:       ; %bb.0:
1320 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1321 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1322 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1323 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1324 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1325 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1326 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1327 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1328 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1329 ; GFX11-NOFMA-NEXT:    v_sub_f32_e32 v1, 1.0, v1
1330 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1331 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1332 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v1, v2
1333 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1334 ; GFX11-NOFMA-NEXT:    s_nop 0
1335 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1336 ; GFX11-NOFMA-NEXT:    s_endpgm
1338 ; GFX11-FMA-LABEL: test_f32_mul_sub_one_x_y:
1339 ; GFX11-FMA:       ; %bb.0:
1340 ; GFX11-FMA-NEXT:    s_clause 0x1
1341 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1342 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1343 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1344 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1345 ; GFX11-FMA-NEXT:    s_clause 0x1
1346 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1347 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1348 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1349 ; GFX11-FMA-NEXT:    v_fma_f32 v1, -v1, v2, v2
1350 ; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1351 ; GFX11-FMA-NEXT:    s_nop 0
1352 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1353 ; GFX11-FMA-NEXT:    s_endpgm
1354                                         ptr addrspace(1) %in1,
1355                                         ptr addrspace(1) %in2) {
1356   %x = load float, ptr addrspace(1) %in1
1357   %y = load float, ptr addrspace(1) %in2
1358   %s = fsub float 1.0, %x
1359   %m = fmul float %s, %y
1360   store float %m, ptr addrspace(1) %out
1361   ret void
1364 define amdgpu_kernel void @test_f32_mul_y_sub_one_x(ptr addrspace(1) %out,
1365 ; SI-NOFMA-LABEL: test_f32_mul_y_sub_one_x:
1366 ; SI-NOFMA:       ; %bb.0:
1367 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1368 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1369 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1370 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1371 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1372 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1373 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1374 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1375 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1376 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1377 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1378 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1379 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1380 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1381 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1382 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1383 ; SI-NOFMA-NEXT:    v_sub_f32_e32 v0, 1.0, v0
1384 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1385 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v1, v0
1386 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1387 ; SI-NOFMA-NEXT:    s_endpgm
1389 ; SI-FMA-LABEL: test_f32_mul_y_sub_one_x:
1390 ; SI-FMA:       ; %bb.0:
1391 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1392 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1393 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1394 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1395 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1396 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1397 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1398 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1399 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1400 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1401 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1402 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1403 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1404 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1405 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1406 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1407 ; SI-FMA-NEXT:    v_fma_f32 v0, -v0, v1, v1
1408 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1409 ; SI-FMA-NEXT:    s_endpgm
1411 ; GFX11-NOFMA-LABEL: test_f32_mul_y_sub_one_x:
1412 ; GFX11-NOFMA:       ; %bb.0:
1413 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1414 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1415 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1416 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1417 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1418 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1419 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1420 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1421 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1422 ; GFX11-NOFMA-NEXT:    v_sub_f32_e32 v1, 1.0, v1
1423 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1424 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1425 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v2, v1
1426 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1427 ; GFX11-NOFMA-NEXT:    s_nop 0
1428 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1429 ; GFX11-NOFMA-NEXT:    s_endpgm
1431 ; GFX11-FMA-LABEL: test_f32_mul_y_sub_one_x:
1432 ; GFX11-FMA:       ; %bb.0:
1433 ; GFX11-FMA-NEXT:    s_clause 0x1
1434 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1435 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1436 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1437 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1438 ; GFX11-FMA-NEXT:    s_clause 0x1
1439 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1440 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1441 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1442 ; GFX11-FMA-NEXT:    v_fma_f32 v1, -v1, v2, v2
1443 ; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1444 ; GFX11-FMA-NEXT:    s_nop 0
1445 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1446 ; GFX11-FMA-NEXT:    s_endpgm
1447                                         ptr addrspace(1) %in1,
1448                                         ptr addrspace(1) %in2) {
1449   %x = load float, ptr addrspace(1) %in1
1450   %y = load float, ptr addrspace(1) %in2
1451   %s = fsub float 1.0, %x
1452   %m = fmul float %y, %s
1453   store float %m, ptr addrspace(1) %out
1454   ret void
1457 define amdgpu_kernel void @test_f32_mul_sub_negone_x_y(ptr addrspace(1) %out,
1458 ; SI-NOFMA-LABEL: test_f32_mul_sub_negone_x_y:
1459 ; SI-NOFMA:       ; %bb.0:
1460 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1461 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1462 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1463 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1464 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1465 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1466 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1467 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1468 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1469 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1470 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1471 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1472 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1473 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1474 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1475 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1476 ; SI-NOFMA-NEXT:    v_sub_f32_e32 v0, -1.0, v0
1477 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1478 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v0, v1
1479 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1480 ; SI-NOFMA-NEXT:    s_endpgm
1482 ; SI-FMA-LABEL: test_f32_mul_sub_negone_x_y:
1483 ; SI-FMA:       ; %bb.0:
1484 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1485 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1486 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1487 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1488 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1489 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1490 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1491 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1492 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1493 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1494 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1495 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1496 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1497 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1498 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1499 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1500 ; SI-FMA-NEXT:    v_fma_f32 v0, -v0, v1, -v1
1501 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1502 ; SI-FMA-NEXT:    s_endpgm
1504 ; GFX11-NOFMA-LABEL: test_f32_mul_sub_negone_x_y:
1505 ; GFX11-NOFMA:       ; %bb.0:
1506 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1507 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1508 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1509 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1510 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1511 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1512 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1513 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1514 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1515 ; GFX11-NOFMA-NEXT:    v_sub_f32_e32 v1, -1.0, v1
1516 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1517 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1518 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v1, v2
1519 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1520 ; GFX11-NOFMA-NEXT:    s_nop 0
1521 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1522 ; GFX11-NOFMA-NEXT:    s_endpgm
1524 ; GFX11-FMA-LABEL: test_f32_mul_sub_negone_x_y:
1525 ; GFX11-FMA:       ; %bb.0:
1526 ; GFX11-FMA-NEXT:    s_clause 0x1
1527 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1528 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1529 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1530 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1531 ; GFX11-FMA-NEXT:    s_clause 0x1
1532 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1533 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1534 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1535 ; GFX11-FMA-NEXT:    v_fma_f32 v1, -v1, v2, -v2
1536 ; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1537 ; GFX11-FMA-NEXT:    s_nop 0
1538 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1539 ; GFX11-FMA-NEXT:    s_endpgm
1540                                            ptr addrspace(1) %in1,
1541                                            ptr addrspace(1) %in2) {
1542   %x = load float, ptr addrspace(1) %in1
1543   %y = load float, ptr addrspace(1) %in2
1544   %s = fsub float -1.0, %x
1545   %m = fmul float %s, %y
1546   store float %m, ptr addrspace(1) %out
1547   ret void
1550 define amdgpu_kernel void @test_f32_mul_y_sub_negone_x(ptr addrspace(1) %out,
1551 ; SI-NOFMA-LABEL: test_f32_mul_y_sub_negone_x:
1552 ; SI-NOFMA:       ; %bb.0:
1553 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1554 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1555 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1556 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1557 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1558 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1559 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1560 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1561 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1562 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1563 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1564 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1565 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1566 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1567 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1568 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1569 ; SI-NOFMA-NEXT:    v_sub_f32_e32 v0, -1.0, v0
1570 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1571 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v1, v0
1572 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1573 ; SI-NOFMA-NEXT:    s_endpgm
1575 ; SI-FMA-LABEL: test_f32_mul_y_sub_negone_x:
1576 ; SI-FMA:       ; %bb.0:
1577 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1578 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1579 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1580 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1581 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1582 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1583 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1584 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1585 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1586 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1587 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1588 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1589 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1590 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1591 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1592 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1593 ; SI-FMA-NEXT:    v_fma_f32 v0, -v0, v1, -v1
1594 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1595 ; SI-FMA-NEXT:    s_endpgm
1597 ; GFX11-NOFMA-LABEL: test_f32_mul_y_sub_negone_x:
1598 ; GFX11-NOFMA:       ; %bb.0:
1599 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1600 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1601 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1602 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1603 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1604 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1605 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1606 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1607 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1608 ; GFX11-NOFMA-NEXT:    v_sub_f32_e32 v1, -1.0, v1
1609 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1610 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1611 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v2, v1
1612 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1613 ; GFX11-NOFMA-NEXT:    s_nop 0
1614 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1615 ; GFX11-NOFMA-NEXT:    s_endpgm
1617 ; GFX11-FMA-LABEL: test_f32_mul_y_sub_negone_x:
1618 ; GFX11-FMA:       ; %bb.0:
1619 ; GFX11-FMA-NEXT:    s_clause 0x1
1620 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1621 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1622 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1623 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1624 ; GFX11-FMA-NEXT:    s_clause 0x1
1625 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1626 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1627 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1628 ; GFX11-FMA-NEXT:    v_fma_f32 v1, -v1, v2, -v2
1629 ; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1630 ; GFX11-FMA-NEXT:    s_nop 0
1631 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1632 ; GFX11-FMA-NEXT:    s_endpgm
1633                                          ptr addrspace(1) %in1,
1634                                          ptr addrspace(1) %in2) {
1635   %x = load float, ptr addrspace(1) %in1
1636   %y = load float, ptr addrspace(1) %in2
1637   %s = fsub float -1.0, %x
1638   %m = fmul float %y, %s
1639   store float %m, ptr addrspace(1) %out
1640   ret void
1643 define amdgpu_kernel void @test_f32_mul_sub_x_one_y(ptr addrspace(1) %out,
1644 ; SI-NOFMA-LABEL: test_f32_mul_sub_x_one_y:
1645 ; SI-NOFMA:       ; %bb.0:
1646 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1647 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1648 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1649 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1650 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1651 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1652 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1653 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1654 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1655 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1656 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1657 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1658 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1659 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1660 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1661 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1662 ; SI-NOFMA-NEXT:    v_add_f32_e32 v0, -1.0, v0
1663 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1664 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v0, v1
1665 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1666 ; SI-NOFMA-NEXT:    s_endpgm
1668 ; SI-FMA-LABEL: test_f32_mul_sub_x_one_y:
1669 ; SI-FMA:       ; %bb.0:
1670 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1671 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1672 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1673 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1674 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1675 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1676 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1677 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1678 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1679 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1680 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1681 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1682 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1683 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1684 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1685 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1686 ; SI-FMA-NEXT:    v_fma_f32 v0, v0, v1, -v1
1687 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1688 ; SI-FMA-NEXT:    s_endpgm
1690 ; GFX11-NOFMA-LABEL: test_f32_mul_sub_x_one_y:
1691 ; GFX11-NOFMA:       ; %bb.0:
1692 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1693 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1694 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1695 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1696 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1697 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1698 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1699 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1700 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1701 ; GFX11-NOFMA-NEXT:    v_add_f32_e32 v1, -1.0, v1
1702 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1703 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1704 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v1, v2
1705 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1706 ; GFX11-NOFMA-NEXT:    s_nop 0
1707 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1708 ; GFX11-NOFMA-NEXT:    s_endpgm
1710 ; GFX11-FMA-LABEL: test_f32_mul_sub_x_one_y:
1711 ; GFX11-FMA:       ; %bb.0:
1712 ; GFX11-FMA-NEXT:    s_clause 0x1
1713 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1714 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1715 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1716 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1717 ; GFX11-FMA-NEXT:    s_clause 0x1
1718 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1719 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1720 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1721 ; GFX11-FMA-NEXT:    v_fma_f32 v1, v1, v2, -v2
1722 ; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1723 ; GFX11-FMA-NEXT:    s_nop 0
1724 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1725 ; GFX11-FMA-NEXT:    s_endpgm
1726                                         ptr addrspace(1) %in1,
1727                                         ptr addrspace(1) %in2) {
1728   %x = load float, ptr addrspace(1) %in1
1729   %y = load float, ptr addrspace(1) %in2
1730   %s = fsub float %x, 1.0
1731   %m = fmul float %s, %y
1732   store float %m, ptr addrspace(1) %out
1733   ret void
1736 define amdgpu_kernel void @test_f32_mul_y_sub_x_one(ptr addrspace(1) %out,
1737 ; SI-NOFMA-LABEL: test_f32_mul_y_sub_x_one:
1738 ; SI-NOFMA:       ; %bb.0:
1739 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1740 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1741 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1742 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1743 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1744 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1745 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1746 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1747 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1748 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1749 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1750 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1751 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1752 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1753 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1754 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1755 ; SI-NOFMA-NEXT:    v_add_f32_e32 v0, -1.0, v0
1756 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1757 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v1, v0
1758 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1759 ; SI-NOFMA-NEXT:    s_endpgm
1761 ; SI-FMA-LABEL: test_f32_mul_y_sub_x_one:
1762 ; SI-FMA:       ; %bb.0:
1763 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1764 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1765 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1766 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1767 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1768 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1769 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1770 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1771 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1772 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1773 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1774 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1775 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1776 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1777 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1778 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1779 ; SI-FMA-NEXT:    v_fma_f32 v0, v0, v1, -v1
1780 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1781 ; SI-FMA-NEXT:    s_endpgm
1783 ; GFX11-NOFMA-LABEL: test_f32_mul_y_sub_x_one:
1784 ; GFX11-NOFMA:       ; %bb.0:
1785 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1786 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1787 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1788 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1789 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1790 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1791 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1792 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1793 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1794 ; GFX11-NOFMA-NEXT:    v_add_f32_e32 v1, -1.0, v1
1795 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1796 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1797 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v2, v1
1798 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1799 ; GFX11-NOFMA-NEXT:    s_nop 0
1800 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1801 ; GFX11-NOFMA-NEXT:    s_endpgm
1803 ; GFX11-FMA-LABEL: test_f32_mul_y_sub_x_one:
1804 ; GFX11-FMA:       ; %bb.0:
1805 ; GFX11-FMA-NEXT:    s_clause 0x1
1806 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1807 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1808 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1809 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1810 ; GFX11-FMA-NEXT:    s_clause 0x1
1811 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1812 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1813 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1814 ; GFX11-FMA-NEXT:    v_fma_f32 v1, v1, v2, -v2
1815 ; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1816 ; GFX11-FMA-NEXT:    s_nop 0
1817 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1818 ; GFX11-FMA-NEXT:    s_endpgm
1819                                       ptr addrspace(1) %in1,
1820                                       ptr addrspace(1) %in2) {
1821   %x = load float, ptr addrspace(1) %in1
1822   %y = load float, ptr addrspace(1) %in2
1823   %s = fsub float %x, 1.0
1824   %m = fmul float %y, %s
1825   store float %m, ptr addrspace(1) %out
1826   ret void
1829 define amdgpu_kernel void @test_f32_mul_sub_x_negone_y(ptr addrspace(1) %out,
1830 ; SI-NOFMA-LABEL: test_f32_mul_sub_x_negone_y:
1831 ; SI-NOFMA:       ; %bb.0:
1832 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1833 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1834 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1835 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1836 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1837 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1838 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1839 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1840 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1841 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1842 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1843 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1844 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1845 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1846 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1847 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1848 ; SI-NOFMA-NEXT:    v_add_f32_e32 v0, 1.0, v0
1849 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1850 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v0, v1
1851 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1852 ; SI-NOFMA-NEXT:    s_endpgm
1854 ; SI-FMA-LABEL: test_f32_mul_sub_x_negone_y:
1855 ; SI-FMA:       ; %bb.0:
1856 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1857 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1858 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1859 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1860 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1861 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1862 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1863 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1864 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1865 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1866 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1867 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1868 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1869 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1870 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1871 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1872 ; SI-FMA-NEXT:    v_fma_f32 v0, v0, v1, v1
1873 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1874 ; SI-FMA-NEXT:    s_endpgm
1876 ; GFX11-NOFMA-LABEL: test_f32_mul_sub_x_negone_y:
1877 ; GFX11-NOFMA:       ; %bb.0:
1878 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1879 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1880 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1881 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1882 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1883 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1884 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1885 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1886 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1887 ; GFX11-NOFMA-NEXT:    v_add_f32_e32 v1, 1.0, v1
1888 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1889 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1890 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v1, v2
1891 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1892 ; GFX11-NOFMA-NEXT:    s_nop 0
1893 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1894 ; GFX11-NOFMA-NEXT:    s_endpgm
1896 ; GFX11-FMA-LABEL: test_f32_mul_sub_x_negone_y:
1897 ; GFX11-FMA:       ; %bb.0:
1898 ; GFX11-FMA-NEXT:    s_clause 0x1
1899 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1900 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1901 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1902 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1903 ; GFX11-FMA-NEXT:    s_clause 0x1
1904 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1905 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1906 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
1907 ; GFX11-FMA-NEXT:    v_fmac_f32_e32 v2, v1, v2
1908 ; GFX11-FMA-NEXT:    global_store_b32 v0, v2, s[4:5]
1909 ; GFX11-FMA-NEXT:    s_nop 0
1910 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1911 ; GFX11-FMA-NEXT:    s_endpgm
1912                                          ptr addrspace(1) %in1,
1913                                          ptr addrspace(1) %in2) {
1914   %x = load float, ptr addrspace(1) %in1
1915   %y = load float, ptr addrspace(1) %in2
1916   %s = fsub float %x, -1.0
1917   %m = fmul float %s, %y
1918   store float %m, ptr addrspace(1) %out
1919   ret void
1922 define amdgpu_kernel void @test_f32_mul_y_sub_x_negone(ptr addrspace(1) %out,
1923 ; SI-NOFMA-LABEL: test_f32_mul_y_sub_x_negone:
1924 ; SI-NOFMA:       ; %bb.0:
1925 ; SI-NOFMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1926 ; SI-NOFMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1927 ; SI-NOFMA-NEXT:    s_mov_b32 s3, 0xf000
1928 ; SI-NOFMA-NEXT:    s_mov_b32 s2, -1
1929 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s2
1930 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1931 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s6
1932 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s7
1933 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s3
1934 ; SI-NOFMA-NEXT:    s_mov_b32 s10, s2
1935 ; SI-NOFMA-NEXT:    s_mov_b32 s11, s3
1936 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1937 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1938 ; SI-NOFMA-NEXT:    s_mov_b32 s0, s4
1939 ; SI-NOFMA-NEXT:    s_mov_b32 s1, s5
1940 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1941 ; SI-NOFMA-NEXT:    v_add_f32_e32 v0, 1.0, v0
1942 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1943 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v0, v1, v0
1944 ; SI-NOFMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1945 ; SI-NOFMA-NEXT:    s_endpgm
1947 ; SI-FMA-LABEL: test_f32_mul_y_sub_x_negone:
1948 ; SI-FMA:       ; %bb.0:
1949 ; SI-FMA-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x9
1950 ; SI-FMA-NEXT:    s_load_dwordx2 s[8:9], s[0:1], 0xd
1951 ; SI-FMA-NEXT:    s_mov_b32 s3, 0xf000
1952 ; SI-FMA-NEXT:    s_mov_b32 s2, -1
1953 ; SI-FMA-NEXT:    s_mov_b32 s14, s2
1954 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1955 ; SI-FMA-NEXT:    s_mov_b32 s12, s6
1956 ; SI-FMA-NEXT:    s_mov_b32 s13, s7
1957 ; SI-FMA-NEXT:    s_mov_b32 s15, s3
1958 ; SI-FMA-NEXT:    s_mov_b32 s10, s2
1959 ; SI-FMA-NEXT:    s_mov_b32 s11, s3
1960 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[12:15], 0
1961 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[8:11], 0
1962 ; SI-FMA-NEXT:    s_mov_b32 s0, s4
1963 ; SI-FMA-NEXT:    s_mov_b32 s1, s5
1964 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
1965 ; SI-FMA-NEXT:    v_fma_f32 v0, v0, v1, v1
1966 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1967 ; SI-FMA-NEXT:    s_endpgm
1969 ; GFX11-NOFMA-LABEL: test_f32_mul_y_sub_x_negone:
1970 ; GFX11-NOFMA:       ; %bb.0:
1971 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1972 ; GFX11-NOFMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1973 ; GFX11-NOFMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1974 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
1975 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
1976 ; GFX11-NOFMA-NEXT:    s_clause 0x1
1977 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1978 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1979 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
1980 ; GFX11-NOFMA-NEXT:    v_add_f32_e32 v1, 1.0, v1
1981 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
1982 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1983 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v1, v2, v1
1984 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v1, s[4:5]
1985 ; GFX11-NOFMA-NEXT:    s_nop 0
1986 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1987 ; GFX11-NOFMA-NEXT:    s_endpgm
1989 ; GFX11-FMA-LABEL: test_f32_mul_y_sub_x_negone:
1990 ; GFX11-FMA:       ; %bb.0:
1991 ; GFX11-FMA-NEXT:    s_clause 0x1
1992 ; GFX11-FMA-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
1993 ; GFX11-FMA-NEXT:    s_load_b64 s[0:1], s[0:1], 0x34
1994 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
1995 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
1996 ; GFX11-FMA-NEXT:    s_clause 0x1
1997 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[6:7]
1998 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[0:1]
1999 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
2000 ; GFX11-FMA-NEXT:    v_fmac_f32_e32 v2, v1, v2
2001 ; GFX11-FMA-NEXT:    global_store_b32 v0, v2, s[4:5]
2002 ; GFX11-FMA-NEXT:    s_nop 0
2003 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2004 ; GFX11-FMA-NEXT:    s_endpgm
2005                                          ptr addrspace(1) %in1,
2006                                          ptr addrspace(1) %in2) {
2007   %x = load float, ptr addrspace(1) %in1
2008   %y = load float, ptr addrspace(1) %in2
2009   %s = fsub float %x, -1.0
2010   %m = fmul float %y, %s
2011   store float %m, ptr addrspace(1) %out
2012   ret void
2016 ; Interpolation Patterns: add(mul(x,t),mul(sub(1.0,t),y))
2019 define amdgpu_kernel void @test_f32_interp(ptr addrspace(1) %out,
2020 ; SI-NOFMA-LABEL: test_f32_interp:
2021 ; SI-NOFMA:       ; %bb.0:
2022 ; SI-NOFMA-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
2023 ; SI-NOFMA-NEXT:    s_mov_b32 s11, 0xf000
2024 ; SI-NOFMA-NEXT:    s_mov_b32 s10, -1
2025 ; SI-NOFMA-NEXT:    s_mov_b32 s14, s10
2026 ; SI-NOFMA-NEXT:    s_mov_b32 s15, s11
2027 ; SI-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
2028 ; SI-NOFMA-NEXT:    s_mov_b32 s16, s4
2029 ; SI-NOFMA-NEXT:    s_mov_b32 s17, s5
2030 ; SI-NOFMA-NEXT:    s_mov_b32 s4, s6
2031 ; SI-NOFMA-NEXT:    s_mov_b32 s5, s7
2032 ; SI-NOFMA-NEXT:    s_mov_b32 s6, s10
2033 ; SI-NOFMA-NEXT:    s_mov_b32 s7, s11
2034 ; SI-NOFMA-NEXT:    s_mov_b32 s12, s2
2035 ; SI-NOFMA-NEXT:    s_mov_b32 s13, s3
2036 ; SI-NOFMA-NEXT:    s_mov_b32 s18, s10
2037 ; SI-NOFMA-NEXT:    s_mov_b32 s19, s11
2038 ; SI-NOFMA-NEXT:    buffer_load_dword v0, off, s[4:7], 0
2039 ; SI-NOFMA-NEXT:    buffer_load_dword v1, off, s[16:19], 0
2040 ; SI-NOFMA-NEXT:    buffer_load_dword v2, off, s[12:15], 0
2041 ; SI-NOFMA-NEXT:    s_mov_b32 s8, s0
2042 ; SI-NOFMA-NEXT:    s_mov_b32 s9, s1
2043 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(2)
2044 ; SI-NOFMA-NEXT:    v_sub_f32_e32 v3, 1.0, v0
2045 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(1)
2046 ; SI-NOFMA-NEXT:    v_mul_f32_e32 v1, v1, v3
2047 ; SI-NOFMA-NEXT:    s_waitcnt vmcnt(0)
2048 ; SI-NOFMA-NEXT:    v_mac_f32_e32 v1, v2, v0
2049 ; SI-NOFMA-NEXT:    buffer_store_dword v1, off, s[8:11], 0
2050 ; SI-NOFMA-NEXT:    s_endpgm
2052 ; SI-FMA-LABEL: test_f32_interp:
2053 ; SI-FMA:       ; %bb.0:
2054 ; SI-FMA-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
2055 ; SI-FMA-NEXT:    s_mov_b32 s11, 0xf000
2056 ; SI-FMA-NEXT:    s_mov_b32 s10, -1
2057 ; SI-FMA-NEXT:    s_mov_b32 s18, s10
2058 ; SI-FMA-NEXT:    s_mov_b32 s19, s11
2059 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
2060 ; SI-FMA-NEXT:    s_mov_b32 s16, s4
2061 ; SI-FMA-NEXT:    s_mov_b32 s17, s5
2062 ; SI-FMA-NEXT:    s_mov_b32 s14, s10
2063 ; SI-FMA-NEXT:    s_mov_b32 s12, s2
2064 ; SI-FMA-NEXT:    s_mov_b32 s13, s3
2065 ; SI-FMA-NEXT:    s_mov_b32 s15, s11
2066 ; SI-FMA-NEXT:    s_mov_b32 s4, s6
2067 ; SI-FMA-NEXT:    s_mov_b32 s5, s7
2068 ; SI-FMA-NEXT:    s_mov_b32 s6, s10
2069 ; SI-FMA-NEXT:    s_mov_b32 s7, s11
2070 ; SI-FMA-NEXT:    buffer_load_dword v0, off, s[16:19], 0
2071 ; SI-FMA-NEXT:    buffer_load_dword v1, off, s[4:7], 0
2072 ; SI-FMA-NEXT:    buffer_load_dword v2, off, s[12:15], 0
2073 ; SI-FMA-NEXT:    s_mov_b32 s8, s0
2074 ; SI-FMA-NEXT:    s_mov_b32 s9, s1
2075 ; SI-FMA-NEXT:    s_waitcnt vmcnt(1)
2076 ; SI-FMA-NEXT:    v_fma_f32 v0, -v1, v0, v0
2077 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
2078 ; SI-FMA-NEXT:    v_fma_f32 v0, v2, v1, v0
2079 ; SI-FMA-NEXT:    buffer_store_dword v0, off, s[8:11], 0
2080 ; SI-FMA-NEXT:    s_endpgm
2082 ; GFX11-NOFMA-LABEL: test_f32_interp:
2083 ; GFX11-NOFMA:       ; %bb.0:
2084 ; GFX11-NOFMA-NEXT:    s_load_b256 s[0:7], s[0:1], 0x24
2085 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v0, 0
2086 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
2087 ; GFX11-NOFMA-NEXT:    s_clause 0x2
2088 ; GFX11-NOFMA-NEXT:    global_load_b32 v1, v0, s[6:7]
2089 ; GFX11-NOFMA-NEXT:    global_load_b32 v2, v0, s[4:5]
2090 ; GFX11-NOFMA-NEXT:    global_load_b32 v3, v0, s[2:3]
2091 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(2)
2092 ; GFX11-NOFMA-NEXT:    v_sub_f32_e32 v4, 1.0, v1
2093 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
2094 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
2095 ; GFX11-NOFMA-NEXT:    v_mul_f32_e32 v2, v2, v4
2096 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
2097 ; GFX11-NOFMA-NEXT:    v_fmac_f32_e32 v2, v3, v1
2098 ; GFX11-NOFMA-NEXT:    global_store_b32 v0, v2, s[0:1]
2099 ; GFX11-NOFMA-NEXT:    s_nop 0
2100 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2101 ; GFX11-NOFMA-NEXT:    s_endpgm
2103 ; GFX11-FMA-LABEL: test_f32_interp:
2104 ; GFX11-FMA:       ; %bb.0:
2105 ; GFX11-FMA-NEXT:    s_load_b256 s[0:7], s[0:1], 0x24
2106 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v0, 0
2107 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
2108 ; GFX11-FMA-NEXT:    s_clause 0x2
2109 ; GFX11-FMA-NEXT:    global_load_b32 v1, v0, s[4:5]
2110 ; GFX11-FMA-NEXT:    global_load_b32 v2, v0, s[6:7]
2111 ; GFX11-FMA-NEXT:    global_load_b32 v3, v0, s[2:3]
2112 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(1)
2113 ; GFX11-FMA-NEXT:    v_fma_f32 v1, -v2, v1, v1
2114 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
2115 ; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2116 ; GFX11-FMA-NEXT:    v_fmac_f32_e32 v1, v3, v2
2117 ; GFX11-FMA-NEXT:    global_store_b32 v0, v1, s[0:1]
2118 ; GFX11-FMA-NEXT:    s_nop 0
2119 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2120 ; GFX11-FMA-NEXT:    s_endpgm
2121                              ptr addrspace(1) %in1,
2122                              ptr addrspace(1) %in2,
2123                              ptr addrspace(1) %in3) {
2124   %x = load float, ptr addrspace(1) %in1
2125   %y = load float, ptr addrspace(1) %in2
2126   %t = load float, ptr addrspace(1) %in3
2127   %t1 = fsub float 1.0, %t
2128   %tx = fmul float %x, %t
2129   %ty = fmul float %y, %t1
2130   %r = fadd float %tx, %ty
2131   store float %r, ptr addrspace(1) %out
2132   ret void
2135 define amdgpu_kernel void @test_f64_interp(ptr addrspace(1) %out,
2136 ; SI-FMA-LABEL: test_f64_interp:
2137 ; SI-FMA:       ; %bb.0:
2138 ; SI-FMA-NEXT:    s_load_dwordx8 s[0:7], s[0:1], 0x9
2139 ; SI-FMA-NEXT:    s_mov_b32 s11, 0xf000
2140 ; SI-FMA-NEXT:    s_mov_b32 s10, -1
2141 ; SI-FMA-NEXT:    s_mov_b32 s18, s10
2142 ; SI-FMA-NEXT:    s_mov_b32 s19, s11
2143 ; SI-FMA-NEXT:    s_waitcnt lgkmcnt(0)
2144 ; SI-FMA-NEXT:    s_mov_b32 s16, s4
2145 ; SI-FMA-NEXT:    s_mov_b32 s17, s5
2146 ; SI-FMA-NEXT:    s_mov_b32 s4, s6
2147 ; SI-FMA-NEXT:    s_mov_b32 s5, s7
2148 ; SI-FMA-NEXT:    s_mov_b32 s6, s10
2149 ; SI-FMA-NEXT:    s_mov_b32 s7, s11
2150 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[0:1], off, s[16:19], 0
2151 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[2:3], off, s[4:7], 0
2152 ; SI-FMA-NEXT:    s_mov_b32 s14, s10
2153 ; SI-FMA-NEXT:    s_mov_b32 s12, s2
2154 ; SI-FMA-NEXT:    s_mov_b32 s13, s3
2155 ; SI-FMA-NEXT:    s_mov_b32 s15, s11
2156 ; SI-FMA-NEXT:    buffer_load_dwordx2 v[4:5], off, s[12:15], 0
2157 ; SI-FMA-NEXT:    s_mov_b32 s8, s0
2158 ; SI-FMA-NEXT:    s_mov_b32 s9, s1
2159 ; SI-FMA-NEXT:    s_waitcnt vmcnt(1)
2160 ; SI-FMA-NEXT:    v_fma_f64 v[0:1], -v[2:3], v[0:1], v[0:1]
2161 ; SI-FMA-NEXT:    s_waitcnt vmcnt(0)
2162 ; SI-FMA-NEXT:    v_fma_f64 v[0:1], v[4:5], v[2:3], v[0:1]
2163 ; SI-FMA-NEXT:    buffer_store_dwordx2 v[0:1], off, s[8:11], 0
2164 ; SI-FMA-NEXT:    s_endpgm
2166 ; GFX11-NOFMA-LABEL: test_f64_interp:
2167 ; GFX11-NOFMA:       ; %bb.0:
2168 ; GFX11-NOFMA-NEXT:    s_load_b256 s[0:7], s[0:1], 0x24
2169 ; GFX11-NOFMA-NEXT:    v_mov_b32_e32 v8, 0
2170 ; GFX11-NOFMA-NEXT:    s_waitcnt lgkmcnt(0)
2171 ; GFX11-NOFMA-NEXT:    s_clause 0x2
2172 ; GFX11-NOFMA-NEXT:    global_load_b64 v[0:1], v8, s[6:7]
2173 ; GFX11-NOFMA-NEXT:    global_load_b64 v[2:3], v8, s[4:5]
2174 ; GFX11-NOFMA-NEXT:    global_load_b64 v[4:5], v8, s[2:3]
2175 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(2)
2176 ; GFX11-NOFMA-NEXT:    v_add_f64 v[6:7], -v[0:1], 1.0
2177 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(1)
2178 ; GFX11-NOFMA-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
2179 ; GFX11-NOFMA-NEXT:    v_mul_f64 v[2:3], v[2:3], v[6:7]
2180 ; GFX11-NOFMA-NEXT:    s_waitcnt vmcnt(0)
2181 ; GFX11-NOFMA-NEXT:    v_fma_f64 v[0:1], v[4:5], v[0:1], v[2:3]
2182 ; GFX11-NOFMA-NEXT:    global_store_b64 v8, v[0:1], s[0:1]
2183 ; GFX11-NOFMA-NEXT:    s_nop 0
2184 ; GFX11-NOFMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2185 ; GFX11-NOFMA-NEXT:    s_endpgm
2187 ; GFX11-FMA-LABEL: test_f64_interp:
2188 ; GFX11-FMA:       ; %bb.0:
2189 ; GFX11-FMA-NEXT:    s_load_b256 s[0:7], s[0:1], 0x24
2190 ; GFX11-FMA-NEXT:    v_mov_b32_e32 v6, 0
2191 ; GFX11-FMA-NEXT:    s_waitcnt lgkmcnt(0)
2192 ; GFX11-FMA-NEXT:    s_clause 0x2
2193 ; GFX11-FMA-NEXT:    global_load_b64 v[0:1], v6, s[4:5]
2194 ; GFX11-FMA-NEXT:    global_load_b64 v[2:3], v6, s[6:7]
2195 ; GFX11-FMA-NEXT:    global_load_b64 v[4:5], v6, s[2:3]
2196 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(1)
2197 ; GFX11-FMA-NEXT:    v_fma_f64 v[0:1], -v[2:3], v[0:1], v[0:1]
2198 ; GFX11-FMA-NEXT:    s_waitcnt vmcnt(0)
2199 ; GFX11-FMA-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2200 ; GFX11-FMA-NEXT:    v_fma_f64 v[0:1], v[4:5], v[2:3], v[0:1]
2201 ; GFX11-FMA-NEXT:    global_store_b64 v6, v[0:1], s[0:1]
2202 ; GFX11-FMA-NEXT:    s_nop 0
2203 ; GFX11-FMA-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2204 ; GFX11-FMA-NEXT:    s_endpgm
2205                              ptr addrspace(1) %in1,
2206                              ptr addrspace(1) %in2,
2207                              ptr addrspace(1) %in3) {
2208   %x = load double, ptr addrspace(1) %in1
2209   %y = load double, ptr addrspace(1) %in2
2210   %t = load double, ptr addrspace(1) %in3
2211   %t1 = fsub double 1.0, %t
2212   %tx = fmul double %x, %t
2213   %ty = fmul double %y, %t1
2214   %r = fadd double %tx, %ty
2215   store double %r, ptr addrspace(1) %out
2216   ret void
2219 ; Make sure negative constant cancels out fneg
2220 define amdgpu_kernel void @fma_neg_2.0_neg_a_b_f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
2221 ; SI-LABEL: fma_neg_2.0_neg_a_b_f32:
2222 ; SI:       ; %bb.0:
2223 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2224 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2225 ; SI-NEXT:    s_mov_b32 s2, 0
2226 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2227 ; SI-NEXT:    v_mov_b32_e32 v1, 0
2228 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2229 ; SI-NEXT:    buffer_load_dword v2, v[0:1], s[0:3], 0 addr64 glc
2230 ; SI-NEXT:    s_waitcnt vmcnt(0)
2231 ; SI-NEXT:    buffer_load_dword v3, v[0:1], s[0:3], 0 addr64 offset:4 glc
2232 ; SI-NEXT:    s_waitcnt vmcnt(0)
2233 ; SI-NEXT:    v_fma_f32 v2, v2, 2.0, v3
2234 ; SI-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2235 ; SI-NEXT:    s_endpgm
2237 ; GFX11-LABEL: fma_neg_2.0_neg_a_b_f32:
2238 ; GFX11:       ; %bb.0:
2239 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
2240 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2241 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2242 ; GFX11-NEXT:    global_load_b32 v1, v0, s[0:1] glc dlc
2243 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2244 ; GFX11-NEXT:    global_load_b32 v2, v0, s[0:1] offset:4 glc dlc
2245 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2246 ; GFX11-NEXT:    v_fmac_f32_e32 v2, 2.0, v1
2247 ; GFX11-NEXT:    global_store_b32 v0, v2, s[0:1]
2248 ; GFX11-NEXT:    s_nop 0
2249 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2250 ; GFX11-NEXT:    s_endpgm
2251   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2252   %gep.0 = getelementptr float, ptr addrspace(1) %out, i32 %tid
2253   %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1
2254   %gep.out = getelementptr float, ptr addrspace(1) %out, i32 %tid
2256   %r1 = load volatile float, ptr addrspace(1) %gep.0
2257   %r2 = load volatile float, ptr addrspace(1) %gep.1
2259   %r1.fneg = fneg float %r1
2261   %r3 = tail call float @llvm.fma.f32(float -2.0, float %r1.fneg, float %r2)
2262   store float %r3, ptr addrspace(1) %gep.out
2263   ret void
2266 define amdgpu_kernel void @fma_2.0_neg_a_b_f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 {
2267 ; SI-LABEL: fma_2.0_neg_a_b_f32:
2268 ; SI:       ; %bb.0:
2269 ; SI-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2270 ; SI-NEXT:    s_mov_b32 s3, 0xf000
2271 ; SI-NEXT:    s_mov_b32 s2, 0
2272 ; SI-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2273 ; SI-NEXT:    v_mov_b32_e32 v1, 0
2274 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2275 ; SI-NEXT:    buffer_load_dword v2, v[0:1], s[0:3], 0 addr64 glc
2276 ; SI-NEXT:    s_waitcnt vmcnt(0)
2277 ; SI-NEXT:    buffer_load_dword v3, v[0:1], s[0:3], 0 addr64 offset:4 glc
2278 ; SI-NEXT:    s_waitcnt vmcnt(0)
2279 ; SI-NEXT:    v_fma_f32 v2, v2, -2.0, v3
2280 ; SI-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2281 ; SI-NEXT:    s_endpgm
2283 ; GFX11-LABEL: fma_2.0_neg_a_b_f32:
2284 ; GFX11:       ; %bb.0:
2285 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
2286 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2287 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2288 ; GFX11-NEXT:    global_load_b32 v1, v0, s[0:1] glc dlc
2289 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2290 ; GFX11-NEXT:    global_load_b32 v2, v0, s[0:1] offset:4 glc dlc
2291 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2292 ; GFX11-NEXT:    v_fmac_f32_e32 v2, -2.0, v1
2293 ; GFX11-NEXT:    global_store_b32 v0, v2, s[0:1]
2294 ; GFX11-NEXT:    s_nop 0
2295 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2296 ; GFX11-NEXT:    s_endpgm
2297   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2298   %gep.0 = getelementptr float, ptr addrspace(1) %out, i32 %tid
2299   %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1
2300   %gep.out = getelementptr float, ptr addrspace(1) %out, i32 %tid
2302   %r1 = load volatile float, ptr addrspace(1) %gep.0
2303   %r2 = load volatile float, ptr addrspace(1) %gep.1
2305   %r1.fneg = fneg float %r1
2307   %r3 = tail call float @llvm.fma.f32(float 2.0, float %r1.fneg, float %r2)
2308   store float %r3, ptr addrspace(1) %gep.out
2309   ret void
2312 define amdgpu_kernel void @fma_neg_b_c_v4f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #2 {
2313 ; SI-LABEL: fma_neg_b_c_v4f32:
2314 ; SI:       ; %bb.0:
2315 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2316 ; SI-NEXT:    s_mov_b32 s7, 0xf000
2317 ; SI-NEXT:    s_mov_b32 s6, 0
2318 ; SI-NEXT:    v_lshlrev_b32_e32 v12, 4, v0
2319 ; SI-NEXT:    v_mov_b32_e32 v13, 0
2320 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
2321 ; SI-NEXT:    s_mov_b64 s[4:5], s[2:3]
2322 ; SI-NEXT:    buffer_load_dwordx4 v[0:3], v[12:13], s[4:7], 0 addr64
2323 ; SI-NEXT:    buffer_load_dwordx4 v[4:7], v[12:13], s[4:7], 0 addr64 offset:16
2324 ; SI-NEXT:    buffer_load_dwordx4 v[8:11], v[12:13], s[4:7], 0 addr64 offset:48
2325 ; SI-NEXT:    s_mov_b64 s[2:3], s[6:7]
2326 ; SI-NEXT:    s_waitcnt vmcnt(0)
2327 ; SI-NEXT:    v_fma_f32 v3, v11, -v3, -v7
2328 ; SI-NEXT:    v_fma_f32 v2, v10, -v2, -v6
2329 ; SI-NEXT:    v_fma_f32 v1, v9, -v1, -v5
2330 ; SI-NEXT:    v_fma_f32 v0, v8, -v0, -v4
2331 ; SI-NEXT:    buffer_store_dwordx4 v[0:3], v[12:13], s[0:3], 0 addr64
2332 ; SI-NEXT:    s_endpgm
2334 ; GFX11-LABEL: fma_neg_b_c_v4f32:
2335 ; GFX11:       ; %bb.0:
2336 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2337 ; GFX11-NEXT:    v_lshlrev_b32_e32 v12, 4, v0
2338 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2339 ; GFX11-NEXT:    s_clause 0x2
2340 ; GFX11-NEXT:    global_load_b128 v[0:3], v12, s[2:3] offset:16
2341 ; GFX11-NEXT:    global_load_b128 v[4:7], v12, s[2:3]
2342 ; GFX11-NEXT:    global_load_b128 v[8:11], v12, s[2:3] offset:48
2343 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2344 ; GFX11-NEXT:    v_fma_f32 v3, v11, -v7, -v3
2345 ; GFX11-NEXT:    v_fma_f32 v2, v10, -v6, -v2
2346 ; GFX11-NEXT:    v_fma_f32 v1, v9, -v5, -v1
2347 ; GFX11-NEXT:    v_fma_f32 v0, v8, -v4, -v0
2348 ; GFX11-NEXT:    global_store_b128 v12, v[0:3], s[0:1]
2349 ; GFX11-NEXT:    s_nop 0
2350 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2351 ; GFX11-NEXT:    s_endpgm
2352   %tid = call i32 @llvm.amdgcn.workitem.id.x()
2353   %gep.0 = getelementptr <4 x float>, ptr addrspace(1) %in, i32 %tid
2354   %gep.1 = getelementptr <4 x float>, ptr addrspace(1) %gep.0, i32 1
2355   %gep.2 = getelementptr <4 x float>, ptr addrspace(1) %gep.1, i32 2
2356   %gep.out = getelementptr <4 x float>, ptr addrspace(1) %out, i32 %tid
2358   %tmp0 = load <4 x float>, ptr addrspace(1) %gep.0
2359   %tmp1 = load <4 x float>, ptr addrspace(1) %gep.1
2360   %tmp2 = load <4 x float>, ptr addrspace(1) %gep.2
2362   %fneg0 = fneg fast <4 x float> %tmp0
2363   %fneg1 = fneg fast <4 x float> %tmp1
2364   %fma0 = tail call fast <4 x float> @llvm.fma.v4f32(<4 x float> %tmp2, <4 x float> %fneg0, <4 x float> %fneg1)
2366   store <4 x float> %fma0, ptr addrspace(1) %gep.out
2367   ret void
2370 attributes #0 = { nounwind readnone }
2371 attributes #1 = { nounwind }
2372 attributes #2 = { nounwind "no-signed-zeros-fp-math"="true" }