xref: /llvm-project/llvm/test/Transforms/InstSimplify/icmp-not-bool-constant.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
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.
7
8define <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]]
12;
13  %not = xor <2 x i1> %a, <i1 true, i1 true>
14  %r = icmp eq <2 x i1> %not, <i1 true, i1 true>
15  ret <2 x i1> %r
16}
17
18define <2 x i1> @eq_f_not(<2 x i1> %a) {
19; CHECK-LABEL: @eq_f_not(
20; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
21;
22  %not = xor <2 x i1> %a, <i1 true, i1 true>
23  %r = icmp eq <2 x i1> %not, <i1 false, i1 false>
24  ret <2 x i1> %r
25}
26
27define <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:%.*]]
30;
31  %not = xor <2 x i1> <i1 true, i1 true>, %a
32  %r = icmp eq <2 x i1> %not, <i1 false, i1 false>
33  ret <2 x i1> %r
34}
35
36define <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:%.*]]
39;
40  %not = xor <2 x i1> %a, <i1 poison, i1 true>
41  %r = icmp eq <2 x i1> %not, <i1 false, i1 false>
42  ret <2 x i1> %r
43}
44
45define <2 x i1> @ne_t_not(<2 x i1> %a) {
46; CHECK-LABEL: @ne_t_not(
47; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
48;
49  %not = xor <2 x i1> %a, <i1 true, i1 true>
50  %r = icmp ne <2 x i1> %not, <i1 true, i1 true>
51  ret <2 x i1> %r
52}
53
54define <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:%.*]]
57;
58  %not = xor <2 x i1> <i1 true, i1 true>, %a
59  %r = icmp ne <2 x i1> %not, <i1 true, i1 true>
60  ret <2 x i1> %r
61}
62
63define <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:%.*]]
66;
67  %not = xor <2 x i1> %a, <i1 poison, i1 true>
68  %r = icmp ne <2 x i1> %not, <i1 true, i1 true>
69  ret <2 x i1> %r
70}
71
72define <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]]
76;
77  %not = xor <2 x i1> %a, <i1 true, i1 true>
78  %r = icmp ne <2 x i1> %not, <i1 false, i1 false>
79  ret <2 x i1> %r
80}
81
82define <2 x i1> @ugt_t_not(<2 x i1> %a) {
83; CHECK-LABEL: @ugt_t_not(
84; CHECK-NEXT:    ret <2 x i1> zeroinitializer
85;
86  %not = xor <2 x i1> %a, <i1 true, i1 true>
87  %r = icmp ugt <2 x i1> %not, <i1 true, i1 true>
88  ret <2 x i1> %r
89}
90
91define <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]]
95;
96  %not = xor <2 x i1> %a, <i1 true, i1 true>
97  %r = icmp ugt <2 x i1> %not, <i1 false, i1 false>
98  ret <2 x i1> %r
99}
100
101define <2 x i1> @ult_t_not(<2 x i1> %a) {
102; CHECK-LABEL: @ult_t_not(
103; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
104;
105  %not = xor <2 x i1> %a, <i1 true, i1 true>
106  %r = icmp ult <2 x i1> %not, <i1 true, i1 true>
107  ret <2 x i1> %r
108}
109
110define <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:%.*]]
113;
114  %not = xor <2 x i1> <i1 true, i1 true>, %a
115  %r = icmp ult <2 x i1> %not, <i1 true, i1 true>
116  ret <2 x i1> %r
117}
118
119define <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:%.*]]
122;
123  %not = xor <2 x i1> %a, <i1 poison, i1 true>
124  %r = icmp ult <2 x i1> %not, <i1 true, i1 true>
125  ret <2 x i1> %r
126}
127
128define <2 x i1> @ult_f_not(<2 x i1> %a) {
129; CHECK-LABEL: @ult_f_not(
130; CHECK-NEXT:    ret <2 x i1> zeroinitializer
131;
132  %not = xor <2 x i1> %a, <i1 true, i1 true>
133  %r = icmp ult <2 x i1> %not, <i1 false, i1 false>
134  ret <2 x i1> %r
135}
136
137define <2 x i1> @sgt_t_not(<2 x i1> %a) {
138; CHECK-LABEL: @sgt_t_not(
139; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
140;
141  %not = xor <2 x i1> %a, <i1 true, i1 true>
142  %r = icmp sgt <2 x i1> %not, <i1 true, i1 true>
143  ret <2 x i1> %r
144}
145
146define <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:%.*]]
149;
150  %not = xor <2 x i1> <i1 true, i1 true>, %a
151  %r = icmp sgt <2 x i1> %not, <i1 true, i1 true>
152  ret <2 x i1> %r
153}
154
155define <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:%.*]]
158;
159  %not = xor <2 x i1> %a, <i1 poison, i1 true>
160  %r = icmp sgt <2 x i1> %not, <i1 true, i1 true>
161  ret <2 x i1> %r
162}
163
164define <2 x i1> @sgt_f_not(<2 x i1> %a) {
165; CHECK-LABEL: @sgt_f_not(
166; CHECK-NEXT:    ret <2 x i1> zeroinitializer
167;
168  %not = xor <2 x i1> %a, <i1 true, i1 true>
169  %r = icmp sgt <2 x i1> %not, <i1 false, i1 false>
170  ret <2 x i1> %r
171}
172
173define <2 x i1> @slt_t_not(<2 x i1> %a) {
174; CHECK-LABEL: @slt_t_not(
175; CHECK-NEXT:    ret <2 x i1> zeroinitializer
176;
177  %not = xor <2 x i1> %a, <i1 true, i1 true>
178  %r = icmp slt <2 x i1> %not, <i1 true, i1 true>
179  ret <2 x i1> %r
180}
181
182define <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]]
186;
187  %not = xor <2 x i1> %a, <i1 true, i1 true>
188  %r = icmp slt <2 x i1> %not, <i1 false, i1 false>
189  ret <2 x i1> %r
190}
191
192define <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]]
196;
197  %not = xor <2 x i1> %a, <i1 true, i1 true>
198  %r = icmp uge <2 x i1> %not, <i1 true, i1 true>
199  ret <2 x i1> %r
200}
201
202define <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)
205;
206  %not = xor <2 x i1> %a, <i1 true, i1 true>
207  %r = icmp uge <2 x i1> %not, <i1 false, i1 false>
208  ret <2 x i1> %r
209}
210
211define <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)
214;
215  %not = xor <2 x i1> %a, <i1 true, i1 true>
216  %r = icmp ule <2 x i1> %not, <i1 true, i1 true>
217  ret <2 x i1> %r
218}
219
220define <2 x i1> @ule_f_not(<2 x i1> %a) {
221; CHECK-LABEL: @ule_f_not(
222; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
223;
224  %not = xor <2 x i1> %a, <i1 true, i1 true>
225  %r = icmp ule <2 x i1> %not, <i1 false, i1 false>
226  ret <2 x i1> %r
227}
228
229define <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:%.*]]
232;
233  %not = xor <2 x i1> <i1 true, i1 true>, %a
234  %r = icmp ule <2 x i1> %not, <i1 false, i1 false>
235  ret <2 x i1> %r
236}
237
238define <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:%.*]]
241;
242  %not = xor <2 x i1> %a, <i1 poison, i1 true>
243  %r = icmp ule <2 x i1> %not, <i1 false, i1 false>
244  ret <2 x i1> %r
245}
246
247define <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)
250;
251  %not = xor <2 x i1> %a, <i1 true, i1 true>
252  %r = icmp sge <2 x i1> %not, <i1 true, i1 true>
253  ret <2 x i1> %r
254}
255
256define <2 x i1> @sge_f_not(<2 x i1> %a) {
257; CHECK-LABEL: @sge_f_not(
258; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
259;
260  %not = xor <2 x i1> %a, <i1 true, i1 true>
261  %r = icmp sge <2 x i1> %not, <i1 false, i1 false>
262  ret <2 x i1> %r
263}
264
265define <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:%.*]]
268;
269  %not = xor <2 x i1> <i1 true, i1 true>, %a
270  %r = icmp sge <2 x i1> %not, <i1 false, i1 false>
271  ret <2 x i1> %r
272}
273
274define <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:%.*]]
277;
278  %not = xor <2 x i1> %a, <i1 poison, i1 true>
279  %r = icmp sge <2 x i1> %not, <i1 false, i1 false>
280  ret <2 x i1> %r
281}
282
283define <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]]
287;
288  %not = xor <2 x i1> %a, <i1 true, i1 true>
289  %r = icmp sle <2 x i1> %not, <i1 true, i1 true>
290  ret <2 x i1> %r
291}
292
293define <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)
296;
297  %not = xor <2 x i1> %a, <i1 true, i1 true>
298  %r = icmp sle <2 x i1> %not, <i1 false, i1 false>
299  ret <2 x i1> %r
300}
301