xref: /llvm-project/llvm/test/Transforms/Attributor/nofpclass-frexp.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, i32 } @llvm.frexp.f32.i32(float)
5declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>)
6declare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>)
7
8define { float, i32 } @ret_frexp_f32(float %arg0) {
9; CHECK-LABEL: define { float, i32 } @ret_frexp_f32
10; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR1:[0-9]+]] {
11; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0]]) #[[ATTR7:[0-9]+]]
12; CHECK-NEXT:    ret { float, i32 } [[CALL]]
13;
14  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
15  ret { float, i32 } %call
16}
17
18define { float, i32 } @ret_frexp_f32_nonan(float nofpclass(nan) %arg0) {
19; CHECK-LABEL: define { float, i32 } @ret_frexp_f32_nonan
20; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {
21; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan) [[ARG0]]) #[[ATTR7]]
22; CHECK-NEXT:    ret { float, i32 } [[CALL]]
23;
24  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
25  ret { float, i32 } %call
26}
27
28define float @ret_frexp_f32_0_nonan(float nofpclass(nan) %arg0) {
29; CHECK-LABEL: define nofpclass(nan sub) float @ret_frexp_f32_0_nonan
30; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {
31; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan) [[ARG0]]) #[[ATTR7]]
32; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
33; CHECK-NEXT:    ret float [[CALL_0]]
34;
35  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
36  %call.0 = extractvalue { float, i32 } %call, 0
37  ret float %call.0
38}
39
40define float @ret_frexp_f32_0_nosnan(float nofpclass(snan) %arg0) {
41; CHECK-LABEL: define nofpclass(snan sub) float @ret_frexp_f32_0_nosnan
42; CHECK-SAME: (float nofpclass(snan) [[ARG0:%.*]]) #[[ATTR1]] {
43; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(snan) [[ARG0]]) #[[ATTR7]]
44; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
45; CHECK-NEXT:    ret float [[CALL_0]]
46;
47  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
48  %call.0 = extractvalue { float, i32 } %call, 0
49  ret float %call.0
50}
51
52define float @ret_frexp_f32_0_noqnan(float nofpclass(qnan) %arg0) {
53; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_noqnan
54; CHECK-SAME: (float nofpclass(qnan) [[ARG0:%.*]]) #[[ATTR1]] {
55; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(qnan) [[ARG0]]) #[[ATTR7]]
56; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
57; CHECK-NEXT:    ret float [[CALL_0]]
58;
59  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
60  %call.0 = extractvalue { float, i32 } %call, 0
61  ret float %call.0
62}
63
64define i32 @ret_frexp_f32_1_nonan(float nofpclass(nan) %arg0) {
65; CHECK-LABEL: define i32 @ret_frexp_f32_1_nonan
66; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {
67; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan) [[ARG0]]) #[[ATTR7]]
68; CHECK-NEXT:    [[CALL_1:%.*]] = extractvalue { float, i32 } [[CALL]], 1
69; CHECK-NEXT:    ret i32 [[CALL_1]]
70;
71  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
72  %call.1 = extractvalue { float, i32 } %call, 1
73  ret i32 %call.1
74}
75
76define <2 x float> @ret_frexp_v2f32_0_nonan(<2 x float> nofpclass(nan) %arg0) {
77; CHECK-LABEL: define nofpclass(nan sub) <2 x float> @ret_frexp_v2f32_0_nonan
78; CHECK-SAME: (<2 x float> nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {
79; CHECK-NEXT:    [[CALL:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> nofpclass(nan) [[ARG0]]) #[[ATTR7]]
80; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { <2 x float>, <2 x i32> } [[CALL]], 0
81; CHECK-NEXT:    ret <2 x float> [[CALL_0]]
82;
83  %call = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %arg0)
84  %call.0 = extractvalue { <2 x float>, <2 x i32> } %call, 0
85  ret <2 x float> %call.0
86}
87
88define <2 x i32> @ret_frexp_v2f32_1_nonan(<2 x float> nofpclass(nan) %arg0) {
89; CHECK-LABEL: define <2 x i32> @ret_frexp_v2f32_1_nonan
90; CHECK-SAME: (<2 x float> nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {
91; CHECK-NEXT:    [[CALL:%.*]] = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> nofpclass(nan) [[ARG0]]) #[[ATTR7]]
92; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { <2 x float>, <2 x i32> } [[CALL]], 1
93; CHECK-NEXT:    ret <2 x i32> [[CALL_0]]
94;
95  %call = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %arg0)
96  %call.0 = extractvalue { <2 x float>, <2 x i32> } %call, 1
97  ret <2 x i32> %call.0
98}
99
100define float @ret_frexp_v4f32_0_nonan_elt1(<4 x float> nofpclass(nan) %arg0) {
101; CHECK-LABEL: define nofpclass(nan sub) float @ret_frexp_v4f32_0_nonan_elt1
102; CHECK-SAME: (<4 x float> nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {
103; CHECK-NEXT:    [[CALL:%.*]] = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> nofpclass(nan) [[ARG0]]) #[[ATTR7]]
104; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { <4 x float>, <4 x i32> } [[CALL]], 0
105; CHECK-NEXT:    [[ELT_2:%.*]] = extractelement <4 x float> [[CALL_0]], i32 2
106; CHECK-NEXT:    ret float [[ELT_2]]
107;
108  %call = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %arg0)
109  %call.0 = extractvalue { <4 x float>, <4 x i32> } %call, 0
110  %elt.2 = extractelement <4 x float> %call.0, i32 2
111  ret float %elt.2
112}
113
114define float @ret_frexp_f32_0_nopos_nopzero(float nofpclass(pinf psub pnorm pzero) %arg0) {
115; CHECK-LABEL: define nofpclass(pinf pzero sub pnorm) float @ret_frexp_f32_0_nopos_nopzero
116; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] {
117; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pinf pzero psub pnorm) [[ARG0]]) #[[ATTR7]]
118; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
119; CHECK-NEXT:    ret float [[CALL_0]]
120;
121  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
122  %call.0 = extractvalue { float, i32 } %call, 0
123  ret float %call.0
124}
125
126define float @ret_frexp_f32_0_nopos_nopzero_nonan(float nofpclass(pinf psub pnorm pzero nan) %arg0) {
127; CHECK-LABEL: define nofpclass(nan pinf pzero sub pnorm) float @ret_frexp_f32_0_nopos_nopzero_nonan
128; CHECK-SAME: (float nofpclass(nan pinf pzero psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] {
129; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan pinf pzero psub pnorm) [[ARG0]]) #[[ATTR7]]
130; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
131; CHECK-NEXT:    ret float [[CALL_0]]
132;
133  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
134  %call.0 = extractvalue { float, i32 } %call, 0
135  ret float %call.0
136}
137
138define float @ret_frexp_f32_0_nopos(float nofpclass(pinf psub pnorm) %arg0) {
139; CHECK-LABEL: define nofpclass(pinf sub) float @ret_frexp_f32_0_nopos
140; CHECK-SAME: (float nofpclass(pinf psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] {
141; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pinf psub pnorm) [[ARG0]]) #[[ATTR7]]
142; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
143; CHECK-NEXT:    ret float [[CALL_0]]
144;
145  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
146  %call.0 = extractvalue { float, i32 } %call, 0
147  ret float %call.0
148}
149
150define float @ret_frexp_f32_0_nopos_nonan(float nofpclass(pinf psub pnorm nan) %arg0) {
151; CHECK-LABEL: define nofpclass(nan pinf sub) float @ret_frexp_f32_0_nopos_nonan
152; CHECK-SAME: (float nofpclass(nan pinf psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] {
153; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan pinf psub pnorm) [[ARG0]]) #[[ATTR7]]
154; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
155; CHECK-NEXT:    ret float [[CALL_0]]
156;
157  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
158  %call.0 = extractvalue { float, i32 } %call, 0
159  ret float %call.0
160}
161
162define float @ret_frexp_f32_0_nopos_nozero(float nofpclass(pinf psub pnorm zero) %arg0) {
163; CHECK-LABEL: define nofpclass(pinf zero sub pnorm) float @ret_frexp_f32_0_nopos_nozero
164; CHECK-SAME: (float nofpclass(pinf zero psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] {
165; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pinf zero psub pnorm) [[ARG0]]) #[[ATTR7]]
166; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
167; CHECK-NEXT:    ret float [[CALL_0]]
168;
169  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
170  %call.0 = extractvalue { float, i32 } %call, 0
171  ret float %call.0
172}
173
174define float @ret_frexp_f32_0_noneg_nonzero(float nofpclass(ninf nsub nnorm nzero) %arg0) {
175; CHECK-LABEL: define nofpclass(ninf nzero sub nnorm) float @ret_frexp_f32_0_noneg_nonzero
176; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] {
177; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(ninf nzero nsub nnorm) [[ARG0]]) #[[ATTR7]]
178; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
179; CHECK-NEXT:    ret float [[CALL_0]]
180;
181  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
182  %call.0 = extractvalue { float, i32 } %call, 0
183  ret float %call.0
184}
185
186define float @ret_frexp_f32_0_noneg_nonzero_nonan(float nofpclass(ninf nsub nnorm nzero nan) %arg0) {
187; CHECK-LABEL: define nofpclass(nan ninf nzero sub nnorm) float @ret_frexp_f32_0_noneg_nonzero_nonan
188; CHECK-SAME: (float nofpclass(nan ninf nzero nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] {
189; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan ninf nzero nsub nnorm) [[ARG0]]) #[[ATTR7]]
190; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
191; CHECK-NEXT:    ret float [[CALL_0]]
192;
193  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
194  %call.0 = extractvalue { float, i32 } %call, 0
195  ret float %call.0
196}
197
198define float @ret_frexp_f32_0_noneg(float nofpclass(ninf nsub nnorm) %arg0) {
199; CHECK-LABEL: define nofpclass(ninf sub) float @ret_frexp_f32_0_noneg
200; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] {
201; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(ninf nsub nnorm) [[ARG0]]) #[[ATTR7]]
202; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
203; CHECK-NEXT:    ret float [[CALL_0]]
204;
205  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
206  %call.0 = extractvalue { float, i32 } %call, 0
207  ret float %call.0
208}
209
210define float @ret_frexp_f32_0_noneg_nonan(float nofpclass(ninf nsub nnorm nan) %arg0) {
211; CHECK-LABEL: define nofpclass(nan ninf sub) float @ret_frexp_f32_0_noneg_nonan
212; CHECK-SAME: (float nofpclass(nan ninf nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] {
213; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan ninf nsub nnorm) [[ARG0]]) #[[ATTR7]]
214; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
215; CHECK-NEXT:    ret float [[CALL_0]]
216;
217  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
218  %call.0 = extractvalue { float, i32 } %call, 0
219  ret float %call.0
220}
221
222define float @ret_frexp_f32_0_noneg_nozero(float nofpclass(ninf nsub nnorm nzero) %arg0) {
223; CHECK-LABEL: define nofpclass(ninf nzero sub nnorm) float @ret_frexp_f32_0_noneg_nozero
224; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] {
225; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(ninf nzero nsub nnorm) [[ARG0]]) #[[ATTR7]]
226; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
227; CHECK-NEXT:    ret float [[CALL_0]]
228;
229  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
230  %call.0 = extractvalue { float, i32 } %call, 0
231  ret float %call.0
232}
233
234define float @ret_frexp_f32_0_nopzero(float nofpclass(pzero) %arg0) {
235; CHECK-LABEL: define nofpclass(pzero sub) float @ret_frexp_f32_0_nopzero
236; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR1]] {
237; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]]
238; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
239; CHECK-NEXT:    ret float [[CALL_0]]
240;
241  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
242  %call.0 = extractvalue { float, i32 } %call, 0
243  ret float %call.0
244}
245
246define float @ret_frexp_f32_0_nonzero(float nofpclass(nzero) %arg0) {
247; CHECK-LABEL: define nofpclass(nzero sub) float @ret_frexp_f32_0_nonzero
248; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR1]] {
249; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]]
250; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
251; CHECK-NEXT:    ret float [[CALL_0]]
252;
253  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
254  %call.0 = extractvalue { float, i32 } %call, 0
255  ret float %call.0
256}
257
258define float @ret_frexp_f32_0_nozero(float nofpclass(zero) %arg0) {
259; CHECK-LABEL: define nofpclass(zero sub) float @ret_frexp_f32_0_nozero
260; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]]) #[[ATTR1]] {
261; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(zero) [[ARG0]]) #[[ATTR7]]
262; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
263; CHECK-NEXT:    ret float [[CALL_0]]
264;
265  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
266  %call.0 = extractvalue { float, i32 } %call, 0
267  ret float %call.0
268}
269
270define float @ret_frexp_f32_0_nopinf(float nofpclass(pinf) %arg0) {
271; CHECK-LABEL: define nofpclass(pinf sub) float @ret_frexp_f32_0_nopinf
272; CHECK-SAME: (float nofpclass(pinf) [[ARG0:%.*]]) #[[ATTR1]] {
273; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pinf) [[ARG0]]) #[[ATTR7]]
274; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
275; CHECK-NEXT:    ret float [[CALL_0]]
276;
277  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
278  %call.0 = extractvalue { float, i32 } %call, 0
279  ret float %call.0
280}
281
282define float @ret_frexp_f32_0_noninf(float nofpclass(ninf) %arg0) {
283; CHECK-LABEL: define nofpclass(ninf sub) float @ret_frexp_f32_0_noninf
284; CHECK-SAME: (float nofpclass(ninf) [[ARG0:%.*]]) #[[ATTR1]] {
285; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(ninf) [[ARG0]]) #[[ATTR7]]
286; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
287; CHECK-NEXT:    ret float [[CALL_0]]
288;
289  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
290  %call.0 = extractvalue { float, i32 } %call, 0
291  ret float %call.0
292}
293
294define float @ret_frexp_f32_0_noinf(float nofpclass(inf) %arg0) {
295; CHECK-LABEL: define nofpclass(inf sub) float @ret_frexp_f32_0_noinf
296; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]]) #[[ATTR1]] {
297; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(inf) [[ARG0]]) #[[ATTR7]]
298; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
299; CHECK-NEXT:    ret float [[CALL_0]]
300;
301  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
302  %call.0 = extractvalue { float, i32 } %call, 0
303  ret float %call.0
304}
305
306define float @ret_frexp_f32_0_nozero_nonan(float nofpclass(zero nan) %arg0) {
307; CHECK-LABEL: define nofpclass(nan zero sub) float @ret_frexp_f32_0_nozero_nonan
308; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]]) #[[ATTR1]] {
309; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan zero) [[ARG0]]) #[[ATTR7]]
310; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
311; CHECK-NEXT:    ret float [[CALL_0]]
312;
313  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
314  %call.0 = extractvalue { float, i32 } %call, 0
315  ret float %call.0
316}
317
318define float @ret_frexp_f32_0_nozero_noinf(float nofpclass(zero inf) %arg0) {
319; CHECK-LABEL: define nofpclass(inf zero sub) float @ret_frexp_f32_0_nozero_noinf
320; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]]) #[[ATTR1]] {
321; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(inf zero) [[ARG0]]) #[[ATTR7]]
322; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
323; CHECK-NEXT:    ret float [[CALL_0]]
324;
325  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
326  %call.0 = extractvalue { float, i32 } %call, 0
327  ret float %call.0
328}
329
330define float @ret_frexp_f32_0_nozero_nonan_noinf(float nofpclass(zero nan inf) %arg0) {
331; CHECK-LABEL: define nofpclass(nan inf zero sub) float @ret_frexp_f32_0_nozero_nonan_noinf
332; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]]) #[[ATTR1]] {
333; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nan inf zero) [[ARG0]]) #[[ATTR7]]
334; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
335; CHECK-NEXT:    ret float [[CALL_0]]
336;
337  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
338  %call.0 = extractvalue { float, i32 } %call, 0
339  ret float %call.0
340}
341
342define float @ret_frexp_f32_0_nonzero_ftz_daz(float nofpclass(nzero) %arg0) #1 {
343; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nonzero_ftz_daz
344; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR2:[0-9]+]] {
345; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]]
346; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
347; CHECK-NEXT:    ret float [[CALL_0]]
348;
349  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
350  %call.0 = extractvalue { float, i32 } %call, 0
351  ret float %call.0
352}
353
354define float @ret_frexp_f32_0_nonzero_ftpz_dapz(float nofpclass(nzero) %arg0) #2 {
355; CHECK-LABEL: define nofpclass(nzero sub) float @ret_frexp_f32_0_nonzero_ftpz_dapz
356; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR3:[0-9]+]] {
357; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]]
358; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
359; CHECK-NEXT:    ret float [[CALL_0]]
360;
361  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
362  %call.0 = extractvalue { float, i32 } %call, 0
363  ret float %call.0
364}
365
366define float @ret_frexp_f32_0_nonzero_dynamic_dynamic(float nofpclass(nzero) %arg0) #3 {
367; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nonzero_dynamic_dynamic
368; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR4:[0-9]+]] {
369; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]]
370; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
371; CHECK-NEXT:    ret float [[CALL_0]]
372;
373  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
374  %call.0 = extractvalue { float, i32 } %call, 0
375  ret float %call.0
376}
377
378define float @ret_frexp_f32_0_nonzero_ieee_daz(float nofpclass(nzero) %arg0) #4 {
379; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nonzero_ieee_daz
380; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR5:[0-9]+]] {
381; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]]
382; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
383; CHECK-NEXT:    ret float [[CALL_0]]
384;
385  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
386  %call.0 = extractvalue { float, i32 } %call, 0
387  ret float %call.0
388}
389
390define float @ret_frexp_f32_0_nonzero_daz_ieee(float nofpclass(nzero) %arg0) #5 {
391; CHECK-LABEL: define nofpclass(nzero sub) float @ret_frexp_f32_0_nonzero_daz_ieee
392; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR6:[0-9]+]] {
393; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(nzero) [[ARG0]]) #[[ATTR7]]
394; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
395; CHECK-NEXT:    ret float [[CALL_0]]
396;
397  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
398  %call.0 = extractvalue { float, i32 } %call, 0
399  ret float %call.0
400}
401
402define float @ret_frexp_f32_0_nopzero_ftz_daz(float nofpclass(pzero) %arg0) #1 {
403; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nopzero_ftz_daz
404; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR2]] {
405; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]]
406; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
407; CHECK-NEXT:    ret float [[CALL_0]]
408;
409  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
410  %call.0 = extractvalue { float, i32 } %call, 0
411  ret float %call.0
412}
413
414define float @ret_frexp_f32_0_nopzero_ftpz_dapz(float nofpclass(pzero) %arg0) #2 {
415; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nopzero_ftpz_dapz
416; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR3]] {
417; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]]
418; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
419; CHECK-NEXT:    ret float [[CALL_0]]
420;
421  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
422  %call.0 = extractvalue { float, i32 } %call, 0
423  ret float %call.0
424}
425
426define float @ret_frexp_f32_0_nopzero_dynamic_dynamic(float nofpclass(pzero) %arg0) #3 {
427; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nopzero_dynamic_dynamic
428; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR4]] {
429; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]]
430; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
431; CHECK-NEXT:    ret float [[CALL_0]]
432;
433  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
434  %call.0 = extractvalue { float, i32 } %call, 0
435  ret float %call.0
436}
437
438define float @ret_frexp_f32_0_nopzero_ieee_daz(float nofpclass(pzero) %arg0) #4 {
439; CHECK-LABEL: define nofpclass(sub) float @ret_frexp_f32_0_nopzero_ieee_daz
440; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR5]] {
441; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]]
442; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
443; CHECK-NEXT:    ret float [[CALL_0]]
444;
445  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
446  %call.0 = extractvalue { float, i32 } %call, 0
447  ret float %call.0
448}
449
450define float @ret_frexp_f32_0_nopzero_daz_ieee(float nofpclass(pzero) %arg0) #5 {
451; CHECK-LABEL: define nofpclass(pzero sub) float @ret_frexp_f32_0_nopzero_daz_ieee
452; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR6]] {
453; CHECK-NEXT:    [[CALL:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float nofpclass(pzero) [[ARG0]]) #[[ATTR7]]
454; CHECK-NEXT:    [[CALL_0:%.*]] = extractvalue { float, i32 } [[CALL]], 0
455; CHECK-NEXT:    ret float [[CALL_0]]
456;
457  %call = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
458  %call.0 = extractvalue { float, i32 } %call, 0
459  ret float %call.0
460}
461
462
463attributes #0 = { "denormal-fp-math"="ieee,ieee" }
464attributes #1 = { "denormal-fp-math"="preserve-sign,preserve-sign" }
465attributes #2 = { "denormal-fp-math"="positive-zero,positive-zero" }
466attributes #3 = { "denormal-fp-math"="dynamic,dynamic" }
467attributes #4 = { "denormal-fp-math"="ieee,preserve-sign" }
468attributes #5 = { "denormal-fp-math"="preserve-sign,ieee" }
469
470
471;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
472; TUNIT: {{.*}}
473