Skip to content

Commit 8fb3995

Browse files
arsenmgithub-actions[bot]
authored andcommitted
Automerge: ValueTracking: Add baseline test for fpclass handling of amdgcn.rsq (#171836)
2 parents dd82e31 + 87b3bf5 commit 8fb3995

File tree

1 file changed

+290
-0
lines changed

1 file changed

+290
-0
lines changed
Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt -S -passes=attributor -attributor-manifest-internal < %s | FileCheck %s
3+
4+
declare half @llvm.amdgcn.rsq.f16(half)
5+
declare float @llvm.amdgcn.rsq.f32(float)
6+
declare double @llvm.amdgcn.rsq.f64(double)
7+
8+
define half @ret_rsq_f16(half %arg) {
9+
; CHECK-LABEL: define half @ret_rsq_f16(
10+
; CHECK-SAME: half [[ARG:%.*]]) #[[ATTR1:[0-9]+]] {
11+
; CHECK-NEXT: [[CALL:%.*]] = call half @llvm.amdgcn.rsq.f16(half [[ARG]]) #[[ATTR4:[0-9]+]]
12+
; CHECK-NEXT: ret half [[CALL]]
13+
;
14+
%call = call half @llvm.amdgcn.rsq.f16(half %arg)
15+
ret half %call
16+
}
17+
18+
define float @ret_rsq_f32(float %arg) {
19+
; CHECK-LABEL: define float @ret_rsq_f32(
20+
; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR1]] {
21+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float [[ARG]]) #[[ATTR4]]
22+
; CHECK-NEXT: ret float [[CALL]]
23+
;
24+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
25+
ret float %call
26+
}
27+
28+
define double @ret_rsq_f64(double %arg) {
29+
; CHECK-LABEL: define double @ret_rsq_f64(
30+
; CHECK-SAME: double [[ARG:%.*]]) #[[ATTR1]] {
31+
; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.amdgcn.rsq.f64(double [[ARG]]) #[[ATTR4]]
32+
; CHECK-NEXT: ret double [[CALL]]
33+
;
34+
%call = call double @llvm.amdgcn.rsq.f64(double %arg)
35+
ret double %call
36+
}
37+
38+
; Result could still be -0 if negative argument is flushed.
39+
define float @ret_rsq_f32_dynamic_denormal_input(float %arg) #0 {
40+
; CHECK-LABEL: define float @ret_rsq_f32_dynamic_denormal_input(
41+
; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR2:[0-9]+]] {
42+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float [[ARG]]) #[[ATTR4]]
43+
; CHECK-NEXT: ret float [[CALL]]
44+
;
45+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
46+
ret float %call
47+
}
48+
49+
define float @ret_rsq_f32_dynamic_denormal_input_known_nzero(float nofpclass(nzero) %arg) #0 {
50+
; CHECK-LABEL: define float @ret_rsq_f32_dynamic_denormal_input_known_nzero(
51+
; CHECK-SAME: float nofpclass(nzero) [[ARG:%.*]]) #[[ATTR2]] {
52+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(nzero) [[ARG]]) #[[ATTR4]]
53+
; CHECK-NEXT: ret float [[CALL]]
54+
;
55+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
56+
ret float %call
57+
}
58+
59+
define float @ret_rsq_f32_dynamic_denormal_input_known_nzero_nsub(float nofpclass(nzero nsub) %arg) #0 {
60+
; CHECK-LABEL: define float @ret_rsq_f32_dynamic_denormal_input_known_nzero_nsub(
61+
; CHECK-SAME: float nofpclass(nzero nsub) [[ARG:%.*]]) #[[ATTR2]] {
62+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(nzero nsub) [[ARG]]) #[[ATTR4]]
63+
; CHECK-NEXT: ret float [[CALL]]
64+
;
65+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
66+
ret float %call
67+
}
68+
69+
define double @ret_rsq_f64_dynamic_denormal_input(double %arg) #1 {
70+
; CHECK-LABEL: define double @ret_rsq_f64_dynamic_denormal_input(
71+
; CHECK-SAME: double [[ARG:%.*]]) #[[ATTR3:[0-9]+]] {
72+
; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.amdgcn.rsq.f64(double [[ARG]]) #[[ATTR4]]
73+
; CHECK-NEXT: ret double [[CALL]]
74+
;
75+
%call = call double @llvm.amdgcn.rsq.f64(double %arg)
76+
ret double %call
77+
}
78+
79+
define double @ret_rsq_f64_dynamic_denormal_input_known_nzero(double nofpclass(nzero) %arg) #0 {
80+
; CHECK-LABEL: define double @ret_rsq_f64_dynamic_denormal_input_known_nzero(
81+
; CHECK-SAME: double nofpclass(nzero) [[ARG:%.*]]) #[[ATTR2]] {
82+
; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.amdgcn.rsq.f64(double nofpclass(nzero) [[ARG]]) #[[ATTR4]]
83+
; CHECK-NEXT: ret double [[CALL]]
84+
;
85+
%call = call double @llvm.amdgcn.rsq.f64(double %arg)
86+
ret double %call
87+
}
88+
89+
define double @ret_rsq_f64_dynamic_denormal_input_known_nzero_nsub(double nofpclass(nzero nsub) %arg) #0 {
90+
; CHECK-LABEL: define double @ret_rsq_f64_dynamic_denormal_input_known_nzero_nsub(
91+
; CHECK-SAME: double nofpclass(nzero nsub) [[ARG:%.*]]) #[[ATTR2]] {
92+
; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.amdgcn.rsq.f64(double nofpclass(nzero nsub) [[ARG]]) #[[ATTR4]]
93+
; CHECK-NEXT: ret double [[CALL]]
94+
;
95+
%call = call double @llvm.amdgcn.rsq.f64(double %arg)
96+
ret double %call
97+
}
98+
99+
define float @ret_rsq_f32__no_snan_input(float nofpclass(snan) %arg) {
100+
; CHECK-LABEL: define float @ret_rsq_f32__no_snan_input(
101+
; CHECK-SAME: float nofpclass(snan) [[ARG:%.*]]) #[[ATTR1]] {
102+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(snan) [[ARG]]) #[[ATTR4]]
103+
; CHECK-NEXT: ret float [[CALL]]
104+
;
105+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
106+
ret float %call
107+
}
108+
109+
define float @ret_rsq_f32_nsz(float %arg) {
110+
; CHECK-LABEL: define float @ret_rsq_f32_nsz(
111+
; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR1]] {
112+
; CHECK-NEXT: [[CALL:%.*]] = call nsz float @llvm.amdgcn.rsq.f32(float [[ARG]]) #[[ATTR4]]
113+
; CHECK-NEXT: ret float [[CALL]]
114+
;
115+
%call = call nsz float @llvm.amdgcn.rsq.f32(float %arg)
116+
ret float %call
117+
}
118+
119+
define float @ret_rsq_f32_known_no_neg_zero(float nofpclass(nzero) %arg) {
120+
; CHECK-LABEL: define float @ret_rsq_f32_known_no_neg_zero(
121+
; CHECK-SAME: float nofpclass(nzero) [[ARG:%.*]]) #[[ATTR1]] {
122+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(nzero) [[ARG]]) #[[ATTR4]]
123+
; CHECK-NEXT: ret float [[CALL]]
124+
;
125+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
126+
ret float %call
127+
}
128+
129+
define float @ret_rsq_f32_known_no_pos_zero(float nofpclass(pzero) %arg) {
130+
; CHECK-LABEL: define float @ret_rsq_f32_known_no_pos_zero(
131+
; CHECK-SAME: float nofpclass(pzero) [[ARG:%.*]]) #[[ATTR1]] {
132+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(pzero) [[ARG]]) #[[ATTR4]]
133+
; CHECK-NEXT: ret float [[CALL]]
134+
;
135+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
136+
ret float %call
137+
}
138+
139+
define double @ret_rsq_f64_known_zero(double nofpclass(zero) %arg) {
140+
; CHECK-LABEL: define double @ret_rsq_f64_known_zero(
141+
; CHECK-SAME: double nofpclass(zero) [[ARG:%.*]]) #[[ATTR1]] {
142+
; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.amdgcn.rsq.f64(double nofpclass(zero) [[ARG]]) #[[ATTR4]]
143+
; CHECK-NEXT: ret double [[CALL]]
144+
;
145+
%call = call double @llvm.amdgcn.rsq.f64(double %arg)
146+
ret double %call
147+
}
148+
149+
define float @ret_rsq_f32_known_no_nan(float nofpclass(nan) %arg) {
150+
; CHECK-LABEL: define float @ret_rsq_f32_known_no_nan(
151+
; CHECK-SAME: float nofpclass(nan) [[ARG:%.*]]) #[[ATTR1]] {
152+
; CHECK-NEXT: [[CALL:%.*]] = call nsz float @llvm.amdgcn.rsq.f32(float nofpclass(nan) [[ARG]]) #[[ATTR4]]
153+
; CHECK-NEXT: ret float [[CALL]]
154+
;
155+
%call = call nsz float @llvm.amdgcn.rsq.f32(float %arg)
156+
ret float %call
157+
}
158+
159+
define float @ret_rsq_f32_known_no_inf(float nofpclass(inf) %arg) {
160+
; CHECK-LABEL: define float @ret_rsq_f32_known_no_inf(
161+
; CHECK-SAME: float nofpclass(inf) [[ARG:%.*]]) #[[ATTR1]] {
162+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(inf) [[ARG]]) #[[ATTR4]]
163+
; CHECK-NEXT: ret float [[CALL]]
164+
;
165+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
166+
ret float %call
167+
}
168+
169+
define float @ret_rsq_f32_known_no_nan_no_inf(float nofpclass(nan inf) %arg) {
170+
; CHECK-LABEL: define float @ret_rsq_f32_known_no_nan_no_inf(
171+
; CHECK-SAME: float nofpclass(nan inf) [[ARG:%.*]]) #[[ATTR1]] {
172+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(nan inf) [[ARG]]) #[[ATTR4]]
173+
; CHECK-NEXT: ret float [[CALL]]
174+
;
175+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
176+
ret float %call
177+
}
178+
179+
define float @ret_rsq_f32_poison() {
180+
; CHECK-LABEL: define float @ret_rsq_f32_poison(
181+
; CHECK-SAME: ) #[[ATTR1]] {
182+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float poison) #[[ATTR4]]
183+
; CHECK-NEXT: ret float [[CALL]]
184+
;
185+
%call = call float @llvm.amdgcn.rsq.f32(float poison)
186+
ret float %call
187+
}
188+
189+
define float @ret_rsq_f32_known_no_neg_normal_no_neg_subnormal(float nofpclass(nsub nnorm) %arg) {
190+
; CHECK-LABEL: define float @ret_rsq_f32_known_no_neg_normal_no_neg_subnormal(
191+
; CHECK-SAME: float nofpclass(nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
192+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(nsub nnorm) [[ARG]]) #[[ATTR4]]
193+
; CHECK-NEXT: ret float [[CALL]]
194+
;
195+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
196+
ret float %call
197+
}
198+
199+
define float @ret_rsq_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf(float nofpclass(ninf nsub nnorm) %arg) {
200+
; CHECK-LABEL: define float @ret_rsq_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf(
201+
; CHECK-SAME: float nofpclass(ninf nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
202+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
203+
; CHECK-NEXT: ret float [[CALL]]
204+
;
205+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
206+
ret float %call
207+
}
208+
209+
define float @ret_rsq_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_neg_zero(float nofpclass(ninf nzero nsub nnorm) %arg) {
210+
; CHECK-LABEL: define float @ret_rsq_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_neg_zero(
211+
; CHECK-SAME: float nofpclass(ninf nzero nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
212+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(ninf nzero nsub nnorm) [[ARG]]) #[[ATTR4]]
213+
; CHECK-NEXT: ret float [[CALL]]
214+
;
215+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
216+
ret float %call
217+
}
218+
219+
define float @ret_rsq_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_nan(float nofpclass(nan ninf nsub nnorm) %arg) {
220+
; CHECK-LABEL: define float @ret_rsq_f32_known_no_neg_normal_no_neg_subnormal_no_neg_inf_no_nan(
221+
; CHECK-SAME: float nofpclass(nan ninf nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
222+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(nan ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
223+
; CHECK-NEXT: ret float [[CALL]]
224+
;
225+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
226+
ret float %call
227+
}
228+
229+
define float @ret_rsq_f32_nnan_known_no_neg_normal_no_neg_subnormal_no_neg_inf(float nofpclass(ninf nsub nnorm) %arg) {
230+
; CHECK-LABEL: define nofpclass(nan) float @ret_rsq_f32_nnan_known_no_neg_normal_no_neg_subnormal_no_neg_inf(
231+
; CHECK-SAME: float nofpclass(ninf nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
232+
; CHECK-NEXT: [[CALL:%.*]] = call nnan nofpclass(nan) float @llvm.amdgcn.rsq.f32(float nofpclass(ninf nsub nnorm) [[ARG]]) #[[ATTR4]]
233+
; CHECK-NEXT: ret float [[CALL]]
234+
;
235+
%call = call nnan float @llvm.amdgcn.rsq.f32(float %arg)
236+
ret float %call
237+
}
238+
239+
define float @ret_rsq_f32_dynamic_denormal_input_known_pzero(float nofpclass(pzero) %arg) #0 {
240+
; CHECK-LABEL: define float @ret_rsq_f32_dynamic_denormal_input_known_pzero(
241+
; CHECK-SAME: float nofpclass(pzero) [[ARG:%.*]]) #[[ATTR2]] {
242+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(pzero) [[ARG]]) #[[ATTR4]]
243+
; CHECK-NEXT: ret float [[CALL]]
244+
;
245+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
246+
ret float %call
247+
}
248+
249+
define float @ret_rsq_f32_dynamic_denormal_input_known_pzero_psub(float nofpclass(pzero) %arg) #1 {
250+
; CHECK-LABEL: define float @ret_rsq_f32_dynamic_denormal_input_known_pzero_psub(
251+
; CHECK-SAME: float nofpclass(pzero) [[ARG:%.*]]) #[[ATTR3]] {
252+
; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.amdgcn.rsq.f32(float nofpclass(pzero) [[ARG]]) #[[ATTR4]]
253+
; CHECK-NEXT: ret float [[CALL]]
254+
;
255+
%call = call float @llvm.amdgcn.rsq.f32(float %arg)
256+
ret float %call
257+
}
258+
259+
define double @ret_rsq_f64_known_not_pinf(double nofpclass(pinf) %arg) {
260+
; CHECK-LABEL: define double @ret_rsq_f64_known_not_pinf(
261+
; CHECK-SAME: double nofpclass(pinf) [[ARG:%.*]]) #[[ATTR1]] {
262+
; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.amdgcn.rsq.f64(double nofpclass(pinf) [[ARG]]) #[[ATTR4]]
263+
; CHECK-NEXT: ret double [[CALL]]
264+
;
265+
%call = call double @llvm.amdgcn.rsq.f64(double %arg)
266+
ret double %call
267+
}
268+
269+
define double @ret_rsq_f64_known_not_ninf(double nofpclass(ninf) %arg) {
270+
; CHECK-LABEL: define double @ret_rsq_f64_known_not_ninf(
271+
; CHECK-SAME: double nofpclass(ninf) [[ARG:%.*]]) #[[ATTR1]] {
272+
; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.amdgcn.rsq.f64(double nofpclass(ninf) [[ARG]]) #[[ATTR4]]
273+
; CHECK-NEXT: ret double [[CALL]]
274+
;
275+
%call = call double @llvm.amdgcn.rsq.f64(double %arg)
276+
ret double %call
277+
}
278+
279+
define double @ret_rsq_f64_known_not_inf(double nofpclass(inf) %arg) {
280+
; CHECK-LABEL: define double @ret_rsq_f64_known_not_inf(
281+
; CHECK-SAME: double nofpclass(inf) [[ARG:%.*]]) #[[ATTR1]] {
282+
; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.amdgcn.rsq.f64(double nofpclass(inf) [[ARG]]) #[[ATTR4]]
283+
; CHECK-NEXT: ret double [[CALL]]
284+
;
285+
%call = call double @llvm.amdgcn.rsq.f64(double %arg)
286+
ret double %call
287+
}
288+
289+
attributes #0 = { "denormal-fp-math-f32"="ieee,dynamic" }
290+
attributes #1 = { "denormal-fp-math"="ieee,dynamic" }

0 commit comments

Comments
 (0)