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