Skip to content

Commit 1b08bec

Browse files
committed
InstCombine/test: cover foldSelectValueEquivalence
Write dedicated tests for foldSelectValueEquivalence, demonstrating that it does not perform many GVN-like replacements when: - the comparison is a vector-type - the comparison is a floating-point type - the instruction is not speculable in general as a prelude to fixing these deficiencies.
1 parent 7fa0d05 commit 1b08bec

File tree

1 file changed

+267
-0
lines changed

1 file changed

+267
-0
lines changed
Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes=instcombine -S %s | FileCheck %s
3+
4+
define <2 x i8> @select_icmp_insertelement_eq(<2 x i8> %x, <2 x i8> %y, i8 %i) {
5+
; CHECK-LABEL: define <2 x i8> @select_icmp_insertelement_eq(
6+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]], i8 [[I:%.*]]) {
7+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
8+
; CHECK-NEXT: [[INSERT:%.*]] = insertelement <2 x i8> [[Y]], i8 0, i8 [[I]]
9+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[INSERT]], <2 x i8> [[X]]
10+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
11+
;
12+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
13+
%insert = insertelement <2 x i8> %y, i8 0, i8 %i
14+
%retval = select <2 x i1> %cmp, <2 x i8> %insert, <2 x i8> %x
15+
ret <2 x i8> %retval
16+
}
17+
18+
define <2 x i8> @select_icmp_insertelement_ne(<2 x i8> %x, <2 x i8> %y, i8 %i) {
19+
; CHECK-LABEL: define <2 x i8> @select_icmp_insertelement_ne(
20+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]], i8 [[I:%.*]]) {
21+
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
22+
; CHECK-NEXT: [[INSERT:%.*]] = insertelement <2 x i8> [[Y]], i8 0, i8 [[I]]
23+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP_NOT]], <2 x i8> [[INSERT]], <2 x i8> [[X]]
24+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
25+
;
26+
%cmp = icmp ne <2 x i8> %y, <i8 2, i8 2>
27+
%insert = insertelement <2 x i8> %y, i8 0, i8 %i
28+
%retval = select <2 x i1> %cmp, <2 x i8> %x, <2 x i8> %insert
29+
ret <2 x i8> %retval
30+
}
31+
32+
define <2 x i8> @select_icmp_shufflevector_identity(<2 x i8> %x, <2 x i8> %y) {
33+
; CHECK-LABEL: define <2 x i8> @select_icmp_shufflevector_identity(
34+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
35+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
36+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 2, i8 2>, <2 x i8> [[X]]
37+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
38+
;
39+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
40+
%shuffle = shufflevector <2 x i8> %y, <2 x i8> poison, <2 x i32> <i32 0, i32 1>
41+
%retval = select <2 x i1> %cmp, <2 x i8> %shuffle, <2 x i8> %x
42+
ret <2 x i8> %retval
43+
}
44+
45+
define <4 x i8> @select_icmp_shufflevector_select(<4 x i8> %x, <4 x i8> %y, <4 x i8> %z) {
46+
; CHECK-LABEL: define <4 x i8> @select_icmp_shufflevector_select(
47+
; CHECK-SAME: <4 x i8> [[X:%.*]], <4 x i8> [[Y:%.*]], <4 x i8> [[Z:%.*]]) {
48+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <4 x i8> [[Y]], <i8 2, i8 2, i8 2, i8 2>
49+
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <4 x i8> [[Z]], <4 x i8> [[Y]], <4 x i32> <i32 0, i32 5, i32 2, i32 7>
50+
; CHECK-NEXT: [[RETVAL:%.*]] = select <4 x i1> [[CMP]], <4 x i8> [[SHUFFLE]], <4 x i8> [[X]]
51+
; CHECK-NEXT: ret <4 x i8> [[RETVAL]]
52+
;
53+
%cmp = icmp eq <4 x i8> %y, <i8 2, i8 2, i8 2, i8 2>
54+
%shuffle = shufflevector <4 x i8> %y, <4 x i8> %z, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
55+
%retval = select <4 x i1> %cmp, <4 x i8> %shuffle, <4 x i8> %x
56+
ret <4 x i8> %retval
57+
}
58+
59+
define <2 x i8> @select_icmp_shufflevector_lanecrossing(<2 x i8> %x, <2 x i8> %y) {
60+
; CHECK-LABEL: define <2 x i8> @select_icmp_shufflevector_lanecrossing(
61+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
62+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
63+
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x i8> [[Y]], <2 x i8> poison, <2 x i32> <i32 1, i32 0>
64+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[SHUFFLE]], <2 x i8> [[X]]
65+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
66+
;
67+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
68+
%shuffle = shufflevector <2 x i8> %y, <2 x i8> poison, <2 x i32> <i32 1, i32 0>
69+
%retval = select <2 x i1> %cmp, <2 x i8> %shuffle, <2 x i8> %x
70+
ret <2 x i8> %retval
71+
}
72+
73+
define i8 @select_icmp_udiv(i8 %x, i8 %y) {
74+
; CHECK-LABEL: define i8 @select_icmp_udiv(
75+
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
76+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[Y]], 2
77+
; CHECK-NEXT: [[UDIV:%.*]] = udiv i8 [[X]], [[Y]]
78+
; CHECK-NEXT: [[RETVAL:%.*]] = select i1 [[CMP]], i8 [[UDIV]], i8 [[X]]
79+
; CHECK-NEXT: ret i8 [[RETVAL]]
80+
;
81+
%cmp = icmp eq i8 %y, 2
82+
%udiv = udiv i8 %x, %y
83+
%retval = select i1 %cmp, i8 %udiv, i8 %x
84+
ret i8 %retval
85+
}
86+
87+
define i8 @select_icmp_urem(i8 %x, i8 %y) {
88+
; CHECK-LABEL: define i8 @select_icmp_urem(
89+
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
90+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[Y]], 2
91+
; CHECK-NEXT: [[UREM:%.*]] = urem i8 [[X]], [[Y]]
92+
; CHECK-NEXT: [[RETVAL:%.*]] = select i1 [[CMP]], i8 [[UREM]], i8 [[X]]
93+
; CHECK-NEXT: ret i8 [[RETVAL]]
94+
;
95+
%cmp = icmp eq i8 %y, 2
96+
%urem = urem i8 %x, %y
97+
%retval = select i1 %cmp, i8 %urem, i8 %x
98+
ret i8 %retval
99+
}
100+
101+
define <2 x i8> @select_icmp_udiv_vec(<2 x i8> %x, <2 x i8> %y) {
102+
; CHECK-LABEL: define <2 x i8> @select_icmp_udiv_vec(
103+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
104+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
105+
; CHECK-NEXT: [[UDIV:%.*]] = udiv <2 x i8> [[X]], [[Y]]
106+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[UDIV]], <2 x i8> [[X]]
107+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
108+
;
109+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
110+
%udiv = udiv <2 x i8> %x, %y
111+
%retval = select <2 x i1> %cmp, <2 x i8> %udiv, <2 x i8> %x
112+
ret <2 x i8> %retval
113+
}
114+
115+
define <2 x i8> @select_icmp_urem_vec(<2 x i8> %x, <2 x i8> %y) {
116+
; CHECK-LABEL: define <2 x i8> @select_icmp_urem_vec(
117+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
118+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
119+
; CHECK-NEXT: [[UREM:%.*]] = urem <2 x i8> [[X]], [[Y]]
120+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[UREM]], <2 x i8> [[X]]
121+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
122+
;
123+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
124+
%urem = urem <2 x i8> %x, %y
125+
%retval = select <2 x i1> %cmp, <2 x i8> %urem, <2 x i8> %x
126+
ret <2 x i8> %retval
127+
}
128+
129+
define <2 x double> @select_fcmp_fadd_oeq_not_zero_vec(<2 x double> %x, <2 x double> %y) {
130+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_oeq_not_zero_vec(
131+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
132+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
133+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
134+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[FADD]], <2 x double> [[X]]
135+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
136+
;
137+
%fcmp = fcmp oeq <2 x double> %y, <double 2.0, double 2.0>
138+
%fadd = fadd <2 x double> %x, %y
139+
%retval = select <2 x i1> %fcmp, <2 x double> %fadd, <2 x double> %x
140+
ret <2 x double> %retval
141+
}
142+
143+
define <2 x double> @select_fcmp_fadd_une_not_zero_vec(<2 x double> %x, <2 x double> %y) {
144+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_une_not_zero_vec(
145+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
146+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp une <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
147+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
148+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[FADD]]
149+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
150+
;
151+
%fcmp = fcmp une <2 x double> %y, <double 2.0, double 2.0>
152+
%fadd = fadd <2 x double> %x, %y
153+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %fadd
154+
ret <2 x double> %retval
155+
}
156+
157+
define <2 x double> @select_fcmp_fadd_ueq_nnan_not_zero_vec(<2 x double> %x, <2 x double> %y) {
158+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_ueq_nnan_not_zero_vec(
159+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
160+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp nnan ueq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
161+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
162+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[FADD]], <2 x double> [[X]]
163+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
164+
;
165+
%fcmp = fcmp nnan ueq <2 x double> %y, <double 2.0, double 2.0>
166+
%fadd = fadd <2 x double> %x, %y
167+
%retval = select <2 x i1> %fcmp, <2 x double> %fadd, <2 x double> %x
168+
ret <2 x double> %retval
169+
}
170+
171+
define <2 x double> @select_fcmp_fadd_one_nnan_not_zero_vec(<2 x double> %x, <2 x double> %y) {
172+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_one_nnan_not_zero_vec(
173+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
174+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp nnan one <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
175+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
176+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[FADD]]
177+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
178+
;
179+
%fcmp = fcmp nnan one <2 x double> %y, <double 2.0, double 2.0>
180+
%fadd = fadd <2 x double> %x, %y
181+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %fadd
182+
ret <2 x double> %retval
183+
}
184+
185+
define <2 x double> @select_fcmp_fadd_ueq_vec(<2 x double> %x, <2 x double> %y) {
186+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_ueq_vec(
187+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
188+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ueq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
189+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
190+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[FADD]], <2 x double> [[X]]
191+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
192+
;
193+
%fcmp = fcmp ueq <2 x double> %y, <double 2.0, double 2.0>
194+
%fadd = fadd <2 x double> %x, %y
195+
%retval = select <2 x i1> %fcmp, <2 x double> %fadd, <2 x double> %x
196+
ret <2 x double> %retval
197+
}
198+
199+
define <2 x double> @select_fcmp_fadd_one_vec(<2 x double> %x, <2 x double> %y) {
200+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_one_vec(
201+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
202+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp one <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
203+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
204+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[FADD]]
205+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
206+
;
207+
%fcmp = fcmp one <2 x double> %y, <double 2.0, double 2.0>
208+
%fadd = fadd <2 x double> %x, %y
209+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %fadd
210+
ret <2 x double> %retval
211+
}
212+
213+
define <2 x double> @select_fcmp_fadd_oeq_zero_vec(<2 x double> %x, <2 x double> %y) {
214+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_oeq_zero_vec(
215+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
216+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq <2 x double> [[Y]], zeroinitializer
217+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
218+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[FADD]], <2 x double> [[X]]
219+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
220+
;
221+
%fcmp = fcmp oeq <2 x double> %y, zeroinitializer
222+
%fadd = fadd <2 x double> %x, %y
223+
%retval = select <2 x i1> %fcmp, <2 x double> %fadd, <2 x double> %x
224+
ret <2 x double> %retval
225+
}
226+
227+
define <2 x double> @select_fcmp_fadd_une_zero_vec(<2 x double> %x, <2 x double> %y) {
228+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_une_zero_vec(
229+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
230+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp une <2 x double> [[Y]], zeroinitializer
231+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
232+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[FADD]]
233+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
234+
;
235+
%fcmp = fcmp une <2 x double> %y, zeroinitializer
236+
%fadd = fadd <2 x double> %x, %y
237+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %fadd
238+
ret <2 x double> %retval
239+
}
240+
241+
define <2 x double> @select_fcmp_fdiv_oeq_not_zero_vec(<2 x double> %x, <2 x double> %y) {
242+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_oeq_not_zero_vec(
243+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
244+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
245+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
246+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[DIV]], <2 x double> [[X]]
247+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
248+
;
249+
%fcmp = fcmp oeq <2 x double> %y, <double 2.0, double 2.0>
250+
%div = fdiv <2 x double> %x, %y
251+
%retval = select <2 x i1> %fcmp, <2 x double> %div, <2 x double> %x
252+
ret <2 x double> %retval
253+
}
254+
255+
define <2 x double> @select_fcmp_fdiv_une_not_zero_vec(<2 x double> %x, <2 x double> %y) {
256+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_une_not_zero_vec(
257+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
258+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp une <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
259+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
260+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[DIV]]
261+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
262+
;
263+
%fcmp = fcmp une <2 x double> %y, <double 2.0, double 2.0>
264+
%div = fdiv <2 x double> %x, %y
265+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %div
266+
ret <2 x double> %retval
267+
}

0 commit comments

Comments
 (0)