Skip to content

Commit 455ef03

Browse files
committed
InstSimplify: cover select folding for fp
In prepraration to extend select folding to include floating-points using CmpInst::isEquivalence, cover it with tests first.
1 parent 844fe8f commit 455ef03

File tree

1 file changed

+293
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)