xref: /llvm-project/llvm/test/Transforms/Attributor/nofpclass-sqrt.ll (revision d48d108bc66adb31185ee023e1eb0ccdda2065c1)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT
3
4declare float @llvm.sqrt.f32(float)
5declare <2 x float> @llvm.sqrt.v2f32(<2 x float>)
6declare float @llvm.experimental.constrained.sqrt.f32(float, metadata, metadata)
7
8define float @ret_sqrt(float %arg0) #0 {
9; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_sqrt
10; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR2:[0-9]+]] {
11; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(ninf nsub nnorm) float @llvm.sqrt.f32(float [[ARG0]]) #[[ATTR10:[0-9]+]]
12; CHECK-NEXT:    ret float [[CALL]]
13;
14  %call = call float @llvm.sqrt.f32(float %arg0)
15  ret float %call
16}
17
18define float @ret_sqrt_noinf(float nofpclass(inf) %arg0) #0 {
19; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_noinf
20; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR2]] {
21; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf) [[ARG0]]) #[[ATTR10]]
22; CHECK-NEXT:    ret float [[CALL]]
23;
24  %call = call float @llvm.sqrt.f32(float %arg0)
25  ret float %call
26}
27
28define float @ret_sqrt_nopinf(float nofpclass(pinf) %arg0) #0 {
29; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_nopinf
30; CHECK-SAME: (float nofpclass(pinf) [[ARG0:%.*]]) #[[ATTR2]] {
31; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(pinf) [[ARG0]]) #[[ATTR10]]
32; CHECK-NEXT:    ret float [[CALL]]
33;
34  %call = call float @llvm.sqrt.f32(float %arg0)
35  ret float %call
36}
37
38define float @ret_sqrt_noninf(float nofpclass(ninf) %arg0) #0 {
39; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_sqrt_noninf
40; CHECK-SAME: (float nofpclass(ninf) [[ARG0:%.*]]) #[[ATTR2]] {
41; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(ninf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(ninf) [[ARG0]]) #[[ATTR10]]
42; CHECK-NEXT:    ret float [[CALL]]
43;
44  %call = call float @llvm.sqrt.f32(float %arg0)
45  ret float %call
46}
47
48define float @ret_sqrt_nonan(float nofpclass(nan) %arg0) #0 {
49; CHECK-LABEL: define nofpclass(snan ninf nsub nnorm) float @ret_sqrt_nonan
50; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR2]] {
51; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(snan ninf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(nan) [[ARG0]]) #[[ATTR10]]
52; CHECK-NEXT:    ret float [[CALL]]
53;
54  %call = call float @llvm.sqrt.f32(float %arg0)
55  ret float %call
56}
57
58define float @ret_sqrt_nonan_noinf(float nofpclass(nan inf) %arg0) #0 {
59; CHECK-LABEL: define nofpclass(snan inf nsub nnorm) float @ret_sqrt_nonan_noinf
60; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]]) #[[ATTR2]] {
61; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(snan inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf) [[ARG0]]) #[[ATTR10]]
62; CHECK-NEXT:    ret float [[CALL]]
63;
64  %call = call float @llvm.sqrt.f32(float %arg0)
65  ret float %call
66}
67
68define float @ret_sqrt_nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0) #0 {
69; CHECK-LABEL: define nofpclass(snan inf nzero nsub nnorm) float @ret_sqrt_nonan_noinf_nozero
70; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]]) #[[ATTR2]] {
71; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(snan inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(nan inf zero) [[ARG0]]) #[[ATTR10]]
72; CHECK-NEXT:    ret float [[CALL]]
73;
74  %call = call float @llvm.sqrt.f32(float %arg0)
75  ret float %call
76}
77
78define float @ret_sqrt_noinf_nozero(float nofpclass(inf zero) %arg0) #0 {
79; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_noinf_nozero
80; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR2]] {
81; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]]
82; CHECK-NEXT:    ret float [[CALL]]
83;
84  %call = call float @llvm.sqrt.f32(float %arg0)
85  ret float %call
86}
87
88define float @ret_sqrt_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #0 {
89; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_noinf_nonegzero
90; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR2]] {
91; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]]
92; CHECK-NEXT:    ret float [[CALL]]
93;
94  %call = call float @llvm.sqrt.f32(float %arg0)
95  ret float %call
96}
97
98define float @ret_sqrt_positive_source(i32 %arg) #0 {
99; CHECK-LABEL: define nofpclass(nan inf nzero nsub nnorm) float @ret_sqrt_positive_source
100; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR2]] {
101; CHECK-NEXT:    [[UITOFP:%.*]] = uitofp i32 [[ARG]] to float
102; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(nan inf nzero nsub nnorm) float @llvm.sqrt.f32(float [[UITOFP]]) #[[ATTR10]]
103; CHECK-NEXT:    ret float [[CALL]]
104;
105  %uitofp = uitofp i32 %arg to float
106  %call = call float @llvm.sqrt.f32(float %uitofp)
107  ret float %call
108}
109
110; Could produce a nan because we don't know if the multiply is negative.
111define float @ret_sqrt_unknown_sign(float nofpclass(nan) %arg0, float nofpclass(nan) %arg1) #0 {
112; CHECK-LABEL: define nofpclass(snan ninf nsub nnorm) float @ret_sqrt_unknown_sign
113; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR2]] {
114; CHECK-NEXT:    [[UNKNOWN_SIGN_NOT_NAN:%.*]] = fmul nnan float [[ARG0]], [[ARG1]]
115; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(snan ninf nsub nnorm) float @llvm.sqrt.f32(float [[UNKNOWN_SIGN_NOT_NAN]]) #[[ATTR10]]
116; CHECK-NEXT:    ret float [[CALL]]
117;
118  %unknown.sign.not.nan = fmul nnan float %arg0, %arg1
119  %call = call float @llvm.sqrt.f32(float %unknown.sign.not.nan)
120  ret float %call
121}
122
123define float @ret_sqrt_daz_noinf_nozero(float nofpclass(inf zero) %arg0) #1 {
124; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_daz_noinf_nozero
125; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR3:[0-9]+]] {
126; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]]
127; CHECK-NEXT:    ret float [[CALL]]
128;
129  %call = call float @llvm.sqrt.f32(float %arg0)
130  ret float %call
131}
132
133define <2 x float> @ret_sqrt_daz_noinf_nozero_v2f32(<2 x float> nofpclass(inf zero) %arg0) #1 {
134; CHECK-LABEL: define nofpclass(inf nsub nnorm) <2 x float> @ret_sqrt_daz_noinf_nozero_v2f32
135; CHECK-SAME: (<2 x float> nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR3]] {
136; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nsub nnorm) <2 x float> @llvm.sqrt.v2f32(<2 x float> nofpclass(inf zero) [[ARG0]]) #[[ATTR10]]
137; CHECK-NEXT:    ret <2 x float> [[CALL]]
138;
139  %call = call <2 x float> @llvm.sqrt.v2f32(<2 x float> %arg0)
140  ret <2 x float> %call
141}
142
143define float @ret_sqrt_daz_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #1 {
144; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_daz_noinf_nonegzero
145; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR3]] {
146; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]]
147; CHECK-NEXT:    ret float [[CALL]]
148;
149  %call = call float @llvm.sqrt.f32(float %arg0)
150  ret float %call
151}
152
153define float @ret_sqrt_dapz_noinf_nozero(float nofpclass(inf zero) %arg0) #2 {
154; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_dapz_noinf_nozero
155; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR4:[0-9]+]] {
156; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]]
157; CHECK-NEXT:    ret float [[CALL]]
158;
159  %call = call float @llvm.sqrt.f32(float %arg0)
160  ret float %call
161}
162
163define float @ret_sqrt_dapz_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #2 {
164; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_dapz_noinf_nonegzero
165; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR4]] {
166; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]]
167; CHECK-NEXT:    ret float [[CALL]]
168;
169  %call = call float @llvm.sqrt.f32(float %arg0)
170  ret float %call
171}
172
173define float @ret_sqrt_dynamic_noinf_nozero(float nofpclass(inf zero) %arg0) #3 {
174; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_dynamic_noinf_nozero
175; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR5:[0-9]+]] {
176; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR10]]
177; CHECK-NEXT:    ret float [[CALL]]
178;
179  %call = call float @llvm.sqrt.f32(float %arg0)
180  ret float %call
181}
182
183define float @ret_sqrt_dynamic_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #3 {
184; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @ret_sqrt_dynamic_noinf_nonegzero
185; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR5]] {
186; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]]
187; CHECK-NEXT:    ret float [[CALL]]
188;
189  %call = call float @llvm.sqrt.f32(float %arg0)
190  ret float %call
191}
192
193define float @ret_sqrt_ftz_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #4 {
194; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_ftz_noinf_nonegzero
195; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR6:[0-9]+]] {
196; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]]
197; CHECK-NEXT:    ret float [[CALL]]
198;
199  %call = call float @llvm.sqrt.f32(float %arg0)
200  ret float %call
201}
202
203define float @ret_sqrt_ftpz_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #5 {
204; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_ftpz_noinf_nonegzero
205; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR7:[0-9]+]] {
206; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]]
207; CHECK-NEXT:    ret float [[CALL]]
208;
209  %call = call float @llvm.sqrt.f32(float %arg0)
210  ret float %call
211}
212
213define float @ret_sqrt_ftz_dynamic_noinf_nonegzero(float nofpclass(inf nzero) %arg0) #6 {
214; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_sqrt_ftz_dynamic_noinf_nonegzero
215; CHECK-SAME: (float nofpclass(inf nzero) [[ARG0:%.*]]) #[[ATTR8:[0-9]+]] {
216; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.sqrt.f32(float nofpclass(inf nzero) [[ARG0]]) #[[ATTR10]]
217; CHECK-NEXT:    ret float [[CALL]]
218;
219  %call = call float @llvm.sqrt.f32(float %arg0)
220  ret float %call
221}
222
223define float @constrained_sqrt(float %arg) strictfp {
224; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @constrained_sqrt
225; CHECK-SAME: (float [[ARG:%.*]]) #[[ATTR9:[0-9]+]] {
226; CHECK-NEXT:    [[VAL:%.*]] = call nofpclass(ninf nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11:[0-9]+]]
227; CHECK-NEXT:    ret float [[VAL]]
228;
229  %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict")
230  ret float %val
231}
232
233define float @constrained_sqrt_nonan(float nofpclass(nan) %arg) strictfp {
234; CHECK-LABEL: define nofpclass(snan ninf nsub nnorm) float @constrained_sqrt_nonan
235; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR9]] {
236; CHECK-NEXT:    [[VAL:%.*]] = call nofpclass(snan ninf nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(nan) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]]
237; CHECK-NEXT:    ret float [[VAL]]
238;
239  %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict")
240  ret float %val
241}
242
243define float @constrained_sqrt_nopinf(float nofpclass(pinf) %arg) strictfp {
244; CHECK-LABEL: define nofpclass(inf nsub nnorm) float @constrained_sqrt_nopinf
245; CHECK-SAME: (float nofpclass(pinf) [[ARG:%.*]]) #[[ATTR9]] {
246; CHECK-NEXT:    [[VAL:%.*]] = call nofpclass(inf nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(pinf) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]]
247; CHECK-NEXT:    ret float [[VAL]]
248;
249  %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict")
250  ret float %val
251}
252
253define float @constrained_sqrt_nonegzero(float nofpclass(nzero) %arg) strictfp {
254; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @constrained_sqrt_nonegzero
255; CHECK-SAME: (float nofpclass(nzero) [[ARG:%.*]]) #[[ATTR9]] {
256; CHECK-NEXT:    [[VAL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(nzero) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]]
257; CHECK-NEXT:    ret float [[VAL]]
258;
259  %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict")
260  ret float %val
261}
262
263define float @constrained_sqrt_nozero(float nofpclass(zero) %arg) strictfp {
264; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @constrained_sqrt_nozero
265; CHECK-SAME: (float nofpclass(zero) [[ARG:%.*]]) #[[ATTR9]] {
266; CHECK-NEXT:    [[VAL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.experimental.constrained.sqrt.f32(float nofpclass(zero) [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR11]]
267; CHECK-NEXT:    ret float [[VAL]]
268;
269  %val = call float @llvm.experimental.constrained.sqrt.f32(float %arg, metadata !"round.dynamic", metadata !"fpexcept.strict")
270  ret float %val
271}
272
273attributes #0 = { "denormal-fp-math"="ieee,ieee" }
274attributes #1 = { "denormal-fp-math"="ieee,preserve-sign" }
275attributes #2 = { "denormal-fp-math"="ieee,positive-zero" }
276attributes #3 = { "denormal-fp-math"="ieee,dynamic" }
277attributes #4 = { "denormal-fp-math"="preserve-sign,ieee" }
278attributes #5 = { "denormal-fp-math"="positive-zero,ieee" }
279attributes #6 = { "denormal-fp-math"="dynamic,ieee" }
280
281;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
282; TUNIT: {{.*}}
283