1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
4 ; Test all integer predicates with bool types and true/false constants,
5 ; with not on LHS (icmp pred not(X), true|false).
6 ; Use vectors to provide test coverage that is not duplicated in other folds.
8 define <2 x i1> @eq_t_not(<2 x i1> %a) {
9 ; CHECK-LABEL: @eq_t_not(
10 ; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)
11 ; CHECK-NEXT: ret <2 x i1> [[NOT]]
13 %not = xor <2 x i1> %a, <i1 true, i1 true>
14 %r = icmp eq <2 x i1> %not, <i1 true, i1 true>
18 define <2 x i1> @eq_f_not(<2 x i1> %a) {
19 ; CHECK-LABEL: @eq_f_not(
20 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
22 %not = xor <2 x i1> %a, <i1 true, i1 true>
23 %r = icmp eq <2 x i1> %not, <i1 false, i1 false>
27 define <2 x i1> @eq_f_not_swap(<2 x i1> %a) {
28 ; CHECK-LABEL: @eq_f_not_swap(
29 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
31 %not = xor <2 x i1> <i1 true, i1 true>, %a
32 %r = icmp eq <2 x i1> %not, <i1 false, i1 false>
36 define <2 x i1> @eq_f_not_poison(<2 x i1> %a) {
37 ; CHECK-LABEL: @eq_f_not_poison(
38 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
40 %not = xor <2 x i1> %a, <i1 poison, i1 true>
41 %r = icmp eq <2 x i1> %not, <i1 false, i1 false>
45 define <2 x i1> @ne_t_not(<2 x i1> %a) {
46 ; CHECK-LABEL: @ne_t_not(
47 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
49 %not = xor <2 x i1> %a, <i1 true, i1 true>
50 %r = icmp ne <2 x i1> %not, <i1 true, i1 true>
54 define <2 x i1> @ne_t_not_swap(<2 x i1> %a) {
55 ; CHECK-LABEL: @ne_t_not_swap(
56 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
58 %not = xor <2 x i1> <i1 true, i1 true>, %a
59 %r = icmp ne <2 x i1> %not, <i1 true, i1 true>
63 define <2 x i1> @ne_t_not_poison(<2 x i1> %a) {
64 ; CHECK-LABEL: @ne_t_not_poison(
65 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
67 %not = xor <2 x i1> %a, <i1 poison, i1 true>
68 %r = icmp ne <2 x i1> %not, <i1 true, i1 true>
72 define <2 x i1> @ne_f_not(<2 x i1> %a) {
73 ; CHECK-LABEL: @ne_f_not(
74 ; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)
75 ; CHECK-NEXT: ret <2 x i1> [[NOT]]
77 %not = xor <2 x i1> %a, <i1 true, i1 true>
78 %r = icmp ne <2 x i1> %not, <i1 false, i1 false>
82 define <2 x i1> @ugt_t_not(<2 x i1> %a) {
83 ; CHECK-LABEL: @ugt_t_not(
84 ; CHECK-NEXT: ret <2 x i1> zeroinitializer
86 %not = xor <2 x i1> %a, <i1 true, i1 true>
87 %r = icmp ugt <2 x i1> %not, <i1 true, i1 true>
91 define <2 x i1> @ugt_f_not(<2 x i1> %a) {
92 ; CHECK-LABEL: @ugt_f_not(
93 ; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)
94 ; CHECK-NEXT: ret <2 x i1> [[NOT]]
96 %not = xor <2 x i1> %a, <i1 true, i1 true>
97 %r = icmp ugt <2 x i1> %not, <i1 false, i1 false>
101 define <2 x i1> @ult_t_not(<2 x i1> %a) {
102 ; CHECK-LABEL: @ult_t_not(
103 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
105 %not = xor <2 x i1> %a, <i1 true, i1 true>
106 %r = icmp ult <2 x i1> %not, <i1 true, i1 true>
110 define <2 x i1> @ult_t_not_swap(<2 x i1> %a) {
111 ; CHECK-LABEL: @ult_t_not_swap(
112 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
114 %not = xor <2 x i1> <i1 true, i1 true>, %a
115 %r = icmp ult <2 x i1> %not, <i1 true, i1 true>
119 define <2 x i1> @ult_t_not_poison(<2 x i1> %a) {
120 ; CHECK-LABEL: @ult_t_not_poison(
121 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
123 %not = xor <2 x i1> %a, <i1 poison, i1 true>
124 %r = icmp ult <2 x i1> %not, <i1 true, i1 true>
128 define <2 x i1> @ult_f_not(<2 x i1> %a) {
129 ; CHECK-LABEL: @ult_f_not(
130 ; CHECK-NEXT: ret <2 x i1> zeroinitializer
132 %not = xor <2 x i1> %a, <i1 true, i1 true>
133 %r = icmp ult <2 x i1> %not, <i1 false, i1 false>
137 define <2 x i1> @sgt_t_not(<2 x i1> %a) {
138 ; CHECK-LABEL: @sgt_t_not(
139 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
141 %not = xor <2 x i1> %a, <i1 true, i1 true>
142 %r = icmp sgt <2 x i1> %not, <i1 true, i1 true>
146 define <2 x i1> @sgt_t_not_swap(<2 x i1> %a) {
147 ; CHECK-LABEL: @sgt_t_not_swap(
148 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
150 %not = xor <2 x i1> <i1 true, i1 true>, %a
151 %r = icmp sgt <2 x i1> %not, <i1 true, i1 true>
155 define <2 x i1> @sgt_t_not_poison(<2 x i1> %a) {
156 ; CHECK-LABEL: @sgt_t_not_poison(
157 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
159 %not = xor <2 x i1> %a, <i1 poison, i1 true>
160 %r = icmp sgt <2 x i1> %not, <i1 true, i1 true>
164 define <2 x i1> @sgt_f_not(<2 x i1> %a) {
165 ; CHECK-LABEL: @sgt_f_not(
166 ; CHECK-NEXT: ret <2 x i1> zeroinitializer
168 %not = xor <2 x i1> %a, <i1 true, i1 true>
169 %r = icmp sgt <2 x i1> %not, <i1 false, i1 false>
173 define <2 x i1> @slt_t_not(<2 x i1> %a) {
174 ; CHECK-LABEL: @slt_t_not(
175 ; CHECK-NEXT: ret <2 x i1> zeroinitializer
177 %not = xor <2 x i1> %a, <i1 true, i1 true>
178 %r = icmp slt <2 x i1> %not, <i1 true, i1 true>
182 define <2 x i1> @slt_f_not(<2 x i1> %a) {
183 ; CHECK-LABEL: @slt_f_not(
184 ; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)
185 ; CHECK-NEXT: ret <2 x i1> [[NOT]]
187 %not = xor <2 x i1> %a, <i1 true, i1 true>
188 %r = icmp slt <2 x i1> %not, <i1 false, i1 false>
192 define <2 x i1> @uge_t_not(<2 x i1> %a) {
193 ; CHECK-LABEL: @uge_t_not(
194 ; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)
195 ; CHECK-NEXT: ret <2 x i1> [[NOT]]
197 %not = xor <2 x i1> %a, <i1 true, i1 true>
198 %r = icmp uge <2 x i1> %not, <i1 true, i1 true>
202 define <2 x i1> @uge_f_not(<2 x i1> %a) {
203 ; CHECK-LABEL: @uge_f_not(
204 ; CHECK-NEXT: ret <2 x i1> splat (i1 true)
206 %not = xor <2 x i1> %a, <i1 true, i1 true>
207 %r = icmp uge <2 x i1> %not, <i1 false, i1 false>
211 define <2 x i1> @ule_t_not(<2 x i1> %a) {
212 ; CHECK-LABEL: @ule_t_not(
213 ; CHECK-NEXT: ret <2 x i1> splat (i1 true)
215 %not = xor <2 x i1> %a, <i1 true, i1 true>
216 %r = icmp ule <2 x i1> %not, <i1 true, i1 true>
220 define <2 x i1> @ule_f_not(<2 x i1> %a) {
221 ; CHECK-LABEL: @ule_f_not(
222 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
224 %not = xor <2 x i1> %a, <i1 true, i1 true>
225 %r = icmp ule <2 x i1> %not, <i1 false, i1 false>
229 define <2 x i1> @ule_f_not_swap(<2 x i1> %a) {
230 ; CHECK-LABEL: @ule_f_not_swap(
231 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
233 %not = xor <2 x i1> <i1 true, i1 true>, %a
234 %r = icmp ule <2 x i1> %not, <i1 false, i1 false>
238 define <2 x i1> @ule_f_not_poison(<2 x i1> %a) {
239 ; CHECK-LABEL: @ule_f_not_poison(
240 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
242 %not = xor <2 x i1> %a, <i1 poison, i1 true>
243 %r = icmp ule <2 x i1> %not, <i1 false, i1 false>
247 define <2 x i1> @sge_t_not(<2 x i1> %a) {
248 ; CHECK-LABEL: @sge_t_not(
249 ; CHECK-NEXT: ret <2 x i1> splat (i1 true)
251 %not = xor <2 x i1> %a, <i1 true, i1 true>
252 %r = icmp sge <2 x i1> %not, <i1 true, i1 true>
256 define <2 x i1> @sge_f_not(<2 x i1> %a) {
257 ; CHECK-LABEL: @sge_f_not(
258 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
260 %not = xor <2 x i1> %a, <i1 true, i1 true>
261 %r = icmp sge <2 x i1> %not, <i1 false, i1 false>
265 define <2 x i1> @sge_f_not_swap(<2 x i1> %a) {
266 ; CHECK-LABEL: @sge_f_not_swap(
267 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
269 %not = xor <2 x i1> <i1 true, i1 true>, %a
270 %r = icmp sge <2 x i1> %not, <i1 false, i1 false>
274 define <2 x i1> @sge_f_not_poison(<2 x i1> %a) {
275 ; CHECK-LABEL: @sge_f_not_poison(
276 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]]
278 %not = xor <2 x i1> %a, <i1 poison, i1 true>
279 %r = icmp sge <2 x i1> %not, <i1 false, i1 false>
283 define <2 x i1> @sle_t_not(<2 x i1> %a) {
284 ; CHECK-LABEL: @sle_t_not(
285 ; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)
286 ; CHECK-NEXT: ret <2 x i1> [[NOT]]
288 %not = xor <2 x i1> %a, <i1 true, i1 true>
289 %r = icmp sle <2 x i1> %not, <i1 true, i1 true>
293 define <2 x i1> @sle_f_not(<2 x i1> %a) {
294 ; CHECK-LABEL: @sle_f_not(
295 ; CHECK-NEXT: ret <2 x i1> splat (i1 true)
297 %not = xor <2 x i1> %a, <i1 true, i1 true>
298 %r = icmp sle <2 x i1> %not, <i1 false, i1 false>