Skip to content

Commit 19032b5

Browse files
committed
InstCombine/test: cover foldSelectValueEquivalence
Write dedicated tests for foldSelectValueEquivalence, demonstrating that it does not perform many GVN-like replacements on vector-values, as a prelude to fixing this deficiency.
1 parent 7fa0d05 commit 19032b5

File tree

1 file changed

+183
-0
lines changed

1 file changed

+183
-0
lines changed
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
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) {
5+
; CHECK-LABEL: define <2 x i8> @select_icmp_insertelement_eq(
6+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
7+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
8+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> <i8 2, i8 0>, <2 x i8> [[X]]
9+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
10+
;
11+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
12+
%insert = insertelement <2 x i8> %y, i8 0, i8 1
13+
%retval = select <2 x i1> %cmp, <2 x i8> %insert, <2 x i8> %x
14+
ret <2 x i8> %retval
15+
}
16+
17+
define <2 x i8> @select_icmp_insertelement_ne(<2 x i8> %x, <2 x i8> %y) {
18+
; CHECK-LABEL: define <2 x i8> @select_icmp_insertelement_ne(
19+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
20+
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
21+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP_NOT]], <2 x i8> <i8 2, i8 0>, <2 x i8> [[X]]
22+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
23+
;
24+
%cmp = icmp ne <2 x i8> %y, <i8 2, i8 2>
25+
%insert = insertelement <2 x i8> %y, i8 0, i8 1
26+
%retval = select <2 x i1> %cmp, <2 x i8> %x, <2 x i8> %insert
27+
ret <2 x i8> %retval
28+
}
29+
30+
define <2 x i8> @select_icmp_shufflevector(<2 x i8> %x, <2 x i8> %y) {
31+
; CHECK-LABEL: define <2 x i8> @select_icmp_shufflevector(
32+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
33+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
34+
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x i8> [[Y]], <2 x i8> poison, <2 x i32> <i32 1, i32 0>
35+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[SHUFFLE]], <2 x i8> [[X]]
36+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
37+
;
38+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
39+
%shuffle = shufflevector <2 x i8> %y, <2 x i8> poison, <2 x i32> <i32 1, i32 0>
40+
%retval = select <2 x i1> %cmp, <2 x i8> %shuffle, <2 x i8> %x
41+
ret <2 x i8> %retval
42+
}
43+
44+
define <2 x i8> @select_icmp_udiv_vec(<2 x i8> %x, <2 x i8> %y) {
45+
; CHECK-LABEL: define <2 x i8> @select_icmp_udiv_vec(
46+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
47+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
48+
; CHECK-NEXT: [[UDIV:%.*]] = udiv <2 x i8> [[X]], [[Y]]
49+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[UDIV]], <2 x i8> [[X]]
50+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
51+
;
52+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
53+
%udiv = udiv <2 x i8> %x, %y
54+
%retval = select <2 x i1> %cmp, <2 x i8> %udiv, <2 x i8> %x
55+
ret <2 x i8> %retval
56+
}
57+
58+
define <2 x i8> @select_icmp_urem_vec(<2 x i8> %x, <2 x i8> %y) {
59+
; CHECK-LABEL: define <2 x i8> @select_icmp_urem_vec(
60+
; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {
61+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[Y]], <i8 2, i8 2>
62+
; CHECK-NEXT: [[UREM:%.*]] = urem <2 x i8> [[X]], [[Y]]
63+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[UREM]], <2 x i8> [[X]]
64+
; CHECK-NEXT: ret <2 x i8> [[RETVAL]]
65+
;
66+
%cmp = icmp eq <2 x i8> %y, <i8 2, i8 2>
67+
%urem = urem <2 x i8> %x, %y
68+
%retval = select <2 x i1> %cmp, <2 x i8> %urem, <2 x i8> %x
69+
ret <2 x i8> %retval
70+
}
71+
72+
define <2 x double> @select_fcmp_fdiv_oeq_not_zero_vec(<2 x double> %x, <2 x double> %y) {
73+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_oeq_not_zero_vec(
74+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
75+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
76+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
77+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[DIV]], <2 x double> [[X]]
78+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
79+
;
80+
%fcmp = fcmp oeq <2 x double> %y, <double 2.0, double 2.0>
81+
%div = fdiv <2 x double> %x, %y
82+
%retval = select <2 x i1> %fcmp, <2 x double> %div, <2 x double> %x
83+
ret <2 x double> %retval
84+
}
85+
86+
define <2 x double> @select_fcmp_fdiv_une_not_zero_vec(<2 x double> %x, <2 x double> %y) {
87+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_une_not_zero_vec(
88+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
89+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp une <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
90+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
91+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[DIV]]
92+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
93+
;
94+
%fcmp = fcmp une <2 x double> %y, <double 2.0, double 2.0>
95+
%div = fdiv <2 x double> %x, %y
96+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %div
97+
ret <2 x double> %retval
98+
}
99+
100+
define <2 x double> @select_fcmp_fdiv_ueq_nnan_not_zero_vec(<2 x double> %x, <2 x double> %y) {
101+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_ueq_nnan_not_zero_vec(
102+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
103+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp nnan ueq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
104+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
105+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[DIV]], <2 x double> [[X]]
106+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
107+
;
108+
%fcmp = fcmp nnan ueq <2 x double> %y, <double 2.0, double 2.0>
109+
%div = fdiv <2 x double> %x, %y
110+
%retval = select <2 x i1> %fcmp, <2 x double> %div, <2 x double> %x
111+
ret <2 x double> %retval
112+
}
113+
114+
define <2 x double> @select_fcmp_fdiv_one_nnan_not_zero_vec(<2 x double> %x, <2 x double> %y) {
115+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_one_nnan_not_zero_vec(
116+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
117+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp nnan one <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
118+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
119+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[DIV]]
120+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
121+
;
122+
%fcmp = fcmp nnan one <2 x double> %y, <double 2.0, double 2.0>
123+
%div = fdiv <2 x double> %x, %y
124+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %div
125+
ret <2 x double> %retval
126+
}
127+
128+
define <2 x double> @select_fcmp_fdiv_ueq_vec(<2 x double> %x, <2 x double> %y) {
129+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_ueq_vec(
130+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
131+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ueq <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
132+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
133+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[DIV]], <2 x double> [[X]]
134+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
135+
;
136+
%fcmp = fcmp ueq <2 x double> %y, <double 2.0, double 2.0>
137+
%div = fdiv <2 x double> %x, %y
138+
%retval = select <2 x i1> %fcmp, <2 x double> %div, <2 x double> %x
139+
ret <2 x double> %retval
140+
}
141+
142+
define <2 x double> @select_fcmp_fdiv_one_vec(<2 x double> %x, <2 x double> %y) {
143+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_one_vec(
144+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
145+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp one <2 x double> [[Y]], <double 2.000000e+00, double 2.000000e+00>
146+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
147+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[DIV]]
148+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
149+
;
150+
%fcmp = fcmp one <2 x double> %y, <double 2.0, double 2.0>
151+
%div = fdiv <2 x double> %x, %y
152+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %div
153+
ret <2 x double> %retval
154+
}
155+
156+
define <2 x double> @select_fcmp_fdiv_oeq_zero_vec(<2 x double> %x, <2 x double> %y) {
157+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_oeq_zero_vec(
158+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
159+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp oeq <2 x double> [[Y]], zeroinitializer
160+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
161+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[DIV]], <2 x double> [[X]]
162+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
163+
;
164+
%fcmp = fcmp oeq <2 x double> %y, zeroinitializer
165+
%div = fdiv <2 x double> %x, %y
166+
%retval = select <2 x i1> %fcmp, <2 x double> %div, <2 x double> %x
167+
ret <2 x double> %retval
168+
}
169+
170+
define <2 x double> @select_fcmp_fdiv_une_zero_vec(<2 x double> %x, <2 x double> %y) {
171+
; CHECK-LABEL: define <2 x double> @select_fcmp_fdiv_une_zero_vec(
172+
; CHECK-SAME: <2 x double> [[X:%.*]], <2 x double> [[Y:%.*]]) {
173+
; CHECK-NEXT: [[FCMP:%.*]] = fcmp une <2 x double> [[Y]], zeroinitializer
174+
; CHECK-NEXT: [[DIV:%.*]] = fdiv <2 x double> [[X]], [[Y]]
175+
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[FCMP]], <2 x double> [[X]], <2 x double> [[DIV]]
176+
; CHECK-NEXT: ret <2 x double> [[RETVAL]]
177+
;
178+
%fcmp = fcmp une <2 x double> %y, zeroinitializer
179+
%div = fdiv <2 x double> %x, %y
180+
%retval = select <2 x i1> %fcmp, <2 x double> %x, <2 x double> %div
181+
ret <2 x double> %retval
182+
}
183+

0 commit comments

Comments
 (0)