Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / InstSimplify / icmp-not-bool-constant.ll
blobf4a0b6ddf662143642ccf39e3ebb610b589f2e42
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:%.*]], <i1 true, 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>
15   ret <2 x i1> %r
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>
24   ret <2 x i1> %r
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>
33   ret <2 x i1> %r
36 define <2 x i1> @eq_f_not_undef(<2 x i1> %a) {
37 ; CHECK-LABEL: @eq_f_not_undef(
38 ; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
40   %not = xor <2 x i1> %a, <i1 undef, i1 true>
41   %r = icmp eq <2 x i1> %not, <i1 false, i1 false>
42   ret <2 x i1> %r
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>
51   ret <2 x i1> %r
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>
60   ret <2 x i1> %r
63 define <2 x i1> @ne_t_not_undef(<2 x i1> %a) {
64 ; CHECK-LABEL: @ne_t_not_undef(
65 ; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
67   %not = xor <2 x i1> %a, <i1 undef, i1 true>
68   %r = icmp ne <2 x i1> %not, <i1 true, i1 true>
69   ret <2 x i1> %r
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:%.*]], <i1 true, 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>
79   ret <2 x i1> %r
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>
88   ret <2 x i1> %r
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:%.*]], <i1 true, 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>
98   ret <2 x i1> %r
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>
107   ret <2 x i1> %r
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>
116   ret <2 x i1> %r
119 define <2 x i1> @ult_t_not_undef(<2 x i1> %a) {
120 ; CHECK-LABEL: @ult_t_not_undef(
121 ; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
123   %not = xor <2 x i1> %a, <i1 undef, i1 true>
124   %r = icmp ult <2 x i1> %not, <i1 true, i1 true>
125   ret <2 x i1> %r
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>
134   ret <2 x i1> %r
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>
143   ret <2 x i1> %r
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>
152   ret <2 x i1> %r
155 define <2 x i1> @sgt_t_not_undef(<2 x i1> %a) {
156 ; CHECK-LABEL: @sgt_t_not_undef(
157 ; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
159   %not = xor <2 x i1> %a, <i1 undef, i1 true>
160   %r = icmp sgt <2 x i1> %not, <i1 true, i1 true>
161   ret <2 x i1> %r
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>
170   ret <2 x i1> %r
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>
179   ret <2 x i1> %r
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:%.*]], <i1 true, 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>
189   ret <2 x i1> %r
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:%.*]], <i1 true, 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>
199   ret <2 x i1> %r
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> <i1 true, 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>
208   ret <2 x i1> %r
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> <i1 true, 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>
217   ret <2 x i1> %r
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>
226   ret <2 x i1> %r
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>
235   ret <2 x i1> %r
238 define <2 x i1> @ule_f_not_undef(<2 x i1> %a) {
239 ; CHECK-LABEL: @ule_f_not_undef(
240 ; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
242   %not = xor <2 x i1> %a, <i1 undef, i1 true>
243   %r = icmp ule <2 x i1> %not, <i1 false, i1 false>
244   ret <2 x i1> %r
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> <i1 true, 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>
253   ret <2 x i1> %r
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>
262   ret <2 x i1> %r
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>
271   ret <2 x i1> %r
274 define <2 x i1> @sge_f_not_undef(<2 x i1> %a) {
275 ; CHECK-LABEL: @sge_f_not_undef(
276 ; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
278   %not = xor <2 x i1> %a, <i1 undef, i1 true>
279   %r = icmp sge <2 x i1> %not, <i1 false, i1 false>
280   ret <2 x i1> %r
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:%.*]], <i1 true, 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>
290   ret <2 x i1> %r
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> <i1 true, 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>
299   ret <2 x i1> %r