xref: /llvm-project/llvm/test/Transforms/InstCombine/fold-select-fmul-if-zero.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes
2; RUN: opt -S -passes=instcombine < %s | FileCheck -check-prefixes=CHECK,IEEE %s
3; RUN: opt -S -passes=instcombine -denormal-fp-math=preserve-sign < %s | FileCheck -check-prefixes=CHECK,DAZ  %s
4; RUN: opt -S -passes=instcombine -denormal-fp-math=positive-zero < %s | FileCheck -check-prefixes=CHECK,DAPZ  %s
5
6; Test for patterns that appear when denormal range checks are folded
7; to compares to 0, which drop canonicalizing
8
9declare void @llvm.assume(i1 noundef)
10declare float @llvm.fabs.f32(float)
11declare float @llvm.ldexp.f32.i32(float, i32)
12declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>)
13
14
15define i32 @fcmp_zero_select_is_not_fp(float %x) {
16; CHECK-LABEL: @fcmp_zero_select_is_not_fp(
17; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = bitcast float [[X:%.*]] to i32
18; CHECK-NEXT:    ret i32 [[SCALED_IF_DENORMAL]]
19;
20  %x.is.zero = fcmp oeq float %x, 0.0
21  %scaled.x = fmul float %x, 32.0
22  %bitcast.scaled.x = bitcast float %scaled.x to i32
23  %bitcast.x = bitcast float %x to i32
24  %scaled.if.denormal = select i1 %x.is.zero, i32 %bitcast.scaled.x, i32 %bitcast.x
25  ret i32 %scaled.if.denormal
26}
27
28define i32 @fcmp_zero_select_is_not_fp_unfoldable(float %x, i32 %y, i32 %z) {
29; CHECK-LABEL: @fcmp_zero_select_is_not_fp_unfoldable(
30; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
31; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[X_IS_ZERO]], i32 [[Y:%.*]], i32 [[Z:%.*]]
32; CHECK-NEXT:    ret i32 [[SELECT]]
33;
34  %x.is.zero = fcmp oeq float %x, 0.0
35  %select = select i1 %x.is.zero, i32 %y, i32 %z
36  ret i32 %select
37}
38
39; Real case
40define float @fmul_by_32_if_0_oeq_zero_f32(float %x) {
41; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_f32(
42; CHECK-NEXT:    ret float [[X:%.*]]
43;
44  %x.is.zero = fcmp oeq float %x, 0.0
45  %scaled.x = fmul float %x, 32.0
46  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
47  ret float %scaled.if.denormal
48}
49
50define float @ldexp_by_5_if_0_oeq_zero_f32(float %x) {
51; CHECK-LABEL: @ldexp_by_5_if_0_oeq_zero_f32(
52; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
53; CHECK-NEXT:    [[SCALED_X:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 5)
54; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]
55; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
56;
57  %x.is.zero = fcmp oeq float %x, 0.0
58  %scaled.x = call float @llvm.ldexp.f32.i32(float %x, i32 5)
59  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
60  ret float %scaled.if.denormal
61}
62
63define <2 x float> @ldexp_by_5_if_0_oeq_zero_v2f32(<2 x float> %x) {
64; CHECK-LABEL: @ldexp_by_5_if_0_oeq_zero_v2f32(
65; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq <2 x float> [[X:%.*]], zeroinitializer
66; CHECK-NEXT:    [[SCALED_X:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> splat (i32 5))
67; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select <2 x i1> [[X_IS_ZERO]], <2 x float> [[SCALED_X]], <2 x float> [[X]]
68; CHECK-NEXT:    ret <2 x float> [[SCALED_IF_DENORMAL]]
69;
70  %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer
71  %scaled.x = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> <i32 5, i32 5>)
72  %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x
73  ret <2 x float> %scaled.if.denormal
74}
75
76define <2 x float> @ldexp_by_n_if_0_oeq_zero_v2f32(<2 x float> %x, <2 x i32> %n) {
77; CHECK-LABEL: @ldexp_by_n_if_0_oeq_zero_v2f32(
78; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq <2 x float> [[X:%.*]], zeroinitializer
79; CHECK-NEXT:    [[SCALED_X:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> [[N:%.*]])
80; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select <2 x i1> [[X_IS_ZERO]], <2 x float> [[SCALED_X]], <2 x float> [[X]]
81; CHECK-NEXT:    ret <2 x float> [[SCALED_IF_DENORMAL]]
82;
83  %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer
84  %scaled.x = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> %n)
85  %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x
86  ret <2 x float> %scaled.if.denormal
87}
88
89define float @ldexp_by_n_if_0_oeq_zero_f32(float %x, i32 %n) {
90; CHECK-LABEL: @ldexp_by_n_if_0_oeq_zero_f32(
91; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
92; CHECK-NEXT:    [[SCALED_X:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[N:%.*]])
93; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]
94; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
95;
96  %x.is.zero = fcmp oeq float %x, 0.0
97  %scaled.x = call float @llvm.ldexp.f32.i32(float %x, i32 %n)
98  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
99  ret float %scaled.if.denormal
100}
101
102; Real case, vector splat
103define <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_splat(<2 x float> %x) {
104; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_splat(
105; CHECK-NEXT:    ret <2 x float> [[X:%.*]]
106;
107  %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer
108  %scaled.x = fmul <2 x float> %x, <float 32.0, float 32.0>
109  %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x
110  ret <2 x float> %scaled.if.denormal
111}
112
113define <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_nonsplat(<2 x float> %x) {
114; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_nonsplat(
115; CHECK-NEXT:    ret <2 x float> [[X:%.*]]
116;
117  %x.is.zero = fcmp oeq <2 x float> %x, zeroinitializer
118  %scaled.x = fmul <2 x float> %x, <float 32.0, float 64.0>
119  %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x
120  ret <2 x float> %scaled.if.denormal
121}
122
123define <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_eq_mixed_zero_vector(<2 x float> %x) {
124; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_eq_mixed_zero_vector(
125; CHECK-NEXT:    ret <2 x float> [[X:%.*]]
126;
127  %x.is.zero = fcmp oeq <2 x float> %x, <float 0.0, float -0.0>
128  %scaled.x = fmul <2 x float> %x, <float 32.0, float 32.0>
129  %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x
130  ret <2 x float> %scaled.if.denormal
131}
132
133define <2 x float> @fmul_by_32_if_0_oeq_zero_v2f32_eq_zero_vector_undef(<2 x float> %x) {
134; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_v2f32_eq_zero_vector_undef(
135; CHECK-NEXT:    ret <2 x float> [[X:%.*]]
136;
137  %x.is.zero = fcmp oeq <2 x float> %x, <float 0.0, float poison>
138  %scaled.x = fmul <2 x float> %x, <float 32.0, float 32.0>
139  %scaled.if.denormal = select <2 x i1> %x.is.zero, <2 x float> %scaled.x, <2 x float> %x
140  ret <2 x float> %scaled.if.denormal
141}
142
143define float @select_wrong_value(float %x, float %y) {
144; CHECK-LABEL: @select_wrong_value(
145; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
146; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul float [[X]], 3.200000e+01
147; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[Y:%.*]]
148; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
149;
150  %x.is.zero = fcmp oeq float %x, 0.0
151  %scaled.x = fmul float %x, 32.0
152  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %y
153  ret float %scaled.if.denormal
154}
155
156define float @fmul_wrong_value(float %x, float %y) {
157; CHECK-LABEL: @fmul_wrong_value(
158; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
159; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul float [[Y:%.*]], 3.200000e+01
160; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]
161; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
162;
163  %x.is.zero = fcmp oeq float %x, 0.0
164  %scaled.x = fmul float %y, 32.0
165  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
166  ret float %scaled.if.denormal
167}
168
169; wrong compared constant
170define float @fmul_by_32_if_1_oeq_zero_f32(float %x) {
171; CHECK-LABEL: @fmul_by_32_if_1_oeq_zero_f32(
172; CHECK-NEXT:    [[X_IS_ONE:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
173; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ONE]], float 3.200000e+01, float [[X]]
174; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
175;
176  %x.is.one = fcmp oeq float %x, 1.0
177  %scaled.x = fmul float %x, 32.0
178  %scaled.if.denormal = select i1 %x.is.one, float %scaled.x, float %x
179  ret float %scaled.if.denormal
180}
181
182define float @fmul_by_32_if_var_oeq_zero_f32(float %x, float %y) {
183; CHECK-LABEL: @fmul_by_32_if_var_oeq_zero_f32(
184; CHECK-NEXT:    [[X_IS_ONE:%.*]] = fcmp oeq float [[X:%.*]], [[Y:%.*]]
185; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul float [[X]], 3.200000e+01
186; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ONE]], float [[SCALED_X]], float [[X]]
187; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
188;
189  %x.is.one = fcmp oeq float %x, %y
190  %scaled.x = fmul float %x, 32.0
191  %scaled.if.denormal = select i1 %x.is.one, float %scaled.x, float %x
192  ret float %scaled.if.denormal
193}
194
195define float @fmul_by_32_if_0_ueq_zero_f32(float %x) {
196; CHECK-LABEL: @fmul_by_32_if_0_ueq_zero_f32(
197; CHECK-NEXT:    ret float [[X:%.*]]
198;
199  %x.is.zero = fcmp ueq float %x, 0.0
200  %scaled.x = fmul float %x, 32.0
201  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
202  ret float %scaled.if.denormal
203}
204
205define float @fmul_by_32_if_0_oeq_negzero_f32(float %x) {
206; CHECK-LABEL: @fmul_by_32_if_0_oeq_negzero_f32(
207; CHECK-NEXT:    ret float [[X:%.*]]
208;
209  %x.is.zero = fcmp oeq float %x, -0.0
210  %scaled.x = fmul float %x, 32.0
211  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
212  ret float %scaled.if.denormal
213}
214
215define float @fmul_by_32_if_0_oeq_zero_f32_multiple_use_cmp(float %x, ptr %ptr) {
216; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_f32_multiple_use_cmp(
217; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
218; CHECK-NEXT:    store i1 [[X_IS_ZERO]], ptr [[PTR:%.*]], align 1
219; CHECK-NEXT:    ret float [[X]]
220;
221  %x.is.zero = fcmp oeq float %x, 0.0
222  %scaled.x = fmul float %x, 32.0
223  store i1 %x.is.zero, ptr %ptr
224  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
225  ret float %scaled.if.denormal
226}
227
228define float @fmul_by_32_if_0_oeq_zero_f32_multiple_use_fmul(float %x, ptr %ptr) {
229; CHECK-LABEL: @fmul_by_32_if_0_oeq_zero_f32_multiple_use_fmul(
230; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul float [[X:%.*]], 3.200000e+01
231; CHECK-NEXT:    store float [[SCALED_X]], ptr [[PTR:%.*]], align 4
232; CHECK-NEXT:    ret float [[X]]
233;
234  %x.is.zero = fcmp oeq float %x, 0.0
235  %scaled.x = fmul float %x, 32.0
236  store float %scaled.x, ptr %ptr
237  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
238  ret float %scaled.if.denormal
239}
240
241define float @fmul_by_0_if_0_oeq_zero_f32(float %x) {
242; CHECK-LABEL: @fmul_by_0_if_0_oeq_zero_f32(
243; CHECK-NEXT:    ret float [[X:%.*]]
244;
245  %x.is.zero = fcmp oeq float %x, 0.0
246  %scaled.x = fmul float %x, 0.0
247  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
248  ret float %scaled.if.denormal
249}
250
251; Inverse of the real case
252define float @x_if_one_zero_else_mul_by_32(float %x) {
253; CHECK-LABEL: @x_if_one_zero_else_mul_by_32(
254; CHECK-NEXT:    ret float [[X:%.*]]
255;
256  %x.is.not.zero = fcmp one float %x, 0.0
257  %scaled.x = fmul float %x, 32.0
258  %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x
259  ret float %scaled.if.denormal
260}
261
262define float @x_if_one_negzero_else_mul_by_32(float %x) {
263; CHECK-LABEL: @x_if_one_negzero_else_mul_by_32(
264; CHECK-NEXT:    ret float [[X:%.*]]
265;
266  %x.is.not.zero = fcmp one float %x, -0.0
267  %scaled.x = fmul float %x, 32.0
268  %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x
269  ret float %scaled.if.denormal
270}
271
272define float @x_if_une_zero_else_mul_by_32(float %x) {
273; CHECK-LABEL: @x_if_une_zero_else_mul_by_32(
274; CHECK-NEXT:    ret float [[X:%.*]]
275;
276  %x.is.not.zero = fcmp une float %x, 0.0
277  %scaled.x = fmul float %x, 32.0
278  %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x
279  ret float %scaled.if.denormal
280}
281
282define float @x_if_une_negzero_else_mul_by_32(float %x) {
283; CHECK-LABEL: @x_if_une_negzero_else_mul_by_32(
284; CHECK-NEXT:    ret float [[X:%.*]]
285;
286  %x.is.not.zero = fcmp une float %x, -0.0
287  %scaled.x = fmul float %x, 32.0
288  %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x
289  ret float %scaled.if.denormal
290}
291
292define float @fmul_by_neg32_if_0_oeq_zero_f32(float %x) {
293; CHECK-LABEL: @fmul_by_neg32_if_0_oeq_zero_f32(
294; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
295; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul float [[X]], -3.200000e+01
296; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]
297; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
298;
299  %x.is.zero = fcmp oeq float %x, 0.0
300  %scaled.x = fmul float %x, -32.0
301  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
302  ret float %scaled.if.denormal
303}
304
305define float @fmul_by_neg32_if_0_one_zero_f32(float %x) {
306; CHECK-LABEL: @fmul_by_neg32_if_0_one_zero_f32(
307; CHECK-NEXT:    [[X_IS_NOT_ZERO:%.*]] = fcmp one float [[X:%.*]], 0.000000e+00
308; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul float [[X]], -3.200000e+01
309; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_NOT_ZERO]], float [[X]], float [[SCALED_X]]
310; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
311;
312  %x.is.not.zero = fcmp one float %x, 0.0
313  %scaled.x = fmul float %x, -32.0
314  %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x
315  ret float %scaled.if.denormal
316}
317
318define float @fmul_by_neg32_if_0_oeq_zero_f32_select_nsz(float %x) {
319; CHECK-LABEL: @fmul_by_neg32_if_0_oeq_zero_f32_select_nsz(
320; CHECK-NEXT:    ret float [[X:%.*]]
321;
322  %x.is.zero = fcmp oeq float %x, 0.0
323  %scaled.x = fmul float %x, -32.0
324  %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x
325  ret float %scaled.if.denormal
326}
327
328define float @fmul_by_neg32_if_0_one_zero_f32_select_nsz(float %x) {
329; CHECK-LABEL: @fmul_by_neg32_if_0_one_zero_f32_select_nsz(
330; CHECK-NEXT:    ret float [[X:%.*]]
331;
332  %x.is.not.zero = fcmp one float %x, 0.0
333  %scaled.x = fmul float %x, -32.0
334  %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x
335  ret float %scaled.if.denormal
336}
337
338define float @fmul_by_neg32_if_0_oeq_zero_f32_fmul_nsz(float %x) {
339; CHECK-LABEL: @fmul_by_neg32_if_0_oeq_zero_f32_fmul_nsz(
340; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
341; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul nsz float [[X]], -3.200000e+01
342; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]
343; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
344;
345  %x.is.zero = fcmp oeq float %x, 0.0
346  %scaled.x = fmul nsz float %x, -32.0
347  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
348  ret float %scaled.if.denormal
349}
350
351define float @fmul_by_neg32_if_0_one_zero_f32_mul_nsz(float %x) {
352; CHECK-LABEL: @fmul_by_neg32_if_0_one_zero_f32_mul_nsz(
353; CHECK-NEXT:    [[X_IS_NOT_ZERO:%.*]] = fcmp one float [[X:%.*]], 0.000000e+00
354; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul nsz float [[X]], -3.200000e+01
355; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_NOT_ZERO]], float [[X]], float [[SCALED_X]]
356; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
357;
358  %x.is.not.zero = fcmp one float %x, 0.0
359  %scaled.x = fmul nsz float %x, -32.0
360  %scaled.if.denormal = select i1 %x.is.not.zero, float %x, float %scaled.x
361  ret float %scaled.if.denormal
362}
363
364define float @fmul_by_neg0_if_0_oeq_zero_f32(float %x) {
365; CHECK-LABEL: @fmul_by_neg0_if_0_oeq_zero_f32(
366; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
367; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul float [[X]], -0.000000e+00
368; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]
369; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
370;
371  %x.is.zero = fcmp oeq float %x, 0.0
372  %scaled.x = fmul float %x, -0.0
373  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
374  ret float %scaled.if.denormal
375}
376
377define float @fmul_by_neginf_if_0_oeq_zero_f32(float %x) {
378; CHECK-LABEL: @fmul_by_neginf_if_0_oeq_zero_f32(
379; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
380; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul float [[X]], 0xFFF0000000000000
381; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]
382; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
383;
384  %x.is.zero = fcmp oeq float %x, 0.0
385  %scaled.x = fmul float %x, 0xFFF0000000000000
386  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
387  ret float %scaled.if.denormal
388}
389
390define float @fmul_by_posinf_if_0_oeq_zero_f32(float %x) {
391; CHECK-LABEL: @fmul_by_posinf_if_0_oeq_zero_f32(
392; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
393; CHECK-NEXT:    [[SCALED_X:%.*]] = fmul float [[X]], 0x7FF0000000000000
394; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float [[SCALED_X]], float [[X]]
395; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
396;
397  %x.is.zero = fcmp oeq float %x, 0.0
398  %scaled.x = fmul float %x, 0x7FF0000000000000
399  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
400  ret float %scaled.if.denormal
401}
402
403define float @fmul_by_qnan_if_0_oeq_zero_f32(float %x) {
404; CHECK-LABEL: @fmul_by_qnan_if_0_oeq_zero_f32(
405; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
406; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float 0x7FF8000000000000, float [[X]]
407; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
408;
409  %x.is.zero = fcmp oeq float %x, 0.0
410  %scaled.x = fmul float %x, 0x7FF8000000000000
411  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
412  ret float %scaled.if.denormal
413}
414
415define float @fmul_by_snan_if_0_oeq_zero_f32(float %x) {
416; CHECK-LABEL: @fmul_by_snan_if_0_oeq_zero_f32(
417; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
418; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = select i1 [[X_IS_ZERO]], float 0x7FF8800000000000, float [[X]]
419; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
420;
421  %x.is.zero = fcmp oeq float %x, 0.0
422  %scaled.x = fmul float %x, 0x7FF0800000000000
423  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
424  ret float %scaled.if.denormal
425}
426
427define float @fmul_by_var_if_0_oeq_zero_f32(float %x, float %y) {
428; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32(
429; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
430; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
431; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
432; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
433;
434  %x.is.zero = fcmp oeq float %x, 0.0
435  %scaled.x = fmul float %x, %y
436  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
437  ret float %scaled.if.denormal
438}
439
440define float @fmul_by_fabs_var_if_0_oeq_zero_f32(float %x, float %y) {
441; CHECK-LABEL: @fmul_by_fabs_var_if_0_oeq_zero_f32(
442; CHECK-NEXT:    [[Y_FABS:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]])
443; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
444; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y_FABS]], float 1.000000e+00
445; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
446; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
447;
448  %y.fabs = call float @llvm.fabs.f32(float %y)
449  %x.is.zero = fcmp oeq float %x, 0.0
450  %scaled.x = fmul float %x, %y.fabs
451  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
452  ret float %scaled.if.denormal
453}
454
455define float @fmul_by_fabs_nnan_ninf_var_if_0_oeq_zero_f32(float %x, float %y) {
456; CHECK-LABEL: @fmul_by_fabs_nnan_ninf_var_if_0_oeq_zero_f32(
457; CHECK-NEXT:    ret float [[X:%.*]]
458;
459  %y.fabs = call nnan ninf float @llvm.fabs.f32(float %y)
460  %x.is.zero = fcmp oeq float %x, 0.0
461  %scaled.x = fmul float %x, %y.fabs
462  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
463  ret float %scaled.if.denormal
464}
465
466; nsz is not sufficient
467define float @fmul_by_var_if_0_oeq_zero_f32_nsz_fmul(float %x, float %y) {
468; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_fmul(
469; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
470; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
471; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
472; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
473;
474  %x.is.zero = fcmp oeq float %x, 0.0
475  %scaled.x = fmul nsz float %x, %y
476  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
477  ret float %scaled.if.denormal
478}
479
480; nsz ninf is not sufficient
481define float @fmul_by_var_if_0_oeq_zero_f32_nsz_ninf_fmul(float %x, float %y) {
482; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_ninf_fmul(
483; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
484; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
485; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
486; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
487;
488  %x.is.zero = fcmp oeq float %x, 0.0
489  %scaled.x = fmul nsz ninf float %x, %y
490  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
491  ret float %scaled.if.denormal
492}
493
494; nsz nnan is not sufficient
495define float @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_fmul(float %x, float %y) {
496; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_fmul(
497; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
498; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
499; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
500; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
501;
502  %x.is.zero = fcmp oeq float %x, 0.0
503  %scaled.x = fmul nsz nnan float %x, %y
504  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
505  ret float %scaled.if.denormal
506}
507
508; nnan ninf is not sufficient
509define float @fmul_by_var_if_0_oeq_zero_f32_nnan_ninf_fmul(float %x, float %y) {
510; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nnan_ninf_fmul(
511; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
512; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
513; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
514; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
515;
516  %x.is.zero = fcmp oeq float %x, 0.0
517  %scaled.x = fmul nnan ninf float %x, %y
518  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
519  ret float %scaled.if.denormal
520}
521
522; nsz nnan ninf is sufficient, but not useful on the select
523define float @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_ninf_select(float %x, float %y) {
524; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_nsz_nnan_ninf_select(
525; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
526; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan ninf nsz i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
527; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
528; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
529;
530  %x.is.zero = fcmp oeq float %x, 0.0
531  %scaled.x = fmul float %x, %y
532  %scaled.if.denormal = select nsz nnan ninf i1 %x.is.zero, float %scaled.x, float %x
533  ret float %scaled.if.denormal
534}
535
536; nsz can come from only the select
537define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz(float %x, float %y) {
538; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz(
539; CHECK-NEXT:    ret float [[X:%.*]]
540;
541  %x.is.zero = fcmp oeq float %x, 0.0
542  %scaled.x = fmul nnan ninf float %x, %y
543  %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x
544  ret float %scaled.if.denormal
545}
546
547; nsz can come from only the select
548define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz_inverted(float %x, float %y) {
549; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_nsz_inverted(
550; CHECK-NEXT:    ret float [[X:%.*]]
551;
552  %x.is.not.zero = fcmp one float %x, 0.0
553  %scaled.x = fmul nnan ninf float %x, %y
554  %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x
555  ret float %scaled.if.denormal
556}
557
558define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x, float %y) {
559; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(
560; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
561; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
562; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
563; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
564;
565  %x.is.zero = fcmp oeq float %x, 0.0
566  %scaled.x = fmul nnan ninf nsz float %x, %y
567  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
568  ret float %scaled.if.denormal
569}
570
571define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted(float %x, float %y) {
572; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz_commuted(
573; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
574; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
575; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
576; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
577;
578  %x.is.zero = fcmp oeq float %x, 0.0
579  %scaled.x = fmul nnan ninf nsz float %y, %x
580  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
581  ret float %scaled.if.denormal
582}
583
584; test computeKnownFPClass is checked
585define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero(float %x, float nofpclass(nzero) %y) {
586; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero(
587; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
588; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
589; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
590; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
591;
592  %x.is.zero = fcmp oeq float %x, 0.0
593  %scaled.x = fmul nnan ninf float %x, %y
594  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
595  ret float %scaled.if.denormal
596}
597
598define float @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero_negsub(float %x, float nofpclass(nzero nsub) %y) {
599; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_nnan_ninf_select_known_never_negzero_negsub(
600; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
601; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
602; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
603; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
604;
605  %x.is.zero = fcmp oeq float %x, 0.0
606  %scaled.x = fmul nnan ninf float %x, %y
607  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
608  ret float %scaled.if.denormal
609}
610
611define float @fmul_by_var_if_0_oeq_zero_f32_known_never_nan_inf_select_nsz(float %x, float nofpclass(nan inf) %y) {
612; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_known_never_nan_inf_select_nsz(
613; CHECK-NEXT:    ret float [[X:%.*]]
614;
615  %x.is.zero = fcmp oeq float %x, 0.0
616  %scaled.x = fmul float %x, %y
617  %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x
618  ret float %scaled.if.denormal
619}
620
621; Infer everything from incoming multiplied value
622define float @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero(float %x, float nofpclass(nan inf nzero) %y) {
623; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero(
624; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
625; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
626; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
627; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
628;
629  %x.is.zero = fcmp oeq float %x, 0.0
630  %scaled.x = fmul float %x, %y
631  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
632  ret float %scaled.if.denormal
633}
634
635define float @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero_nsub(float %x, float nofpclass(nan inf nzero nsub) %y) {
636; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_negzero_nsub(
637; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
638; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[Y:%.*]], float 1.000000e+00
639; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
640; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
641;
642  %x.is.zero = fcmp oeq float %x, 0.0
643  %scaled.x = fmul float %x, %y
644  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
645  ret float %scaled.if.denormal
646}
647
648define float @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_neg(float %x, float nofpclass(nan inf nzero nsub nnorm) %y) {
649; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_neg(
650; CHECK-NEXT:    ret float [[X:%.*]]
651;
652  %x.is.zero = fcmp oeq float %x, 0.0
653  %scaled.x = fmul float %x, %y
654  %scaled.if.denormal = select i1 %x.is.zero, float %scaled.x, float %x
655  ret float %scaled.if.denormal
656}
657
658; Test assume of y works
659define float @fmul_by_var_if_0_oeq_zero_f32_assume_finite_fmul_nsz(float %x, float %y) {
660; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_assume_finite_fmul_nsz(
661; CHECK-NEXT:    [[FABS_Y:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]])
662; CHECK-NEXT:    [[IS_FINITE:%.*]] = fcmp one float [[FABS_Y]], 0x7FF0000000000000
663; CHECK-NEXT:    call void @llvm.assume(i1 [[IS_FINITE]])
664; CHECK-NEXT:    ret float [[X:%.*]]
665;
666  %fabs.y = call float @llvm.fabs.f32(float %y)
667  %is.finite = fcmp olt float %fabs.y, 0x7FF0000000000000
668  call void @llvm.assume(i1 %is.finite)
669  %x.is.zero = fcmp oeq float %x, 0.0
670  %scaled.x = fmul float %x, %y
671  %scaled.if.denormal = select nsz i1 %x.is.zero, float %scaled.x, float %x
672  ret float %scaled.if.denormal
673}
674
675; Test assume of y works in inverted case
676define float @fmul_by_var_if_not_one_0_zero_f32_assume_finite_fmul_nsz(float %x, float %y) {
677; CHECK-LABEL: @fmul_by_var_if_not_one_0_zero_f32_assume_finite_fmul_nsz(
678; CHECK-NEXT:    [[FABS_Y:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]])
679; CHECK-NEXT:    [[IS_FINITE:%.*]] = fcmp one float [[FABS_Y]], 0x7FF0000000000000
680; CHECK-NEXT:    call void @llvm.assume(i1 [[IS_FINITE]])
681; CHECK-NEXT:    ret float [[X:%.*]]
682;
683  %fabs.y = call float @llvm.fabs.f32(float %y)
684  %is.finite = fcmp olt float %fabs.y, 0x7FF0000000000000
685  call void @llvm.assume(i1 %is.finite)
686  %x.is.not.zero = fcmp one float %x, 0.0
687  %scaled.x = fmul float %x, %y
688  %scaled.if.denormal = select nsz i1 %x.is.not.zero, float %x, float %scaled.x
689  ret float %scaled.if.denormal
690}
691
692define float @fmul_by_self_if_0_oeq_zero_f32(float %x) {
693; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32(
694; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
695; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00
696; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
697; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
698;
699  %x.is.zero = fcmp oeq float %x, 0.0
700  %scaled.x = fmul float %x, %x
701  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
702  ret float %scaled.if.denormal
703}
704
705define float @fmul_by_self_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(float %x) {
706; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32_fmul_nnan_ninf_nsz(
707; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
708; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00
709; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul nnan float [[X]], [[SCALED_X]]
710; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
711;
712  %x.is.zero = fcmp oeq float %x, 0.0
713  %scaled.x = fmul nnan ninf nsz float %x, %x
714  %scaled.if.denormal = select nnan i1 %x.is.zero, float %scaled.x, float %x
715  ret float %scaled.if.denormal
716}
717
718define float @fmul_by_self_if_0_oeq_zero_f32_select_nnan_ninf_nsz(float %x) {
719; CHECK-LABEL: @fmul_by_self_if_0_oeq_zero_f32_select_nnan_ninf_nsz(
720; CHECK-NEXT:    [[X_IS_ZERO:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
721; CHECK-NEXT:    [[SCALED_X:%.*]] = select nnan ninf nsz i1 [[X_IS_ZERO]], float [[X]], float 1.000000e+00
722; CHECK-NEXT:    [[SCALED_IF_DENORMAL:%.*]] = fmul float [[X]], [[SCALED_X]]
723; CHECK-NEXT:    ret float [[SCALED_IF_DENORMAL]]
724;
725  %x.is.zero = fcmp oeq float %x, 0.0
726  %scaled.x = fmul float %x, %x
727  %scaled.if.denormal = select nnan ninf nsz i1 %x.is.zero, float %scaled.x, float %x
728  ret float %scaled.if.denormal
729}
730
731;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
732; DAPZ: {{.*}}
733; DAZ: {{.*}}
734; IEEE: {{.*}}
735