Skip to content

Commit 0fde07a

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 as a prelude to fixing these deficiencies.
1 parent c04b640 commit 0fde07a

File tree

1 file changed

+199
-0
lines changed

1 file changed

+199
-0
lines changed
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
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+
declare <2 x i8> @fn(<2 x i8>)
74+
75+
define <2 x i8> @select_icmp_call_possibly_lanecrossing(<2 x i8> %x, <2 x i8> %y) {
76+
; CHECK-LABEL: define <2 x i8> @select_icmp_call_possibly_lanecrossing(
77+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
78+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
79+
; CHECK-NEXT: [[CALL:%.*]] = call <2 x i8> @fn(<2 x i8> [[Y]])
80+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[CALL]], <2 x i8> [[X]]
81+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
82+
;
83+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
84+
%call = call <2 x i8> @fn(<2 x i8> %y)
85+
%retval = select <2 x i1> %cmp, <2 x i8> %call, <2 x i8> %x
86+
ret <2 x i8> %retval
87+
}
88+
89+
define <2 x double> @select_fcmp_fadd_oeq_not_zero_vec(<2 x double> %x, <2 x double> %y) {
90+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_oeq_not_zero_vec(
91+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
92+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
93+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
94+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[FADD]], <2 x double> [[X]]
95+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
96+
;
97+
%fcmp = fcmp oeq <2 x double> %y, <double 2.0, double 2.0>
98+
%fadd = fadd <2 x double> %x, %y
99+
%retval = select <2 x i1> %fcmp, <2 x double> %fadd, <2 x double> %x
100+
ret <2 x double> %retval
101+
}
102+
103+
define <2 x double> @select_fcmp_fadd_une_not_zero_vec(<2 x double> %x, <2 x double> %y) {
104+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_une_not_zero_vec(
105+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
106+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp une <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
107+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
108+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[FADD]]
109+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
110+
;
111+
%fcmp = fcmp une <2 x double> %y, <double 2.0, double 2.0>
112+
%fadd = fadd <2 x double> %x, %y
113+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %fadd
114+
ret <2 x double> %retval
115+
}
116+
117+
define <2 x double> @select_fcmp_fadd_ueq_nnan_not_zero_vec(<2 x double> %x, <2 x double> %y) {
118+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_ueq_nnan_not_zero_vec(
119+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
120+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp nnan ueq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
121+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
122+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[FADD]], <2 x double> [[X]]
123+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
124+
;
125+
%fcmp = fcmp nnan ueq <2 x double> %y, <double 2.0, double 2.0>
126+
%fadd = fadd <2 x double> %x, %y
127+
%retval = select <2 x i1> %fcmp, <2 x double> %fadd, <2 x double> %x
128+
ret <2 x double> %retval
129+
}
130+
131+
define <2 x double> @select_fcmp_fadd_one_nnan_not_zero_vec(<2 x double> %x, <2 x double> %y) {
132+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_one_nnan_not_zero_vec(
133+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
134+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp nnan one <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
135+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
136+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[FADD]]
137+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
138+
;
139+
%fcmp = fcmp nnan one <2 x double> %y, <double 2.0, double 2.0>
140+
%fadd = fadd <2 x double> %x, %y
141+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %fadd
142+
ret <2 x double> %retval
143+
}
144+
145+
define <2 x double> @select_fcmp_fadd_ueq_vec(<2 x double> %x, <2 x double> %y) {
146+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_ueq_vec(
147+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
148+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ueq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
149+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
150+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[FADD]], <2 x double> [[X]]
151+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
152+
;
153+
%fcmp = fcmp ueq <2 x double> %y, <double 2.0, double 2.0>
154+
%fadd = fadd <2 x double> %x, %y
155+
%retval = select <2 x i1> %fcmp, <2 x double> %fadd, <2 x double> %x
156+
ret <2 x double> %retval
157+
}
158+
159+
define <2 x double> @select_fcmp_fadd_one_vec(<2 x double> %x, <2 x double> %y) {
160+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_one_vec(
161+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
162+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp one <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
163+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
164+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[FADD]]
165+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
166+
;
167+
%fcmp = fcmp one <2 x double> %y, <double 2.0, double 2.0>
168+
%fadd = fadd <2 x double> %x, %y
169+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %fadd
170+
ret <2 x double> %retval
171+
}
172+
173+
define <2 x double> @select_fcmp_fadd_oeq_zero_vec(<2 x double> %x, <2 x double> %y) {
174+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_oeq_zero_vec(
175+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
176+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq <2 x double> [[Y]], zeroinitializer
177+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
178+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[FADD]], <2 x double> [[X]]
179+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
180+
;
181+
%fcmp = fcmp oeq <2 x double> %y, zeroinitializer
182+
%fadd = fadd <2 x double> %x, %y
183+
%retval = select <2 x i1> %fcmp, <2 x double> %fadd, <2 x double> %x
184+
ret <2 x double> %retval
185+
}
186+
187+
define <2 x double> @select_fcmp_fadd_une_zero_vec(<2 x double> %x, <2 x double> %y) {
188+
; CHECK-LABEL: define <2 x double> @select_fcmp_fadd_une_zero_vec(
189+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
190+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp une <2 x double> [[Y]], zeroinitializer
191+
; CHECK-NEXT: [[FADD:%.*]] = fadd <2 x double> [[X]], [[Y]]
192+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[FADD]]
193+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
194+
;
195+
%fcmp = fcmp une <2 x double> %y, zeroinitializer
196+
%fadd = fadd <2 x double> %x, %y
197+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %fadd
198+
ret <2 x double> %retval
199+
}

0 commit comments

Comments
 (0)