[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / InstCombine / fold-select-fmul-if-zero.ll
blobff6d9aa4ea522ed6ddb53704802120b89b107279
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
6 ; Test for patterns that appear when denormal range checks are folded
7 ; to compares to 0, which drop canonicalizing
9 declare void @llvm.assume(i1 noundef)
10 declare float @llvm.fabs.f32(float)
11 declare float @llvm.ldexp.f32.i32(float, i32)
12 declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>)
15 define 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]]
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
28 define 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]]
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
39 ; Real case
40 define 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:%.*]]
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
50 define 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]]
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
63 define <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]]
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
76 define <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]]
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
89 define 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]]
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
102 ; Real case, vector splat
103 define <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:%.*]]
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
113 define <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:%.*]]
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
123 define <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:%.*]]
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
133 define <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:%.*]]
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
143 define 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]]
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
156 define 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]]
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
169 ; wrong compared constant
170 define 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]]
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
182 define 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]]
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
195 define 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:%.*]]
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
205 define 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:%.*]]
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
215 define 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]]
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
228 define 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]]
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
241 define 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:%.*]]
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
251 ; Inverse of the real case
252 define 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:%.*]]
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
262 define 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:%.*]]
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
272 define 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:%.*]]
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
282 define 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:%.*]]
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
292 define 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]]
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
305 define 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]]
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
318 define 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:%.*]]
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
328 define 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:%.*]]
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
338 define 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]]
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
351 define 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]]
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
364 define 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]]
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
377 define 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]]
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
390 define 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]]
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
403 define 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]]
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
415 define 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]]
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
427 define 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]]
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
440 define 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]]
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
455 define 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:%.*]]
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
466 ; nsz is not sufficient
467 define 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]]
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
480 ; nsz ninf is not sufficient
481 define 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]]
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
494 ; nsz nnan is not sufficient
495 define 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]]
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
508 ; nnan ninf is not sufficient
509 define 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]]
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
522 ; nsz nnan ninf is sufficient, but not useful on the select
523 define 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]]
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
536 ; nsz can come from only the select
537 define 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:%.*]]
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
547 ; nsz can come from only the select
548 define 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:%.*]]
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
558 define 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]]
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
571 define 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]]
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
584 ; test computeKnownFPClass is checked
585 define 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]]
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
598 define 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]]
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
611 define 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:%.*]]
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
621 ; Infer everything from incoming multiplied value
622 define 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]]
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
635 define 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]]
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
648 define 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:%.*]]
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
658 ; Test assume of y works
659 define 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:%.*]]
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
675 ; Test assume of y works in inverted case
676 define 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:%.*]]
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
692 define 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]]
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
705 define 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]]
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
718 define 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]]
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
731 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
732 ; DAPZ: {{.*}}
733 ; DAZ: {{.*}}
734 ; IEEE: {{.*}}