Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / icmp-pow2-diff.ll
blobdd6553bec4b1d110fac6371a592a69db80945c31
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=CHECK,AVX512
3 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX2
4 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,SSE,SSE2
7 ; Todo: Support logic for non-splat vectors
8 define <4 x i1> @andnot_eq_v4i32_todo_no_splat(<4 x i32> %x) nounwind {
9 ; AVX512-LABEL: andnot_eq_v4i32_todo_no_splat:
10 ; AVX512:       # %bb.0:
11 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
12 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %k0
13 ; AVX512-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k1
14 ; AVX512-NEXT:    korw %k1, %k0, %k1
15 ; AVX512-NEXT:    vmovdqa32 %xmm1, %xmm0 {%k1} {z}
16 ; AVX512-NEXT:    retq
18 ; AVX2-LABEL: andnot_eq_v4i32_todo_no_splat:
19 ; AVX2:       # %bb.0:
20 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
21 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm1
22 ; AVX2-NEXT:    vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
23 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
24 ; AVX2-NEXT:    retq
26 ; SSE-LABEL: andnot_eq_v4i32_todo_no_splat:
27 ; SSE:       # %bb.0:
28 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
29 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
30 ; SSE-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
31 ; SSE-NEXT:    por %xmm1, %xmm0
32 ; SSE-NEXT:    retq
33   %cmp1 = icmp eq <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
34   %cmp2 = icmp eq <4 x i32> %x, <i32 -9, i32 -17, i32 -5, i32 -129>
35   %r = or <4 x i1> %cmp1, %cmp2
36   ret <4 x i1> %r
39 define <4 x i1> @andnot_eq_v4i32(<4 x i32> %x) nounwind {
40 ; AVX512-LABEL: andnot_eq_v4i32:
41 ; AVX512:       # %bb.0:
42 ; AVX512-NEXT:    vpandnd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
43 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
44 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
45 ; AVX512-NEXT:    retq
47 ; AVX2-LABEL: andnot_eq_v4i32:
48 ; AVX2:       # %bb.0:
49 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [4294967287,4294967287,4294967287,4294967287]
50 ; AVX2-NEXT:    vpandn %xmm1, %xmm0, %xmm0
51 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
52 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
53 ; AVX2-NEXT:    retq
55 ; SSE-LABEL: andnot_eq_v4i32:
56 ; SSE:       # %bb.0:
57 ; SSE-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
58 ; SSE-NEXT:    pxor %xmm1, %xmm1
59 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
60 ; SSE-NEXT:    retq
61   %cmp1 = icmp eq <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
62   %cmp2 = icmp eq <4 x i32> %x, <i32 -9, i32 -9, i32 -9, i32 -9>
63   %r = or <4 x i1> %cmp1, %cmp2
64   ret <4 x i1> %r
67 ; Intentional negative test.
68 define <2 x i1> @andnot_eq_v2i64_fail_max_not_n1(<2 x i64> %x) nounwind {
69 ; AVX512-LABEL: andnot_eq_v2i64_fail_max_not_n1:
70 ; AVX512:       # %bb.0:
71 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
72 ; AVX512-NEXT:    vpcmpeqq %xmm1, %xmm0, %k0
73 ; AVX512-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %k1
74 ; AVX512-NEXT:    korw %k1, %k0, %k1
75 ; AVX512-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1} {z}
76 ; AVX512-NEXT:    retq
78 ; AVX2-LABEL: andnot_eq_v2i64_fail_max_not_n1:
79 ; AVX2:       # %bb.0:
80 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
81 ; AVX2-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm1
82 ; AVX2-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
83 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
84 ; AVX2-NEXT:    retq
86 ; SSE41-LABEL: andnot_eq_v2i64_fail_max_not_n1:
87 ; SSE41:       # %bb.0:
88 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
89 ; SSE41-NEXT:    pcmpeqq %xmm0, %xmm1
90 ; SSE41-NEXT:    pcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
91 ; SSE41-NEXT:    por %xmm1, %xmm0
92 ; SSE41-NEXT:    retq
94 ; SSE2-LABEL: andnot_eq_v2i64_fail_max_not_n1:
95 ; SSE2:       # %bb.0:
96 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
97 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
98 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
99 ; SSE2-NEXT:    pand %xmm1, %xmm2
100 ; SSE2-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
101 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
102 ; SSE2-NEXT:    pand %xmm1, %xmm0
103 ; SSE2-NEXT:    por %xmm2, %xmm0
104 ; SSE2-NEXT:    retq
105   %cmp1 = icmp eq <2 x i64> %x, <i64 -1, i64 -1>
106   %cmp2 = icmp eq <2 x i64> %x, <i64 7, i64 7>
107   %r = or <2 x i1> %cmp1, %cmp2
108   ret <2 x i1> %r
111 define <2 x i1> @andnot_eq_v2i64(<2 x i64> %x) nounwind {
112 ; AVX512-LABEL: andnot_eq_v2i64:
113 ; AVX512:       # %bb.0:
114 ; AVX512-NEXT:    vpandnq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
115 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
116 ; AVX512-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
117 ; AVX512-NEXT:    retq
119 ; AVX2-LABEL: andnot_eq_v2i64:
120 ; AVX2:       # %bb.0:
121 ; AVX2-NEXT:    vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
122 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
123 ; AVX2-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
124 ; AVX2-NEXT:    retq
126 ; SSE41-LABEL: andnot_eq_v2i64:
127 ; SSE41:       # %bb.0:
128 ; SSE41-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
129 ; SSE41-NEXT:    pxor %xmm1, %xmm1
130 ; SSE41-NEXT:    pcmpeqq %xmm1, %xmm0
131 ; SSE41-NEXT:    retq
133 ; SSE2-LABEL: andnot_eq_v2i64:
134 ; SSE2:       # %bb.0:
135 ; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
136 ; SSE2-NEXT:    pxor %xmm1, %xmm1
137 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
138 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
139 ; SSE2-NEXT:    pand %xmm1, %xmm0
140 ; SSE2-NEXT:    retq
141   %cmp1 = icmp eq <2 x i64> %x, <i64 -5, i64 -5>
142   %cmp2 = icmp eq <2 x i64> %x, <i64 -1, i64 -1>
143   %r = or <2 x i1> %cmp1, %cmp2
144   ret <2 x i1> %r
147 ; Todo: Support logic for non-splat vectors
148 define <8 x i1> @andnot_ne_v8i16_todo_no_splat(<8 x i16> %x) nounwind {
149 ; AVX512-LABEL: andnot_ne_v8i16_todo_no_splat:
150 ; AVX512:       # %bb.0:
151 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
152 ; AVX512-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm2
153 ; AVX512-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
154 ; AVX512-NEXT:    vpternlogq $54, %xmm2, %xmm1, %xmm0
155 ; AVX512-NEXT:    retq
157 ; AVX2-LABEL: andnot_ne_v8i16_todo_no_splat:
158 ; AVX2:       # %bb.0:
159 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
160 ; AVX2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm2
161 ; AVX2-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
162 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
163 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
164 ; AVX2-NEXT:    retq
166 ; SSE-LABEL: andnot_ne_v8i16_todo_no_splat:
167 ; SSE:       # %bb.0:
168 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
169 ; SSE-NEXT:    movdqa %xmm0, %xmm2
170 ; SSE-NEXT:    pcmpeqw %xmm1, %xmm2
171 ; SSE-NEXT:    pcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
172 ; SSE-NEXT:    por %xmm2, %xmm0
173 ; SSE-NEXT:    pxor %xmm1, %xmm0
174 ; SSE-NEXT:    retq
175   %cmp1 = icmp ne <8 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
176   %cmp2 = icmp ne <8 x i16> %x, <i16 -16385, i16 -257, i16 -33, i16 -8193, i16 -16385, i16 -257, i16 -33, i16 -8193>
177   %r = and <8 x i1> %cmp1, %cmp2
178   ret <8 x i1> %r
181 define <8 x i1> @andnot_ne_v8i16(<8 x i16> %x) nounwind {
182 ; AVX512-LABEL: andnot_ne_v8i16:
183 ; AVX512:       # %bb.0:
184 ; AVX512-NEXT:    vpandnd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
185 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
186 ; AVX512-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
187 ; AVX512-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
188 ; AVX512-NEXT:    retq
190 ; AVX2-LABEL: andnot_ne_v8i16:
191 ; AVX2:       # %bb.0:
192 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
193 ; AVX2-NEXT:    vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
194 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
195 ; AVX2-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
196 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
197 ; AVX2-NEXT:    retq
199 ; SSE-LABEL: andnot_ne_v8i16:
200 ; SSE:       # %bb.0:
201 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
202 ; SSE-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
203 ; SSE-NEXT:    pxor %xmm2, %xmm2
204 ; SSE-NEXT:    pcmpeqw %xmm2, %xmm0
205 ; SSE-NEXT:    pxor %xmm1, %xmm0
206 ; SSE-NEXT:    retq
207   %cmp1 = icmp ne <8 x i16> %x, <i16 -16385, i16 -16385, i16 -16385, i16 -16385, i16 -16385, i16 -16385, i16 -16385, i16 -16385>
208   %cmp2 = icmp ne <8 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
209   %r = and <8 x i1> %cmp1, %cmp2
210   ret <8 x i1> %r
213 ; Intentional negative test.
214 define <16 x i1> @andnot_ne_v16i8_fail_max_not_n1(<16 x i8> %x) nounwind {
215 ; AVX512-LABEL: andnot_ne_v16i8_fail_max_not_n1:
216 ; AVX512:       # %bb.0:
217 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
218 ; AVX512-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm2
219 ; AVX512-NEXT:    vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
220 ; AVX512-NEXT:    vpternlogq $54, %xmm2, %xmm1, %xmm0
221 ; AVX512-NEXT:    retq
223 ; AVX2-LABEL: andnot_ne_v16i8_fail_max_not_n1:
224 ; AVX2:       # %bb.0:
225 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
226 ; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm2
227 ; AVX2-NEXT:    vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
228 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
229 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
230 ; AVX2-NEXT:    retq
232 ; SSE-LABEL: andnot_ne_v16i8_fail_max_not_n1:
233 ; SSE:       # %bb.0:
234 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
235 ; SSE-NEXT:    movdqa %xmm0, %xmm2
236 ; SSE-NEXT:    pcmpeqb %xmm1, %xmm2
237 ; SSE-NEXT:    pcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
238 ; SSE-NEXT:    por %xmm2, %xmm0
239 ; SSE-NEXT:    pxor %xmm1, %xmm0
240 ; SSE-NEXT:    retq
241   %cmp1 = icmp ne <16 x i8> %x, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
242   %cmp2 = icmp ne <16 x i8> %x, <i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127>
243   %r = and <16 x i1> %cmp1, %cmp2
244   ret <16 x i1> %r
247 define <16 x i1> @andnot_ne_v16i8(<16 x i8> %x) nounwind {
248 ; AVX512-LABEL: andnot_ne_v16i8:
249 ; AVX512:       # %bb.0:
250 ; AVX512-NEXT:    vpandnd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
251 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
252 ; AVX512-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
253 ; AVX512-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
254 ; AVX512-NEXT:    retq
256 ; AVX2-LABEL: andnot_ne_v16i8:
257 ; AVX2:       # %bb.0:
258 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
259 ; AVX2-NEXT:    vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
260 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
261 ; AVX2-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
262 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
263 ; AVX2-NEXT:    retq
265 ; SSE-LABEL: andnot_ne_v16i8:
266 ; SSE:       # %bb.0:
267 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
268 ; SSE-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
269 ; SSE-NEXT:    pxor %xmm2, %xmm2
270 ; SSE-NEXT:    pcmpeqb %xmm2, %xmm0
271 ; SSE-NEXT:    pxor %xmm1, %xmm0
272 ; SSE-NEXT:    retq
273   %cmp1 = icmp ne <16 x i8> %x, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
274   %cmp2 = icmp ne <16 x i8> %x, <i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33, i8 -33>
275   %r = and <16 x i1> %cmp1, %cmp2
276   ret <16 x i1> %r
279 define i1 @andnot_ne_i32(i32 %x) nounwind {
280 ; CHECK-LABEL: andnot_ne_i32:
281 ; CHECK:       # %bb.0:
282 ; CHECK-NEXT:    addl $1073741825, %edi # imm = 0x40000001
283 ; CHECK-NEXT:    testl $-1073741825, %edi # imm = 0xBFFFFFFF
284 ; CHECK-NEXT:    setne %al
285 ; CHECK-NEXT:    retq
286   %cmp1 = icmp ne i32 %x, -1
287   %cmp2 = icmp ne i32 %x, -1073741825
288   %r = and i1 %cmp1, %cmp2
289   ret i1 %r
292 define i1 @addand_ne_i16(i16 %x) nounwind {
293 ; CHECK-LABEL: addand_ne_i16:
294 ; CHECK:       # %bb.0:
295 ; CHECK-NEXT:    addl $3, %edi
296 ; CHECK-NEXT:    testl $49151, %edi # imm = 0xBFFF
297 ; CHECK-NEXT:    setne %al
298 ; CHECK-NEXT:    retq
299   %cmp1 = icmp ne i16 %x, -3
300   %cmp2 = icmp ne i16 %x, 16381
301   %r = and i1 %cmp1, %cmp2
302   ret i1 %r
305 ; Intentional negative test.
306 define <8 x i1> @addand_ne_v8i16_fail(<8 x i16> %x) nounwind {
307 ; AVX512-LABEL: addand_ne_v8i16_fail:
308 ; AVX512:       # %bb.0:
309 ; AVX512-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
310 ; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
311 ; AVX512-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
312 ; AVX512-NEXT:    vpternlogq $86, %xmm2, %xmm1, %xmm0
313 ; AVX512-NEXT:    retq
315 ; AVX2-LABEL: addand_ne_v8i16_fail:
316 ; AVX2:       # %bb.0:
317 ; AVX2-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
318 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
319 ; AVX2-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
320 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
321 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
322 ; AVX2-NEXT:    retq
324 ; SSE-LABEL: addand_ne_v8i16_fail:
325 ; SSE:       # %bb.0:
326 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65533,65533,65533,65533,65533,65533,65533,65533]
327 ; SSE-NEXT:    pcmpeqw %xmm0, %xmm1
328 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
329 ; SSE-NEXT:    pcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
330 ; SSE-NEXT:    por %xmm1, %xmm0
331 ; SSE-NEXT:    pxor %xmm2, %xmm0
332 ; SSE-NEXT:    retq
333   %cmp1 = icmp ne <8 x i16> %x, <i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3>
334   %cmp2 = icmp ne <8 x i16> %x, <i16 16381, i16 16381, i16 16381, i16 16381, i16 16381, i16 16381, i16 16381, i16 16381>
335   %r = and <8 x i1> %cmp1, %cmp2
336   ret <8 x i1> %r
339 define i1 @addand_eq_i32(i32 %x) nounwind {
340 ; CHECK-LABEL: addand_eq_i32:
341 ; CHECK:       # %bb.0:
342 ; CHECK-NEXT:    incl %edi
343 ; CHECK-NEXT:    testl $-9, %edi
344 ; CHECK-NEXT:    sete %al
345 ; CHECK-NEXT:    retq
346   %cmp1 = icmp eq i32 %x, -1
347   %cmp2 = icmp eq i32 %x, 7
348   %r = or i1 %cmp1, %cmp2
349   ret i1 %r
352 ; Intentional negative test.
353 define i1 @addand_eq_i8_fail_abs_p2_minmax_not(i8 %x) nounwind {
354 ; CHECK-LABEL: addand_eq_i8_fail_abs_p2_minmax_not:
355 ; CHECK:       # %bb.0:
356 ; CHECK-NEXT:    cmpb $124, %dil
357 ; CHECK-NEXT:    sete %cl
358 ; CHECK-NEXT:    cmpb $-8, %dil
359 ; CHECK-NEXT:    sete %al
360 ; CHECK-NEXT:    orb %cl, %al
361 ; CHECK-NEXT:    retq
362   %cmp1 = icmp eq i8 %x, 124
363   %cmp2 = icmp eq i8 %x, -8
364   %r = or i1 %cmp1, %cmp2
365   ret i1 %r
368 define i1 @addand_ne_i8(i8 %x) nounwind {
369 ; CHECK-LABEL: addand_ne_i8:
370 ; CHECK:       # %bb.0:
371 ; CHECK-NEXT:    addb $5, %dil
372 ; CHECK-NEXT:    testb $-65, %dil
373 ; CHECK-NEXT:    setne %al
374 ; CHECK-NEXT:    retq
375   %cmp1 = icmp ne i8 %x, 59
376   %cmp2 = icmp ne i8 %x, -5
377   %r = and i1 %cmp1, %cmp2
378   ret i1 %r
381 ; Intentional negative test.
382 define i1 @addand_eq_i64_fail_non_p2_dif(i64 %x) nounwind {
383 ; CHECK-LABEL: addand_eq_i64_fail_non_p2_dif:
384 ; CHECK:       # %bb.0:
385 ; CHECK-NEXT:    cmpq $-8, %rdi
386 ; CHECK-NEXT:    setne %cl
387 ; CHECK-NEXT:    cmpq $-17, %rdi
388 ; CHECK-NEXT:    setne %al
389 ; CHECK-NEXT:    andb %cl, %al
390 ; CHECK-NEXT:    retq
391   %cmp1 = icmp ne i64 %x, -8
392   %cmp2 = icmp ne i64 %x, -17
393   %r = and i1 %cmp1, %cmp2
394   ret i1 %r
397 define i1 @addand_eq_i64(i64 %x) nounwind {
398 ; CHECK-LABEL: addand_eq_i64:
399 ; CHECK:       # %bb.0:
400 ; CHECK-NEXT:    addq $256, %rdi # imm = 0x100
401 ; CHECK-NEXT:    testq $-1025, %rdi # imm = 0xFBFF
402 ; CHECK-NEXT:    setne %al
403 ; CHECK-NEXT:    retq
404   %cmp1 = icmp ne i64 %x, 768
405   %cmp2 = icmp ne i64 %x, -256
406   %r = and i1 %cmp1, %cmp2
407   ret i1 %r