xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fdiv-sqrt-to-rsq.mir (revision 8bd327d6fed5a4ae99bdbd039f5503700030cf53)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
2# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -run-pass=amdgpu-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s
3
4---
5name:            rsq_f16
6tracksRegLiveness: true
7body:             |
8  bb.0:
9    liveins: $vgpr0
10
11    ; GCN-LABEL: name: rsq_f16
12    ; GCN: liveins: $vgpr0
13    ; GCN-NEXT: {{  $}}
14    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
15    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
16    ; GCN-NEXT: [[INT:%[0-9]+]]:_(s16) = contract G_INTRINSIC intrinsic(@llvm.amdgcn.rsq), %x(s16)
17    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT [[INT]](s16)
18    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
19    %0:_(s32) = COPY $vgpr0
20    %x:_(s16) = G_TRUNC %0:_(s32)
21    %sqrt:_(s16) = contract G_FSQRT %x
22    %one:_(s16) = G_FCONSTANT half 1.0
23    %rsq:_(s16) = contract G_FDIV %one, %sqrt
24    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
25    $vgpr0 = COPY %ext
26
27...
28
29---
30name:            rsq_f16_missing_contract0
31tracksRegLiveness: true
32body:             |
33  bb.0:
34    liveins: $vgpr0
35
36    ; GCN-LABEL: name: rsq_f16_missing_contract0
37    ; GCN: liveins: $vgpr0
38    ; GCN-NEXT: {{  $}}
39    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
40    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
41    ; GCN-NEXT: %sqrt:_(s16) = G_FSQRT %x
42    ; GCN-NEXT: %one:_(s16) = G_FCONSTANT half 0xH3C00
43    ; GCN-NEXT: %rsq:_(s16) = contract G_FDIV %one, %sqrt
44    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
45    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
46    %0:_(s32) = COPY $vgpr0
47    %x:_(s16) = G_TRUNC %0:_(s32)
48    %sqrt:_(s16) = G_FSQRT %x
49    %one:_(s16) = G_FCONSTANT half 1.0
50    %rsq:_(s16) = contract G_FDIV %one, %sqrt
51    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
52    $vgpr0 = COPY %ext
53
54...
55
56---
57name:            rsq_f16_missing_contract1
58tracksRegLiveness: true
59body:             |
60  bb.0:
61    liveins: $vgpr0
62
63    ; GCN-LABEL: name: rsq_f16_missing_contract1
64    ; GCN: liveins: $vgpr0
65    ; GCN-NEXT: {{  $}}
66    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
67    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
68    ; GCN-NEXT: %sqrt:_(s16) = contract G_FSQRT %x
69    ; GCN-NEXT: %one:_(s16) = G_FCONSTANT half 0xH3C00
70    ; GCN-NEXT: %rsq:_(s16) = G_FDIV %one, %sqrt
71    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
72    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
73    %0:_(s32) = COPY $vgpr0
74    %x:_(s16) = G_TRUNC %0:_(s32)
75    %sqrt:_(s16) = contract G_FSQRT %x
76    %one:_(s16) = G_FCONSTANT half 1.0
77    %rsq:_(s16) = G_FDIV %one, %sqrt
78    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
79    $vgpr0 = COPY %ext
80
81...
82
83---
84name:            neg_rsq_f16
85tracksRegLiveness: true
86body:             |
87  bb.0:
88    liveins: $vgpr0
89
90    ; GCN-LABEL: name: neg_rsq_f16
91    ; GCN: liveins: $vgpr0
92    ; GCN-NEXT: {{  $}}
93    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
94    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
95    ; GCN-NEXT: [[INT:%[0-9]+]]:_(s16) = contract G_INTRINSIC intrinsic(@llvm.amdgcn.rsq), %x(s16)
96    ; GCN-NEXT: %rsq:_(s16) = contract G_FNEG [[INT]]
97    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
98    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
99    %0:_(s32) = COPY $vgpr0
100    %x:_(s16) = G_TRUNC %0:_(s32)
101    %sqrt:_(s16) = contract G_FSQRT %x
102    %neg_one:_(s16) = G_FCONSTANT half -1.0
103    %rsq:_(s16) = contract G_FDIV %neg_one, %sqrt
104    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
105    $vgpr0 = COPY %ext
106
107...
108
109---
110name:            neg_rsq_f16_missing_contract0
111tracksRegLiveness: true
112body:             |
113  bb.0:
114    liveins: $vgpr0
115
116    ; GCN-LABEL: name: neg_rsq_f16_missing_contract0
117    ; GCN: liveins: $vgpr0
118    ; GCN-NEXT: {{  $}}
119    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
120    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
121    ; GCN-NEXT: %sqrt:_(s16) = G_FSQRT %x
122    ; GCN-NEXT: %neg_one:_(s16) = G_FCONSTANT half 0xHBC00
123    ; GCN-NEXT: %rsq:_(s16) = contract G_FDIV %neg_one, %sqrt
124    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
125    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
126    %0:_(s32) = COPY $vgpr0
127    %x:_(s16) = G_TRUNC %0:_(s32)
128    %sqrt:_(s16) = G_FSQRT %x
129    %neg_one:_(s16) = G_FCONSTANT half -1.0
130    %rsq:_(s16) = contract G_FDIV %neg_one, %sqrt
131    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
132    $vgpr0 = COPY %ext
133
134...
135
136---
137name:            neg_rsq_f16_missing_contract1
138tracksRegLiveness: true
139body:             |
140  bb.0:
141    liveins: $vgpr0
142
143    ; GCN-LABEL: name: neg_rsq_f16_missing_contract1
144    ; GCN: liveins: $vgpr0
145    ; GCN-NEXT: {{  $}}
146    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
147    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
148    ; GCN-NEXT: %sqrt:_(s16) = contract G_FSQRT %x
149    ; GCN-NEXT: %neg_one:_(s16) = G_FCONSTANT half 0xHBC00
150    ; GCN-NEXT: %rsq:_(s16) = G_FDIV %neg_one, %sqrt
151    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
152    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
153    %0:_(s32) = COPY $vgpr0
154    %x:_(s16) = G_TRUNC %0:_(s32)
155    %sqrt:_(s16) = contract G_FSQRT %x
156    %neg_one:_(s16) = G_FCONSTANT half -1.0
157    %rsq:_(s16) = G_FDIV %neg_one, %sqrt
158    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
159    $vgpr0 = COPY %ext
160
161...
162
163---
164name:            rsq_f16_multi_use
165tracksRegLiveness: true
166body:             |
167  bb.0:
168    liveins: $vgpr0
169
170    ; GCN-LABEL: name: rsq_f16_multi_use
171    ; GCN: liveins: $vgpr0
172    ; GCN-NEXT: {{  $}}
173    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
174    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
175    ; GCN-NEXT: %sqrt:_(s16) = contract G_FSQRT %x
176    ; GCN-NEXT: %one:_(s16) = G_FCONSTANT half 0xH3C00
177    ; GCN-NEXT: %rsq:_(s16) = contract G_FDIV %one, %sqrt
178    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
179    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
180    ; GCN-NEXT: S_ENDPGM 0, implicit %sqrt(s16)
181    %0:_(s32) = COPY $vgpr0
182    %x:_(s16) = G_TRUNC %0:_(s32)
183    %sqrt:_(s16) = contract G_FSQRT %x
184    %one:_(s16) = G_FCONSTANT half 1.0
185    %rsq:_(s16) = contract G_FDIV %one, %sqrt
186    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
187    $vgpr0 = COPY %ext
188    S_ENDPGM 0, implicit %sqrt
189
190...
191
192---
193name:            rsq_f16_multi_use_missing_contract0
194tracksRegLiveness: true
195body:             |
196  bb.0:
197    liveins: $vgpr0
198
199    ; GCN-LABEL: name: rsq_f16_multi_use_missing_contract0
200    ; GCN: liveins: $vgpr0
201    ; GCN-NEXT: {{  $}}
202    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
203    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
204    ; GCN-NEXT: %sqrt:_(s16) = G_FSQRT %x
205    ; GCN-NEXT: %one:_(s16) = G_FCONSTANT half 0xH3C00
206    ; GCN-NEXT: %rsq:_(s16) = contract G_FDIV %one, %sqrt
207    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
208    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
209    ; GCN-NEXT: S_ENDPGM 0, implicit %sqrt(s16)
210    %0:_(s32) = COPY $vgpr0
211    %x:_(s16) = G_TRUNC %0:_(s32)
212    %sqrt:_(s16) = G_FSQRT %x
213    %one:_(s16) = G_FCONSTANT half 1.0
214    %rsq:_(s16) = contract G_FDIV %one, %sqrt
215    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
216    $vgpr0 = COPY %ext
217    S_ENDPGM 0, implicit %sqrt
218
219...
220
221---
222name:            rsq_f16_multi_use_missing_contract1
223tracksRegLiveness: true
224body:             |
225  bb.0:
226    liveins: $vgpr0
227
228    ; GCN-LABEL: name: rsq_f16_multi_use_missing_contract1
229    ; GCN: liveins: $vgpr0
230    ; GCN-NEXT: {{  $}}
231    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
232    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
233    ; GCN-NEXT: %sqrt:_(s16) = contract G_FSQRT %x
234    ; GCN-NEXT: %one:_(s16) = G_FCONSTANT half 0xH3C00
235    ; GCN-NEXT: %rsq:_(s16) = G_FDIV %one, %sqrt
236    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
237    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
238    ; GCN-NEXT: S_ENDPGM 0, implicit %sqrt(s16)
239    %0:_(s32) = COPY $vgpr0
240    %x:_(s16) = G_TRUNC %0:_(s32)
241    %sqrt:_(s16) = contract G_FSQRT %x
242    %one:_(s16) = G_FCONSTANT half 1.0
243    %rsq:_(s16) = G_FDIV %one, %sqrt
244    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
245    $vgpr0 = COPY %ext
246    S_ENDPGM 0, implicit %sqrt
247
248...
249
250---
251name:            rsq_f32
252tracksRegLiveness: true
253body:             |
254  bb.0:
255    liveins: $vgpr0
256
257    ; GCN-LABEL: name: rsq_f32
258    ; GCN: liveins: $vgpr0
259    ; GCN-NEXT: {{  $}}
260    ; GCN-NEXT: %x:_(s32) = COPY $vgpr0
261    ; GCN-NEXT: %sqrt:_(s32) = contract G_FSQRT %x
262    ; GCN-NEXT: %one:_(s32) = G_FCONSTANT float 1.000000e+00
263    ; GCN-NEXT: %rsq:_(s32) = contract G_FDIV %one, %sqrt
264    ; GCN-NEXT: $vgpr0 = COPY %rsq(s32)
265    %x:_(s32) = COPY $vgpr0
266    %sqrt:_(s32) = contract G_FSQRT %x
267    %one:_(s32) = G_FCONSTANT float 1.0
268    %rsq:_(s32) = contract G_FDIV %one, %sqrt
269    $vgpr0 = COPY %rsq
270
271...
272
273---
274name:            neg_rsq_f32
275tracksRegLiveness: true
276body:             |
277  bb.0:
278    liveins: $vgpr0
279
280    ; GCN-LABEL: name: neg_rsq_f32
281    ; GCN: liveins: $vgpr0
282    ; GCN-NEXT: {{  $}}
283    ; GCN-NEXT: %x:_(s32) = COPY $vgpr0
284    ; GCN-NEXT: %sqrt:_(s32) = contract G_FSQRT %x
285    ; GCN-NEXT: %neg_one:_(s32) = G_FCONSTANT float -1.000000e+00
286    ; GCN-NEXT: %rsq:_(s32) = contract G_FDIV %neg_one, %sqrt
287    ; GCN-NEXT: $vgpr0 = COPY %rsq(s32)
288    %x:_(s32) = COPY $vgpr0
289    %sqrt:_(s32) = contract G_FSQRT %x
290    %neg_one:_(s32) = G_FCONSTANT float -1.0
291    %rsq:_(s32) = contract G_FDIV %neg_one, %sqrt
292    $vgpr0 = COPY %rsq
293
294...
295
296---
297name:            afn_rsq_f32
298tracksRegLiveness: true
299body:             |
300  bb.0:
301    liveins: $vgpr0
302
303    ; GCN-LABEL: name: afn_rsq_f32
304    ; GCN: liveins: $vgpr0
305    ; GCN-NEXT: {{  $}}
306    ; GCN-NEXT: %x:_(s32) = COPY $vgpr0
307    ; GCN-NEXT: %sqrt:_(s32) = contract afn G_FSQRT %x
308    ; GCN-NEXT: %one:_(s32) = G_FCONSTANT float 1.000000e+00
309    ; GCN-NEXT: %rsq:_(s32) = contract afn G_FDIV %one, %sqrt
310    ; GCN-NEXT: $vgpr0 = COPY %rsq(s32)
311    %x:_(s32) = COPY $vgpr0
312    %sqrt:_(s32) = contract afn G_FSQRT %x
313    %one:_(s32) = G_FCONSTANT float 1.0
314    %rsq:_(s32) = contract afn G_FDIV %one, %sqrt
315    $vgpr0 = COPY %rsq
316
317...
318
319---
320name:            afn_rsq_f32_multi_use
321tracksRegLiveness: true
322body:             |
323  bb.0:
324    liveins: $vgpr0
325
326    ; GCN-LABEL: name: afn_rsq_f32_multi_use
327    ; GCN: liveins: $vgpr0
328    ; GCN-NEXT: {{  $}}
329    ; GCN-NEXT: %x:_(s32) = COPY $vgpr0
330    ; GCN-NEXT: %sqrt:_(s32) = contract afn G_FSQRT %x
331    ; GCN-NEXT: %one:_(s32) = G_FCONSTANT float 1.000000e+00
332    ; GCN-NEXT: %rsq:_(s32) = contract afn G_FDIV %one, %sqrt
333    ; GCN-NEXT: %ret:_(s32) = G_FSUB %sqrt, %rsq
334    ; GCN-NEXT: $vgpr0 = COPY %ret(s32)
335    %x:_(s32) = COPY $vgpr0
336    %sqrt:_(s32) = contract afn G_FSQRT %x
337    %one:_(s32) = G_FCONSTANT float 1.0
338    %rsq:_(s32) = contract afn G_FDIV %one, %sqrt
339    %ret:_(s32) = G_FSUB %sqrt, %rsq
340    $vgpr0 = COPY %ret
341
342...
343
344---
345name:            afn_neg_rsq_f32
346tracksRegLiveness: true
347body:             |
348  bb.0:
349    liveins: $vgpr0
350
351    ; GCN-LABEL: name: afn_neg_rsq_f32
352    ; GCN: liveins: $vgpr0
353    ; GCN-NEXT: {{  $}}
354    ; GCN-NEXT: %x:_(s32) = COPY $vgpr0
355    ; GCN-NEXT: %sqrt:_(s32) = contract afn G_FSQRT %x
356    ; GCN-NEXT: %neg_one:_(s32) = G_FCONSTANT float -1.000000e+00
357    ; GCN-NEXT: %rsq:_(s32) = contract afn G_FDIV %neg_one, %sqrt
358    ; GCN-NEXT: $vgpr0 = COPY %rsq(s32)
359    %x:_(s32) = COPY $vgpr0
360    %sqrt:_(s32) = contract afn G_FSQRT %x
361    %neg_one:_(s32) = G_FCONSTANT float -1.0
362    %rsq:_(s32) = contract afn G_FDIV %neg_one, %sqrt
363    $vgpr0 = COPY %rsq
364
365...
366
367
368---
369name:            rsq_f64
370tracksRegLiveness: true
371body:             |
372  bb.0:
373    liveins: $vgpr0
374
375    ; GCN-LABEL: name: rsq_f64
376    ; GCN: liveins: $vgpr0
377    ; GCN-NEXT: {{  $}}
378    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
379    ; GCN-NEXT: %x:_(s64) = G_ANYEXT [[COPY]](s32)
380    ; GCN-NEXT: %sqrt:_(s64) = contract G_FSQRT %x
381    ; GCN-NEXT: %one:_(s64) = G_FCONSTANT double 1.000000e+00
382    ; GCN-NEXT: %rsq:_(s64) = contract G_FDIV %one, %sqrt
383    ; GCN-NEXT: %ext:_(s32) = G_TRUNC %rsq(s64)
384    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
385    %0:_(s32) = COPY $vgpr0
386    %x:_(s64) = G_ANYEXT %0:_(s32)
387    %sqrt:_(s64) = contract G_FSQRT %x
388    %one:_(s64) = G_FCONSTANT double 1.0
389    %rsq:_(s64) = contract G_FDIV %one, %sqrt
390    %ext:_(s32) = G_TRUNC %rsq:_(s64)
391    $vgpr0 = COPY %ext
392
393...
394
395---
396name:            neg_rsq_f64
397tracksRegLiveness: true
398body:             |
399  bb.0:
400    liveins: $vgpr0
401
402    ; GCN-LABEL: name: neg_rsq_f64
403    ; GCN: liveins: $vgpr0
404    ; GCN-NEXT: {{  $}}
405    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
406    ; GCN-NEXT: %x:_(s64) = G_ANYEXT [[COPY]](s32)
407    ; GCN-NEXT: %sqrt:_(s64) = contract G_FSQRT %x
408    ; GCN-NEXT: %neg_one:_(s64) = G_FCONSTANT double -1.000000e+00
409    ; GCN-NEXT: %rsq:_(s64) = contract G_FDIV %neg_one, %sqrt
410    ; GCN-NEXT: %ext:_(s32) = G_TRUNC %rsq(s64)
411    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
412    %0:_(s32) = COPY $vgpr0
413    %x:_(s64) = G_ANYEXT %0:_(s32)
414    %sqrt:_(s64) = contract G_FSQRT %x
415    %neg_one:_(s64) = G_FCONSTANT double -1.0
416    %rsq:_(s64) = contract G_FDIV %neg_one, %sqrt
417    %ext:_(s32) = G_TRUNC %rsq:_(s64)
418    $vgpr0 = COPY %ext
419
420...
421
422---
423name:            afn_rsq_f64
424tracksRegLiveness: true
425body:             |
426  bb.0:
427    liveins: $vgpr0
428
429    ; GCN-LABEL: name: afn_rsq_f64
430    ; GCN: liveins: $vgpr0
431    ; GCN-NEXT: {{  $}}
432    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
433    ; GCN-NEXT: %x:_(s64) = G_ANYEXT [[COPY]](s32)
434    ; GCN-NEXT: %sqrt:_(s64) = contract afn G_FSQRT %x
435    ; GCN-NEXT: %one:_(s64) = G_FCONSTANT double 1.000000e+00
436    ; GCN-NEXT: %rsq:_(s64) = contract afn G_FDIV %one, %sqrt
437    ; GCN-NEXT: %ext:_(s32) = G_TRUNC %rsq(s64)
438    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
439    %0:_(s32) = COPY $vgpr0
440    %x:_(s64) = G_ANYEXT %0:_(s32)
441    %sqrt:_(s64) = contract afn G_FSQRT %x
442    %one:_(s64) = G_FCONSTANT double 1.0
443    %rsq:_(s64) = contract afn G_FDIV %one, %sqrt
444    %ext:_(s32) = G_TRUNC %rsq:_(s64)
445    $vgpr0 = COPY %ext
446
447...
448
449---
450name:            afn_neg_rsq_f64
451tracksRegLiveness: true
452body:             |
453  bb.0:
454    liveins: $vgpr0
455
456    ; GCN-LABEL: name: afn_neg_rsq_f64
457    ; GCN: liveins: $vgpr0
458    ; GCN-NEXT: {{  $}}
459    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
460    ; GCN-NEXT: %x:_(s64) = G_ANYEXT [[COPY]](s32)
461    ; GCN-NEXT: %sqrt:_(s64) = contract afn G_FSQRT %x
462    ; GCN-NEXT: %neg_one:_(s64) = G_FCONSTANT double -1.000000e+00
463    ; GCN-NEXT: %rsq:_(s64) = contract afn G_FDIV %neg_one, %sqrt
464    ; GCN-NEXT: %ext:_(s32) = G_TRUNC %rsq(s64)
465    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
466    %0:_(s32) = COPY $vgpr0
467    %x:_(s64) = G_ANYEXT %0:_(s32)
468    %sqrt:_(s64) = contract afn G_FSQRT %x
469    %neg_one:_(s64) = G_FCONSTANT double -1.0
470    %rsq:_(s64) = contract afn G_FDIV %neg_one, %sqrt
471    %ext:_(s32) = G_TRUNC %rsq:_(s64)
472    $vgpr0 = COPY %ext
473
474...
475
476
477---
478name:            rsq_fract_num_f16
479tracksRegLiveness: true
480body:             |
481  bb.0:
482    liveins: $vgpr0
483
484    ; GCN-LABEL: name: rsq_fract_num_f16
485    ; GCN: liveins: $vgpr0
486    ; GCN-NEXT: {{  $}}
487    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
488    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
489    ; GCN-NEXT: %fract:_(s16) = G_FCONSTANT half 0xH3800
490    ; GCN-NEXT: [[INT:%[0-9]+]]:_(s16) = contract G_INTRINSIC intrinsic(@llvm.amdgcn.rsq), %x(s16)
491    ; GCN-NEXT: %rsq:_(s16) = contract G_FMUL [[INT]], %fract
492    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
493    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
494    %0:_(s32) = COPY $vgpr0
495    %x:_(s16) = G_TRUNC %0:_(s32)
496    %sqrt:_(s16) = contract G_FSQRT %x
497    %fract:_(s16) = G_FCONSTANT half 0.5
498    %rsq:_(s16) = contract G_FDIV %fract, %sqrt
499    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
500    $vgpr0 = COPY %ext
501
502...
503
504---
505name:            neg_rsq_fract_num_f16
506tracksRegLiveness: true
507body:             |
508  bb.0:
509    liveins: $vgpr0
510
511    ; GCN-LABEL: name: neg_rsq_fract_num_f16
512    ; GCN: liveins: $vgpr0
513    ; GCN-NEXT: {{  $}}
514    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
515    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
516    ; GCN-NEXT: %neg_fract:_(s16) = G_FCONSTANT half 0xHB800
517    ; GCN-NEXT: [[INT:%[0-9]+]]:_(s16) = contract G_INTRINSIC intrinsic(@llvm.amdgcn.rsq), %x(s16)
518    ; GCN-NEXT: %rsq:_(s16) = contract G_FMUL [[INT]], %neg_fract
519    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
520    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
521    %0:_(s32) = COPY $vgpr0
522    %x:_(s16) = G_TRUNC %0:_(s32)
523    %sqrt:_(s16) = contract G_FSQRT %x
524    %neg_fract:_(s16) = G_FCONSTANT half -0.5
525    %rsq:_(s16) = contract G_FDIV %neg_fract, %sqrt
526    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
527    $vgpr0 = COPY %ext
528
529
530...
531
532---
533name:            rsq_large_num_f16
534tracksRegLiveness: true
535body:             |
536  bb.0:
537    liveins: $vgpr0
538
539    ; GCN-LABEL: name: rsq_large_num_f16
540    ; GCN: liveins: $vgpr0
541    ; GCN-NEXT: {{  $}}
542    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
543    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
544    ; GCN-NEXT: %ten:_(s16) = G_FCONSTANT half 0xH4900
545    ; GCN-NEXT: [[INT:%[0-9]+]]:_(s16) = contract G_INTRINSIC intrinsic(@llvm.amdgcn.rsq), %x(s16)
546    ; GCN-NEXT: %rsq:_(s16) = contract G_FMUL [[INT]], %ten
547    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
548    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
549    %0:_(s32) = COPY $vgpr0
550    %x:_(s16) = G_TRUNC %0:_(s32)
551    %sqrt:_(s16) = contract G_FSQRT %x
552    %ten:_(s16) = G_FCONSTANT half 10.0
553    %rsq:_(s16) = contract G_FDIV %ten, %sqrt
554    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
555    $vgpr0 = COPY %ext
556
557...
558
559---
560name:            neg_rsq_large_num_f16
561tracksRegLiveness: true
562body:             |
563  bb.0:
564    liveins: $vgpr0
565
566    ; GCN-LABEL: name: neg_rsq_large_num_f16
567    ; GCN: liveins: $vgpr0
568    ; GCN-NEXT: {{  $}}
569    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
570    ; GCN-NEXT: %x:_(s16) = G_TRUNC [[COPY]](s32)
571    ; GCN-NEXT: %neg_ten:_(s16) = G_FCONSTANT half 0xHC900
572    ; GCN-NEXT: [[INT:%[0-9]+]]:_(s16) = contract G_INTRINSIC intrinsic(@llvm.amdgcn.rsq), %x(s16)
573    ; GCN-NEXT: %rsq:_(s16) = contract G_FMUL [[INT]], %neg_ten
574    ; GCN-NEXT: %ext:_(s32) = G_ANYEXT %rsq(s16)
575    ; GCN-NEXT: $vgpr0 = COPY %ext(s32)
576    %0:_(s32) = COPY $vgpr0
577    %x:_(s16) = G_TRUNC %0:_(s32)
578    %sqrt:_(s16) = contract G_FSQRT %x
579    %neg_ten:_(s16) = G_FCONSTANT half -10.0
580    %rsq:_(s16) = contract G_FDIV %neg_ten, %sqrt
581    %ext:_(s32) = G_ANYEXT %rsq:_(s16)
582    $vgpr0 = COPY %ext
583
584...
585