Skip to content

Commit 55e0a01

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 3d0b283 commit 55e0a01

File tree

2 files changed

+230
-0
lines changed

2 files changed

+230
-0
lines changed

llvm/test/Transforms/InstSimplify/fcmp-select.ll

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,28 @@ define double @oeq_zero_nsz(double %x) {
111111
ret double %cond
112112
}
113113

114+
define double @ueq_zero_nsz(double %x) {
115+
; CHECK-LABEL: @ueq_zero_nsz(
116+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq double [[X:%.*]], 0.000000e+00
117+
; CHECK-NEXT: [[COND:%.*]] = select nsz i1 [[CMP]], double [[X]], double 0.000000e+00
118+
; CHECK-NEXT: ret double [[COND]]
119+
;
120+
%cmp = fcmp ueq double %x, 0.0
121+
%cond = select nsz i1 %cmp, double %x, double 0.0
122+
ret double %cond
123+
}
124+
125+
define double @ueq_zero_nsz_nnan(double %x) {
126+
; CHECK-LABEL: @ueq_zero_nsz_nnan(
127+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ueq double [[X:%.*]], 0.000000e+00
128+
; CHECK-NEXT: [[COND:%.*]] = select nsz i1 [[CMP]], double [[X]], double 0.000000e+00
129+
; CHECK-NEXT: ret double [[COND]]
130+
;
131+
%cmp = fcmp nnan ueq double %x, 0.0
132+
%cond = select nsz i1 %cmp, double %x, double 0.0
133+
ret double %cond
134+
}
135+
114136
; X == 0.0 ? 0.0 : X --> X
115137

116138
define float @oeq_zero_swapped_nsz(float %x) {
@@ -133,6 +155,28 @@ define double @une_zero_nsz(double %x) {
133155
ret double %cond
134156
}
135157

158+
define double @one_zero_nsz(double %x) {
159+
; CHECK-LABEL: @one_zero_nsz(
160+
; CHECK-NEXT: [[CMP:%.*]] = fcmp one double [[X:%.*]], 0.000000e+00
161+
; CHECK-NEXT: [[COND:%.*]] = select nsz i1 [[CMP]], double [[X]], double 0.000000e+00
162+
; CHECK-NEXT: ret double [[COND]]
163+
;
164+
%cmp = fcmp one double %x, 0.0
165+
%cond = select nsz i1 %cmp, double %x, double 0.0
166+
ret double %cond
167+
}
168+
169+
define double @one_zero_nsz_nnan(double %x) {
170+
; CHECK-LABEL: @one_zero_nsz_nnan(
171+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan one double [[X:%.*]], 0.000000e+00
172+
; CHECK-NEXT: [[COND:%.*]] = select nsz i1 [[CMP]], double [[X]], double 0.000000e+00
173+
; CHECK-NEXT: ret double [[COND]]
174+
;
175+
%cmp = fcmp nnan one double %x, 0.0
176+
%cond = select nsz i1 %cmp, double %x, double 0.0
177+
ret double %cond
178+
}
179+
136180
; X != 0.0 ? 0.0 : X --> 0.0
137181

138182
define <2 x double> @une_zero_swapped_nsz(<2 x double> %x) {
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
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, float %y) {
5+
; CHECK-LABEL: @select_fcmp_fsub_oeq(
6+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq float [[Y:%.*]], 2.000000e+00
7+
; CHECK-NEXT: [[FADD:%.*]] = fsub float [[Y]], 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 %y, 2.
12+
%fadd = fsub float %y, 2.
13+
%sel = select i1 %fcmp, float %fadd, float 0.
14+
ret float %sel
15+
}
16+
17+
define float @select_fcmp_fsub_oeq_zero(float %x, float %y) {
18+
; CHECK-LABEL: @select_fcmp_fsub_oeq_zero(
19+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq float [[Y:%.*]], 0.000000e+00
20+
; CHECK-NEXT: [[FADD:%.*]] = fsub float [[Y]], 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 %y, 0.
25+
%fadd = fsub float %y, 2.
26+
%sel = select i1 %fcmp, float %fadd, float 2.
27+
ret float %sel
28+
}
29+
30+
define float @select_fcmp_fsub_ueq(float %x, float %y) {
31+
; CHECK-LABEL: @select_fcmp_fsub_ueq(
32+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ueq float [[Y:%.*]], 2.000000e+00
33+
; CHECK-NEXT: [[FADD:%.*]] = fsub float [[Y]], 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 %y, 2.
38+
%fadd = fsub float %y, 2.
39+
%sel = select i1 %fcmp, float %fadd, float 0.
40+
ret float %sel
41+
}
42+
43+
define float @select_fcmp_fsub_ueq_nnan(float %x, float %y) {
44+
; CHECK-LABEL: @select_fcmp_fsub_ueq_nnan(
45+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp nnan ueq float [[Y:%.*]], 2.000000e+00
46+
; CHECK-NEXT: [[FADD:%.*]] = fsub float [[Y]], 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 %y, 2.
51+
%fadd = fsub float %y, 2.
52+
%sel = select i1 %fcmp, float %fadd, float 0.
53+
ret float %sel
54+
}
55+
56+
define float @select_fcmp_fsub_une(float %x, float %y) {
57+
; CHECK-LABEL: @select_fcmp_fsub_une(
58+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp une float [[Y:%.*]], 2.000000e+00
59+
; CHECK-NEXT: [[FADD:%.*]] = fsub float [[Y]], 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 %y, 2.
64+
%fadd = fsub float %y, 2.
65+
%sel = select i1 %fcmp, float 0., float %fadd
66+
ret float %sel
67+
}
68+
69+
define float @select_fcmp_fsub_une_zero(float %x, float %y) {
70+
; CHECK-LABEL: @select_fcmp_fsub_une_zero(
71+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp une float [[Y:%.*]], 0.000000e+00
72+
; CHECK-NEXT: [[FADD:%.*]] = fsub float [[Y]], 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 %y, 0.
77+
%fadd = fsub float %y, 2.
78+
%sel = select i1 %fcmp, float 2., float %fadd
79+
ret float %sel
80+
}
81+
82+
define float @select_fcmp_fsub_one(float %x, float %y) {
83+
; CHECK-LABEL: @select_fcmp_fsub_one(
84+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp one float [[Y:%.*]], 2.000000e+00
85+
; CHECK-NEXT: [[FADD:%.*]] = fsub float [[Y]], 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 %y, 2.
90+
%fadd = fsub float %y, 2.
91+
%sel = select i1 %fcmp, float 0., float %fadd
92+
ret float %sel
93+
}
94+
95+
define float @select_fcmp_fsub_one_nnan(float %x, float %y) {
96+
; CHECK-LABEL: @select_fcmp_fsub_one_nnan(
97+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp nnan one float [[Y:%.*]], 2.000000e+00
98+
; CHECK-NEXT: [[FADD:%.*]] = fsub float [[Y]], 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 %y, 2.
103+
%fadd = fsub float %y, 2.
104+
%sel = select i1 %fcmp, float 0., float %fadd
105+
ret float %sel
106+
}
107+
108+
define float @select_fcmp_fadd(float %x, float %y) {
109+
; CHECK-LABEL: @select_fcmp_fadd(
110+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq float [[Y:%.*]], 2.000000e+00
111+
; CHECK-NEXT: [[FADD:%.*]] = fadd float [[Y]], 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 %y, 2.
116+
%fadd = fadd float %y, 2.
117+
%sel = select i1 %fcmp, float %fadd, float 4.
118+
ret float %sel
119+
}
120+
121+
define <2 x float> @select_fcmp_fadd_vec(<2 x float> %x, <2 x float> %y) {
122+
; CHECK-LABEL: @select_fcmp_fadd_vec(
123+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq <2 x float> [[Y:%.*]], <float 2.000000e+00, float 2.000000e+00>
124+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x float> [[Y]], <float 2.000000e+00, float 2.000000e+00>
125+
; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[FCMP]], <2 x float> [[FADD]], <2 x float> <float 4.000000e+00, float 4.000000e+00>
126+
; CHECK-NEXT: ret <2 x float> [[SEL]]
127+
;
128+
%fcmp = fcmp oeq <2 x float> %y, <float 2., float 2.>
129+
%fadd = fadd <2 x float> %y, <float 2., float 2.>
130+
%sel = select <2 x i1> %fcmp, <2 x float> %fadd, <2 x float> <float 4., float 4.>
131+
ret <2 x float> %sel
132+
}
133+
134+
135+
define float @select_fcmp_fdiv(float %x, float %y) {
136+
; CHECK-LABEL: @select_fcmp_fdiv(
137+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq float [[Y:%.*]], 2.000000e+00
138+
; CHECK-NEXT: [[FDIV:%.*]] = fdiv float [[Y]], 2.000000e+00
139+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[FCMP]], float [[FDIV]], float 1.000000e+00
140+
; CHECK-NEXT: ret float [[SEL]]
141+
;
142+
%fcmp = fcmp oeq float %y, 2.
143+
%fdiv = fdiv float %y, 2.
144+
%sel = select i1 %fcmp, float %fdiv, float 1.
145+
ret float %sel
146+
}
147+
148+
define float @select_fcmp_frem(float %x, float %y) {
149+
; CHECK-LABEL: @select_fcmp_frem(
150+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq float [[Y:%.*]], 3.000000e+00
151+
; CHECK-NEXT: [[FREM:%.*]] = frem float [[Y]], 2.000000e+00
152+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[FCMP]], float [[FREM]], float 1.000000e+00
153+
; CHECK-NEXT: ret float [[SEL]]
154+
;
155+
%fcmp = fcmp oeq float %y, 3.
156+
%frem = frem float %y, 2.
157+
%sel = select i1 %fcmp, float %frem, float 1.
158+
ret float %sel
159+
}
160+
161+
define <2 x float> @select_fcmp_insertelement(<2 x float> %x, <2 x float> %y) {
162+
; CHECK-LABEL: @select_fcmp_insertelement(
163+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq <2 x float> [[Y:%.*]], <float 2.000000e+00, float 2.000000e+00>
164+
; CHECK-NEXT: [[INSERT:%.*]] = insertelement <2 x float> [[Y]], float 4.000000e+00, i64 0
165+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x float> [[INSERT]], <2 x float> <float 4.000000e+00, float 2.000000e+00>
166+
; CHECK-NEXT: ret <2 x float> [[RETVAL]]
167+
;
168+
%fcmp = fcmp oeq <2 x float> %y, <float 2., float 2.>
169+
%insert = insertelement <2 x float> %y, float 4., i64 0
170+
%sel = select <2 x i1> %fcmp, <2 x float> %insert, <2 x float> <float 4., float 2.>
171+
ret <2 x float> %sel
172+
}
173+
174+
define <4 x float> @select_fcmp_shufflevector_select(<4 x float> %x, <4 x float> %y) {
175+
; CHECK-LABEL: @select_fcmp_shufflevector_select(
176+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq <4 x float> [[Y:%.*]], <float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00>
177+
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <4 x float> [[Y]], <4 x float> poison, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
178+
; 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>
179+
; CHECK-NEXT: ret <4 x float> [[SEL]]
180+
;
181+
%fcmp = fcmp oeq <4 x float> %y, <float 2., float 2., float 2., float 2.>
182+
%shuffle = shufflevector <4 x float> %y, <4 x float> poison, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
183+
%sel = select <4 x i1> %fcmp, <4 x float> %shuffle, <4 x float> <float poison, float 2., float poison, float 2.>
184+
ret <4 x float> %sel
185+
}
186+

0 commit comments

Comments
 (0)