xref: /llvm-project/llvm/test/Transforms/InstSimplify/select-equivalence-fp.ll (revision 7c135e17fbb7178466eafce9826c896518907637)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4define float @select_fcmp_fsub_oeq(float %x) {
5; CHECK-LABEL: @select_fcmp_fsub_oeq(
6; CHECK-NEXT:    ret float 0.000000e+00
7;
8  %fcmp = fcmp oeq float %x, 2.0
9  %fadd = fsub float %x, 2.0
10  %sel = select i1 %fcmp, float %fadd, float 0.0
11  ret float %sel
12}
13
14define float @select_fcmp_fsub_oeq_zero(float %x) {
15; CHECK-LABEL: @select_fcmp_fsub_oeq_zero(
16; CHECK-NEXT:    [[FCMP:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
17; CHECK-NEXT:    [[FADD:%.*]] = fsub float [[X]], 2.000000e+00
18; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[FCMP]], float [[FADD]], float 2.000000e+00
19; CHECK-NEXT:    ret float [[SEL]]
20;
21  %fcmp = fcmp oeq float %x, 0.0
22  %fadd = fsub float %x, 2.0
23  %sel = select i1 %fcmp, float %fadd, float 2.0
24  ret float %sel
25}
26
27define float @select_fcmp_fsub_ueq(float %x) {
28; CHECK-LABEL: @select_fcmp_fsub_ueq(
29; CHECK-NEXT:    [[FCMP:%.*]] = fcmp ueq float [[X:%.*]], 2.000000e+00
30; CHECK-NEXT:    [[FADD:%.*]] = fsub float [[X]], 2.000000e+00
31; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[FCMP]], float [[FADD]], float 0.000000e+00
32; CHECK-NEXT:    ret float [[SEL]]
33;
34  %fcmp = fcmp ueq float %x, 2.0
35  %fadd = fsub float %x, 2.0
36  %sel = select i1 %fcmp, float %fadd, float 0.0
37  ret float %sel
38}
39
40define float @select_fcmp_fsub_ueq_nnan(float %x) {
41; CHECK-LABEL: @select_fcmp_fsub_ueq_nnan(
42; CHECK-NEXT:    ret float 0.000000e+00
43;
44  %fcmp = fcmp nnan ueq float %x, 2.0
45  %fadd = fsub float %x, 2.0
46  %sel = select i1 %fcmp, float %fadd, float 0.0
47  ret float %sel
48}
49
50define float @select_fcmp_fsub_une(float %x) {
51; CHECK-LABEL: @select_fcmp_fsub_une(
52; CHECK-NEXT:    ret float 0.000000e+00
53;
54  %fcmp = fcmp une float %x, 2.0
55  %fadd = fsub float %x, 2.0
56  %sel = select i1 %fcmp, float 0.0, float %fadd
57  ret float %sel
58}
59
60define float @select_fcmp_fsub_une_zero(float %x) {
61; CHECK-LABEL: @select_fcmp_fsub_une_zero(
62; CHECK-NEXT:    [[FCMP:%.*]] = fcmp une float [[X:%.*]], 0.000000e+00
63; CHECK-NEXT:    [[FADD:%.*]] = fsub float [[X]], 2.000000e+00
64; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[FCMP]], float 2.000000e+00, float [[FADD]]
65; CHECK-NEXT:    ret float [[SEL]]
66;
67  %fcmp = fcmp une float %x, 0.0
68  %fadd = fsub float %x, 2.0
69  %sel = select i1 %fcmp, float 2.0, float %fadd
70  ret float %sel
71}
72
73define float @select_fcmp_fsub_one(float %x) {
74; CHECK-LABEL: @select_fcmp_fsub_one(
75; CHECK-NEXT:    [[FCMP:%.*]] = fcmp one float [[X:%.*]], 2.000000e+00
76; CHECK-NEXT:    [[FADD:%.*]] = fsub float [[X]], 2.000000e+00
77; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[FCMP]], float 0.000000e+00, float [[FADD]]
78; CHECK-NEXT:    ret float [[SEL]]
79;
80  %fcmp = fcmp one float %x, 2.0
81  %fadd = fsub float %x, 2.0
82  %sel = select i1 %fcmp, float 0.0, float %fadd
83  ret float %sel
84}
85
86define float @select_fcmp_fsub_one_nnan(float %x) {
87; CHECK-LABEL: @select_fcmp_fsub_one_nnan(
88; CHECK-NEXT:    ret float 0.000000e+00
89;
90  %fcmp = fcmp nnan one float %x, 2.0
91  %fadd = fsub float %x, 2.0
92  %sel = select i1 %fcmp, float 0.0, float %fadd
93  ret float %sel
94}
95
96define float @select_fcmp_fadd(float %x) {
97; CHECK-LABEL: @select_fcmp_fadd(
98; CHECK-NEXT:    ret float 4.000000e+00
99;
100  %fcmp = fcmp oeq float %x, 2.0
101  %fadd = fadd float %x, 2.0
102  %sel = select i1 %fcmp, float %fadd, float 4.0
103  ret float %sel
104}
105
106define <2 x float> @select_fcmp_fadd_vec(<2 x float> %x) {
107; CHECK-LABEL: @select_fcmp_fadd_vec(
108; CHECK-NEXT:    ret <2 x float> splat (float 4.000000e+00)
109;
110  %fcmp = fcmp oeq <2 x float> %x, <float 2.0, float 2.0>
111  %fadd = fadd <2 x float> %x, <float 2.0, float 2.0>
112  %sel = select <2 x i1> %fcmp, <2 x float> %fadd, <2 x float> <float 4.0, float 4.0>
113  ret <2 x float> %sel
114}
115
116
117; Should not fold, because the fmul by identity may produce a different NaN
118; value.
119define float @select_fcmp_fmul_nonrefinement(float %x, float %y) {
120; CHECK-LABEL: @select_fcmp_fmul_nonrefinement(
121; CHECK-NEXT:    [[FCMP:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
122; CHECK-NEXT:    [[FMUL:%.*]] = fmul float [[Y:%.*]], [[X]]
123; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[FCMP]], float [[Y]], float [[FMUL]]
124; CHECK-NEXT:    ret float [[SEL]]
125;
126  %fcmp = fcmp oeq float %x, 1.0
127  %fmul = fmul float %y, %x
128  %sel = select i1 %fcmp, float %y, float %fmul
129  ret float %sel
130}
131
132define float @select_fcmp_fmul(float %x) {
133; CHECK-LABEL: @select_fcmp_fmul(
134; CHECK-NEXT:    ret float 4.000000e+00
135;
136  %fcmp = fcmp oeq float %x, 2.0
137  %fmul = fmul float %x, 2.0
138  %sel = select i1 %fcmp, float %fmul, float 4.0
139  ret float %sel
140}
141
142define float @select_fcmp_fdiv_nonrefinement(float %x, float %y) {
143; CHECK-LABEL: @select_fcmp_fdiv_nonrefinement(
144; CHECK-NEXT:    [[FCMP:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
145; CHECK-NEXT:    [[FDIV:%.*]] = fdiv float [[Y:%.*]], [[X]]
146; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[FCMP]], float [[Y]], float [[FDIV]]
147; CHECK-NEXT:    ret float [[SEL]]
148;
149  %fcmp = fcmp oeq float %x, 1.0
150  %fdiv = fdiv float %y, %x
151  %sel = select i1 %fcmp, float %y, float %fdiv
152  ret float %sel
153}
154
155define float @select_fcmp_fdiv(float %x) {
156; CHECK-LABEL: @select_fcmp_fdiv(
157; CHECK-NEXT:    ret float 1.000000e+00
158;
159  %fcmp = fcmp oeq float %x, 2.0
160  %fdiv = fdiv float %x, 2.0
161  %sel = select i1 %fcmp, float %fdiv, float 1.0
162  ret float %sel
163}
164
165define float @select_fcmp_frem(float %x) {
166; CHECK-LABEL: @select_fcmp_frem(
167; CHECK-NEXT:    ret float 1.000000e+00
168;
169  %fcmp = fcmp oeq float %x, 3.0
170  %frem = frem float %x, 2.0
171  %sel = select i1 %fcmp, float %frem, float 1.0
172  ret float %sel
173}
174
175define <2 x float> @select_fcmp_insertelement(<2 x float> %x) {
176; CHECK-LABEL: @select_fcmp_insertelement(
177; CHECK-NEXT:    ret <2 x float> <float 4.000000e+00, float 2.000000e+00>
178;
179  %fcmp = fcmp oeq <2 x float> %x, <float 2.0, float 2.0>
180  %insert = insertelement <2 x float> %x, float 4.0, i64 0
181  %sel = select <2 x i1> %fcmp, <2 x float> %insert, <2 x float> <float 4.0, float 2.0>
182  ret <2 x float> %sel
183}
184
185define <4 x float> @select_fcmp_shufflevector_select(<4 x float> %x) {
186; CHECK-LABEL: @select_fcmp_shufflevector_select(
187; CHECK-NEXT:    ret <4 x float> <float poison, float 2.000000e+00, float poison, float 2.000000e+00>
188;
189  %fcmp = fcmp oeq <4 x float> %x, <float 2.0, float 2.0, float 2.0, float 2.0>
190  %shuffle = shufflevector <4 x float> %x, <4 x float> poison, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
191  %sel = select <4 x i1> %fcmp, <4 x float> %shuffle, <4 x float> <float poison, float 2.0, float poison, float 2.0>
192  ret <4 x float> %sel
193}
194
195; The hexfloat constant is PI / 2.
196define float @select_fcmp_sin_nonrefinement(float %x) {
197; CHECK-LABEL: @select_fcmp_sin_nonrefinement(
198; CHECK-NEXT:    [[FCMP:%.*]] = fcmp oeq float [[X:%.*]], 0x3FF921FB60000000
199; CHECK-NEXT:    [[SIN:%.*]] = call float @llvm.sin.f32(float [[X]])
200; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[FCMP]], float 1.000000e+00, float [[SIN]]
201; CHECK-NEXT:    ret float [[SEL]]
202;
203  %fcmp = fcmp oeq float %x, 0x3FF921FB60000000
204  %sin = call float @llvm.sin.f32(float %x)
205  %sel = select i1 %fcmp, float 1.0, float %sin
206  ret float %sel
207}
208
209; The hexfloat constant is PI / 2.
210define float @select_fcmp_sin(float %x) {
211; CHECK-LABEL: @select_fcmp_sin(
212; CHECK-NEXT:    ret float 1.000000e+00
213;
214  %fcmp = fcmp oeq float %x, 0x3FF921FB60000000
215  %sin = call float @llvm.sin.f32(float %x)
216  %sel = select i1 %fcmp, float %sin, float 1.0
217  ret float %sel
218}
219
220; The hexfloat constant is PI.
221define float @select_fcmp_cos_nonrefinement(float %x) {
222; CHECK-LABEL: @select_fcmp_cos_nonrefinement(
223; CHECK-NEXT:    [[FCMP:%.*]] = fcmp oeq float [[X:%.*]], 0x400921FB60000000
224; CHECK-NEXT:    [[COS:%.*]] = call float @llvm.cos.f32(float [[X]])
225; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[FCMP]], float -1.000000e+00, float [[COS]]
226; CHECK-NEXT:    ret float [[SEL]]
227;
228  %fcmp = fcmp oeq float %x, 0x400921FB60000000
229  %cos = call float @llvm.cos.f32(float %x)
230  %sel = select i1 %fcmp, float -1.0, float %cos
231  ret float %sel
232}
233
234; The hexfloat constant is PI.
235define float @select_fcmp_cos(float %x) {
236; CHECK-LABEL: @select_fcmp_cos(
237; CHECK-NEXT:    ret float -1.000000e+00
238;
239  %fcmp = fcmp oeq float %x, 0x400921FB60000000
240  %cos = call float @llvm.cos.f32(float %x)
241  %sel = select i1 %fcmp, float %cos, float -1.0
242  ret float %sel
243}
244
245define i32 @select_fcmp_lrint(float %x) {
246; CHECK-LABEL: @select_fcmp_lrint(
247; CHECK-NEXT:    [[FCMP:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
248; CHECK-NEXT:    [[LRINT:%.*]] = call i32 @llvm.lrint.i32.f32(float [[X]])
249; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[FCMP]], i32 [[LRINT]], i32 1
250; CHECK-NEXT:    ret i32 [[SEL]]
251;
252  %fcmp = fcmp oeq float %x, 1.0
253  %lrint = call i32 @llvm.lrint.i32.f32(float %x)
254  %sel = select i1 %fcmp, i32 %lrint, i32 1
255  ret i32 %sel
256}
257