xref: /llvm-project/llvm/test/CodeGen/X86/known-pow2.ll (revision e7f7b63fb3dd7a7d5c972b1f024a41df57c483a2)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=CHECK
3
4; Use common transform of:
5; (X & Y) == Y -> (X & Y) != 0 iff Y is non-zero power of 2 to test.
6; (X & Y) != Y -> (X & Y) == 0 iff Y is non-zero power of 2 to test.
7
8declare i32 @llvm.umin.i32(i32, i32)
9declare i32 @llvm.umax.i32(i32, i32)
10declare i32 @llvm.smin.i32(i32, i32)
11declare i32 @llvm.smax.i32(i32, i32)
12declare i32 @llvm.fshl.i32(i32, i32, i32)
13declare i32 @llvm.fshr.i32(i32, i32, i32)
14
15define <4 x i32> @pow2_non_splat_vec(<4 x i32> %x) {
16; CHECK-LABEL: pow2_non_splat_vec:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
19; CHECK-NEXT:    retq
20  %r = urem <4 x i32> %x, <i32 8, i32 4, i32 16, i32 64>
21  ret <4 x i32> %r
22}
23
24define <4 x i32> @pow2_non_splat_vec_fail0(<4 x i32> %x) {
25; CHECK-LABEL: pow2_non_splat_vec_fail0:
26; CHECK:       # %bb.0:
27; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [954437177,1073741824,268435456,67108864]
28; CHECK-NEXT:    pmuludq %xmm0, %xmm1
29; CHECK-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
30; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
31; CHECK-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
32; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,3,2,3]
33; CHECK-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
34; CHECK-NEXT:    movdqa %xmm1, %xmm3
35; CHECK-NEXT:    psrld $1, %xmm3
36; CHECK-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,3]
37; CHECK-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
38; CHECK-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
39; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
40; CHECK-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
41; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
42; CHECK-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
43; CHECK-NEXT:    psubd %xmm1, %xmm0
44; CHECK-NEXT:    retq
45  %r = urem <4 x i32> %x, <i32 9, i32 4, i32 16, i32 64>
46  ret <4 x i32> %r
47}
48
49define i1 @pow2_shl(i32 %x, i32 %y) {
50; CHECK-LABEL: pow2_shl:
51; CHECK:       # %bb.0:
52; CHECK-NEXT:    movl %esi, %ecx
53; CHECK-NEXT:    movl %edi, %eax
54; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
55; CHECK-NEXT:    shrl %cl, %eax
56; CHECK-NEXT:    andl $4, %eax
57; CHECK-NEXT:    shrl $2, %eax
58; CHECK-NEXT:    # kill: def $al killed $al killed $eax
59; CHECK-NEXT:    retq
60  %d = shl nuw nsw i32 4, %y
61  %and = and i32 %x, %d
62  %r = icmp eq i32 %and, %d
63  ret i1 %r
64}
65
66define i1 @pow2_shl_fail0(i32 %x, i32 %y) {
67; CHECK-LABEL: pow2_shl_fail0:
68; CHECK:       # %bb.0:
69; CHECK-NEXT:    movl %esi, %ecx
70; CHECK-NEXT:    notl %edi
71; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
72; CHECK-NEXT:    shrl %cl, %edi
73; CHECK-NEXT:    testb $3, %dil
74; CHECK-NEXT:    sete %al
75; CHECK-NEXT:    retq
76  %d = shl i32 3, %y
77  %and = and i32 %x, %d
78  %r = icmp eq i32 %and, %d
79  ret i1 %r
80}
81
82define i1 @pow2_shl_fail1(i32 %x, i32 %y) {
83; CHECK-LABEL: pow2_shl_fail1:
84; CHECK:       # %bb.0:
85; CHECK-NEXT:    movl %esi, %ecx
86; CHECK-NEXT:    notl %edi
87; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
88; CHECK-NEXT:    shrl %cl, %edi
89; CHECK-NEXT:    testb $4, %dil
90; CHECK-NEXT:    sete %al
91; CHECK-NEXT:    retq
92  %d = shl i32 4, %y
93  %and = and i32 %x, %d
94  %r = icmp eq i32 %and, %d
95  ret i1 %r
96}
97
98define i1 @pow2_srl(i32 %x, i32 %y) {
99; CHECK-LABEL: pow2_srl:
100; CHECK:       # %bb.0:
101; CHECK-NEXT:    movl %esi, %ecx
102; CHECK-NEXT:    movl %edi, %eax
103; CHECK-NEXT:    andb $7, %cl
104; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
105; CHECK-NEXT:    shll %cl, %eax
106; CHECK-NEXT:    shrl $20, %eax
107; CHECK-NEXT:    andl $1, %eax
108; CHECK-NEXT:    # kill: def $al killed $al killed $eax
109; CHECK-NEXT:    retq
110  %yy = and i32 %y, 7
111  %d = lshr i32 1048576, %yy
112  %and = and i32 %x, %d
113  %r = icmp eq i32 %and, %d
114  ret i1 %r
115}
116
117define i1 @pow2_srl_fail0(i32 %x, i32 %y) {
118; CHECK-LABEL: pow2_srl_fail0:
119; CHECK:       # %bb.0:
120; CHECK-NEXT:    movl %esi, %ecx
121; CHECK-NEXT:    andb $30, %cl
122; CHECK-NEXT:    notl %edi
123; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
124; CHECK-NEXT:    shll %cl, %edi
125; CHECK-NEXT:    testl $1048576, %edi # imm = 0x100000
126; CHECK-NEXT:    sete %al
127; CHECK-NEXT:    retq
128  %yy = and i32 %y, 30
129  %d = lshr i32 1048576, %yy
130  %and = and i32 %x, %d
131  %r = icmp eq i32 %and, %d
132  ret i1 %r
133}
134
135define i1 @pow2_srl_fail1(i32 %x, i32 %y) {
136; CHECK-LABEL: pow2_srl_fail1:
137; CHECK:       # %bb.0:
138; CHECK-NEXT:    movl %esi, %ecx
139; CHECK-NEXT:    andb $7, %cl
140; CHECK-NEXT:    notl %edi
141; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
142; CHECK-NEXT:    shll %cl, %edi
143; CHECK-NEXT:    testl $1048577, %edi # imm = 0x100001
144; CHECK-NEXT:    sete %al
145; CHECK-NEXT:    retq
146  %yy = and i32 %y, 7
147  %d = lshr i32 1048577, %yy
148  %and = and i32 %x, %d
149  %r = icmp eq i32 %and, %d
150  ret i1 %r
151}
152
153define i1 @pow2_rotl(i32 %x, i32 %y) {
154; CHECK-LABEL: pow2_rotl:
155; CHECK:       # %bb.0:
156; CHECK-NEXT:    movl %esi, %ecx
157; CHECK-NEXT:    movl $1048576, %eax # imm = 0x100000
158; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
159; CHECK-NEXT:    roll %cl, %eax
160; CHECK-NEXT:    testl %eax, %edi
161; CHECK-NEXT:    setne %al
162; CHECK-NEXT:    retq
163  %d = call i32 @llvm.fshl.i32(i32 1048576, i32 1048576, i32 %y)
164  %and = and i32 %x, %d
165  %r = icmp eq i32 %and, %d
166  ret i1 %r
167}
168
169define i1 @pow2_rotl_fail0(i32 %x, i32 %y) {
170; CHECK-LABEL: pow2_rotl_fail0:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    movl %esi, %ecx
173; CHECK-NEXT:    movl $1048576, %eax # imm = 0x100000
174; CHECK-NEXT:    movl $512, %edx # imm = 0x200
175; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
176; CHECK-NEXT:    shldl %cl, %eax, %edx
177; CHECK-NEXT:    notl %edi
178; CHECK-NEXT:    testl %edi, %edx
179; CHECK-NEXT:    sete %al
180; CHECK-NEXT:    retq
181  %d = call i32 @llvm.fshl.i32(i32 512, i32 1048576, i32 %y)
182  %and = and i32 %x, %d
183  %r = icmp eq i32 %and, %d
184  ret i1 %r
185}
186
187define i1 @pow2_rotl_fail1(i32 %x, i32 %y) {
188; CHECK-LABEL: pow2_rotl_fail1:
189; CHECK:       # %bb.0:
190; CHECK-NEXT:    movl %esi, %ecx
191; CHECK-NEXT:    movl $511, %eax # imm = 0x1FF
192; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
193; CHECK-NEXT:    roll %cl, %eax
194; CHECK-NEXT:    notl %edi
195; CHECK-NEXT:    testl %edi, %eax
196; CHECK-NEXT:    sete %al
197; CHECK-NEXT:    retq
198  %d = call i32 @llvm.fshl.i32(i32 511, i32 511, i32 %y)
199  %and = and i32 %x, %d
200  %r = icmp eq i32 %and, %d
201  ret i1 %r
202}
203
204define i1 @pow2_rotr(i32 %x, i32 %y) {
205; CHECK-LABEL: pow2_rotr:
206; CHECK:       # %bb.0:
207; CHECK-NEXT:    movl %esi, %ecx
208; CHECK-NEXT:    movl $1048576, %eax # imm = 0x100000
209; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
210; CHECK-NEXT:    rorl %cl, %eax
211; CHECK-NEXT:    testl %eax, %edi
212; CHECK-NEXT:    setne %al
213; CHECK-NEXT:    retq
214  %d = call i32 @llvm.fshr.i32(i32 1048576, i32 1048576, i32 %y)
215  %and = and i32 %x, %d
216  %r = icmp eq i32 %and, %d
217  ret i1 %r
218}
219
220define i1 @pow2_rotr_fail0(i32 %x, i32 %y) {
221; CHECK-LABEL: pow2_rotr_fail0:
222; CHECK:       # %bb.0:
223; CHECK-NEXT:    movl %esi, %ecx
224; CHECK-NEXT:    movl $512, %eax # imm = 0x200
225; CHECK-NEXT:    movl $1048576, %edx # imm = 0x100000
226; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
227; CHECK-NEXT:    shrdl %cl, %eax, %edx
228; CHECK-NEXT:    notl %edi
229; CHECK-NEXT:    testl %edi, %edx
230; CHECK-NEXT:    sete %al
231; CHECK-NEXT:    retq
232  %d = call i32 @llvm.fshr.i32(i32 512, i32 1048576, i32 %y)
233  %and = and i32 %x, %d
234  %r = icmp eq i32 %and, %d
235  ret i1 %r
236}
237
238define i1 @pow2_rotr_fail1(i32 %x, i32 %y) {
239; CHECK-LABEL: pow2_rotr_fail1:
240; CHECK:       # %bb.0:
241; CHECK-NEXT:    movl %esi, %ecx
242; CHECK-NEXT:    movl $511, %eax # imm = 0x1FF
243; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
244; CHECK-NEXT:    rorl %cl, %eax
245; CHECK-NEXT:    notl %edi
246; CHECK-NEXT:    testl %edi, %eax
247; CHECK-NEXT:    sete %al
248; CHECK-NEXT:    retq
249  %d = call i32 @llvm.fshr.i32(i32 511, i32 511, i32 %y)
250  %and = and i32 %x, %d
251  %r = icmp eq i32 %and, %d
252  ret i1 %r
253}
254
255define i1 @pow2_umin(i32 %x, i32 %y) {
256; CHECK-LABEL: pow2_umin:
257; CHECK:       # %bb.0:
258; CHECK-NEXT:    movl %esi, %ecx
259; CHECK-NEXT:    movl $1, %eax
260; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
261; CHECK-NEXT:    shll %cl, %eax
262; CHECK-NEXT:    cmpl $262144, %eax # imm = 0x40000
263; CHECK-NEXT:    movl $262144, %ecx # imm = 0x40000
264; CHECK-NEXT:    cmovbl %eax, %ecx
265; CHECK-NEXT:    testl %ecx, %edi
266; CHECK-NEXT:    setne %al
267; CHECK-NEXT:    retq
268  %yy = shl i32 1, %y
269  %d = call i32 @llvm.umin.i32(i32 %yy, i32 262144)
270  %and = and i32 %x, %d
271  %r = icmp eq i32 %and, %d
272  ret i1 %r
273}
274
275define i1 @pow2_umin_fail0(i32 %x, i32 %y) {
276; CHECK-LABEL: pow2_umin_fail0:
277; CHECK:       # %bb.0:
278; CHECK-NEXT:    movl %esi, %ecx
279; CHECK-NEXT:    movl $4, %eax
280; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
281; CHECK-NEXT:    shll %cl, %eax
282; CHECK-NEXT:    cmpl $262144, %eax # imm = 0x40000
283; CHECK-NEXT:    movl $262144, %ecx # imm = 0x40000
284; CHECK-NEXT:    cmovbl %eax, %ecx
285; CHECK-NEXT:    notl %edi
286; CHECK-NEXT:    testl %edi, %ecx
287; CHECK-NEXT:    sete %al
288; CHECK-NEXT:    retq
289  %yy = shl i32 4, %y
290  %d = call i32 @llvm.umin.i32(i32 %yy, i32 262144)
291  %and = and i32 %x, %d
292  %r = icmp eq i32 %and, %d
293  ret i1 %r
294}
295
296define i1 @pow2_umin_fail1(i32 %x, i32 %y) {
297; CHECK-LABEL: pow2_umin_fail1:
298; CHECK:       # %bb.0:
299; CHECK-NEXT:    movl %esi, %ecx
300; CHECK-NEXT:    movl $1, %eax
301; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
302; CHECK-NEXT:    shll %cl, %eax
303; CHECK-NEXT:    cmpl $12345, %eax # imm = 0x3039
304; CHECK-NEXT:    movl $12345, %ecx # imm = 0x3039
305; CHECK-NEXT:    cmovbl %eax, %ecx
306; CHECK-NEXT:    notl %edi
307; CHECK-NEXT:    testl %edi, %ecx
308; CHECK-NEXT:    sete %al
309; CHECK-NEXT:    retq
310  %yy = shl i32 1, %y
311  %d = call i32 @llvm.umin.i32(i32 %yy, i32 12345)
312  %and = and i32 %x, %d
313  %r = icmp eq i32 %and, %d
314  ret i1 %r
315}
316
317define i1 @pow2_umax(i32 %x, i32 %y, i32 %z) {
318; CHECK-LABEL: pow2_umax:
319; CHECK:       # %bb.0:
320; CHECK-NEXT:    movl %esi, %ecx
321; CHECK-NEXT:    movl $1, %eax
322; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
323; CHECK-NEXT:    shll %cl, %eax
324; CHECK-NEXT:    movl $-2147483648, %esi # imm = 0x80000000
325; CHECK-NEXT:    movl %edx, %ecx
326; CHECK-NEXT:    shrl %cl, %esi
327; CHECK-NEXT:    cmpl %esi, %eax
328; CHECK-NEXT:    cmoval %eax, %esi
329; CHECK-NEXT:    testl %esi, %edi
330; CHECK-NEXT:    setne %al
331; CHECK-NEXT:    retq
332  %yy = shl i32 1, %y
333  %zz = lshr i32 2147483648, %z
334  %d = call i32 @llvm.umax.i32(i32 %yy, i32 %zz)
335  %and = and i32 %x, %d
336  %r = icmp eq i32 %and, %d
337  ret i1 %r
338}
339
340define i1 @pow2_umax_fail0(i32 %x, i32 %y, i32 %z) {
341; CHECK-LABEL: pow2_umax_fail0:
342; CHECK:       # %bb.0:
343; CHECK-NEXT:    movl %esi, %ecx
344; CHECK-NEXT:    movl $1, %eax
345; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
346; CHECK-NEXT:    shll %cl, %eax
347; CHECK-NEXT:    movl $1073741824, %esi # imm = 0x40000000
348; CHECK-NEXT:    movl %edx, %ecx
349; CHECK-NEXT:    shrl %cl, %esi
350; CHECK-NEXT:    cmpl %esi, %eax
351; CHECK-NEXT:    cmoval %eax, %esi
352; CHECK-NEXT:    notl %edi
353; CHECK-NEXT:    testl %edi, %esi
354; CHECK-NEXT:    sete %al
355; CHECK-NEXT:    retq
356  %yy = shl i32 1, %y
357  %zz = lshr i32 1073741824, %z
358  %d = call i32 @llvm.umax.i32(i32 %yy, i32 %zz)
359  %and = and i32 %x, %d
360  %r = icmp eq i32 %and, %d
361  ret i1 %r
362}
363
364define i1 @pow2_umax_fail1(i32 %x, i32 %y, i32 %z) {
365; CHECK-LABEL: pow2_umax_fail1:
366; CHECK:       # %bb.0:
367; CHECK-NEXT:    movl %esi, %ecx
368; CHECK-NEXT:    movl $4, %eax
369; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
370; CHECK-NEXT:    shll %cl, %eax
371; CHECK-NEXT:    movl $-2147483648, %esi # imm = 0x80000000
372; CHECK-NEXT:    movl %edx, %ecx
373; CHECK-NEXT:    shrl %cl, %esi
374; CHECK-NEXT:    cmpl %esi, %eax
375; CHECK-NEXT:    cmoval %eax, %esi
376; CHECK-NEXT:    notl %edi
377; CHECK-NEXT:    testl %edi, %esi
378; CHECK-NEXT:    sete %al
379; CHECK-NEXT:    retq
380  %yy = shl i32 4, %y
381  %zz = lshr i32 2147483648, %z
382  %d = call i32 @llvm.umax.i32(i32 %yy, i32 %zz)
383  %and = and i32 %x, %d
384  %r = icmp eq i32 %and, %d
385  ret i1 %r
386}
387
388define i1 @pow2_smin(i32 %x, i32 %y) {
389; CHECK-LABEL: pow2_smin:
390; CHECK:       # %bb.0:
391; CHECK-NEXT:    movl %esi, %ecx
392; CHECK-NEXT:    movl $1, %eax
393; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
394; CHECK-NEXT:    shll %cl, %eax
395; CHECK-NEXT:    cmpl $262144, %eax # imm = 0x40000
396; CHECK-NEXT:    movl $262144, %ecx # imm = 0x40000
397; CHECK-NEXT:    cmovll %eax, %ecx
398; CHECK-NEXT:    testl %ecx, %edi
399; CHECK-NEXT:    setne %al
400; CHECK-NEXT:    retq
401  %yy = shl i32 1, %y
402  %d = call i32 @llvm.smin.i32(i32 %yy, i32 262144)
403  %and = and i32 %x, %d
404  %r = icmp eq i32 %and, %d
405  ret i1 %r
406}
407
408define i1 @pow2_smin_fail0(i32 %x, i32 %y) {
409; CHECK-LABEL: pow2_smin_fail0:
410; CHECK:       # %bb.0:
411; CHECK-NEXT:    movl %esi, %ecx
412; CHECK-NEXT:    movl $4, %eax
413; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
414; CHECK-NEXT:    shll %cl, %eax
415; CHECK-NEXT:    cmpl $262144, %eax # imm = 0x40000
416; CHECK-NEXT:    movl $262144, %ecx # imm = 0x40000
417; CHECK-NEXT:    cmovll %eax, %ecx
418; CHECK-NEXT:    notl %edi
419; CHECK-NEXT:    testl %edi, %ecx
420; CHECK-NEXT:    sete %al
421; CHECK-NEXT:    retq
422  %yy = shl i32 4, %y
423  %d = call i32 @llvm.smin.i32(i32 %yy, i32 262144)
424  %and = and i32 %x, %d
425  %r = icmp eq i32 %and, %d
426  ret i1 %r
427}
428
429define i1 @pow2_smin_fail1(i32 %x, i32 %y) {
430; CHECK-LABEL: pow2_smin_fail1:
431; CHECK:       # %bb.0:
432; CHECK-NEXT:    movl %esi, %ecx
433; CHECK-NEXT:    movl $1, %eax
434; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
435; CHECK-NEXT:    shll %cl, %eax
436; CHECK-NEXT:    cmpl $12345, %eax # imm = 0x3039
437; CHECK-NEXT:    movl $12345, %ecx # imm = 0x3039
438; CHECK-NEXT:    cmovll %eax, %ecx
439; CHECK-NEXT:    notl %edi
440; CHECK-NEXT:    testl %edi, %ecx
441; CHECK-NEXT:    sete %al
442; CHECK-NEXT:    retq
443  %yy = shl i32 1, %y
444  %d = call i32 @llvm.smin.i32(i32 %yy, i32 12345)
445  %and = and i32 %x, %d
446  %r = icmp eq i32 %and, %d
447  ret i1 %r
448}
449
450define i1 @pow2_smax(i32 %x, i32 %y, i32 %z) {
451; CHECK-LABEL: pow2_smax:
452; CHECK:       # %bb.0:
453; CHECK-NEXT:    movl %esi, %ecx
454; CHECK-NEXT:    movl $1, %eax
455; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
456; CHECK-NEXT:    shll %cl, %eax
457; CHECK-NEXT:    movl $-2147483648, %esi # imm = 0x80000000
458; CHECK-NEXT:    movl %edx, %ecx
459; CHECK-NEXT:    shrl %cl, %esi
460; CHECK-NEXT:    cmpl %esi, %eax
461; CHECK-NEXT:    cmovgl %eax, %esi
462; CHECK-NEXT:    testl %esi, %edi
463; CHECK-NEXT:    setne %al
464; CHECK-NEXT:    retq
465  %yy = shl i32 1, %y
466  %zz = lshr i32 2147483648, %z
467  %d = call i32 @llvm.smax.i32(i32 %yy, i32 %zz)
468  %and = and i32 %x, %d
469  %r = icmp eq i32 %and, %d
470  ret i1 %r
471}
472
473define i1 @pow2_smax_fail0(i32 %x, i32 %y, i32 %z) {
474; CHECK-LABEL: pow2_smax_fail0:
475; CHECK:       # %bb.0:
476; CHECK-NEXT:    movl %esi, %ecx
477; CHECK-NEXT:    movl $1, %eax
478; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
479; CHECK-NEXT:    shll %cl, %eax
480; CHECK-NEXT:    movl $1073741824, %esi # imm = 0x40000000
481; CHECK-NEXT:    movl %edx, %ecx
482; CHECK-NEXT:    shrl %cl, %esi
483; CHECK-NEXT:    cmpl %esi, %eax
484; CHECK-NEXT:    cmovgl %eax, %esi
485; CHECK-NEXT:    notl %edi
486; CHECK-NEXT:    testl %edi, %esi
487; CHECK-NEXT:    sete %al
488; CHECK-NEXT:    retq
489  %yy = shl i32 1, %y
490  %zz = lshr i32 1073741824, %z
491  %d = call i32 @llvm.smax.i32(i32 %yy, i32 %zz)
492  %and = and i32 %x, %d
493  %r = icmp eq i32 %and, %d
494  ret i1 %r
495}
496
497define i1 @pow2_smax_fail1(i32 %x, i32 %y, i32 %z) {
498; CHECK-LABEL: pow2_smax_fail1:
499; CHECK:       # %bb.0:
500; CHECK-NEXT:    movl %esi, %ecx
501; CHECK-NEXT:    movl $4, %eax
502; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
503; CHECK-NEXT:    shll %cl, %eax
504; CHECK-NEXT:    movl $-2147483648, %esi # imm = 0x80000000
505; CHECK-NEXT:    movl %edx, %ecx
506; CHECK-NEXT:    shrl %cl, %esi
507; CHECK-NEXT:    cmpl %esi, %eax
508; CHECK-NEXT:    cmovgl %eax, %esi
509; CHECK-NEXT:    notl %edi
510; CHECK-NEXT:    testl %edi, %esi
511; CHECK-NEXT:    sete %al
512; CHECK-NEXT:    retq
513  %yy = shl i32 4, %y
514  %zz = lshr i32 2147483648, %z
515  %d = call i32 @llvm.smax.i32(i32 %yy, i32 %zz)
516  %and = and i32 %x, %d
517  %r = icmp eq i32 %and, %d
518  ret i1 %r
519}
520
521define i1 @pow2_select(i1 %c, i32 %x, i32 %y, i32 %z) {
522; CHECK-LABEL: pow2_select:
523; CHECK:       # %bb.0:
524; CHECK-NEXT:    movl %ecx, %eax
525; CHECK-NEXT:    movl %edx, %ecx
526; CHECK-NEXT:    movl $1, %edx
527; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
528; CHECK-NEXT:    shll %cl, %edx
529; CHECK-NEXT:    movl $-2147483648, %r8d # imm = 0x80000000
530; CHECK-NEXT:    movl %eax, %ecx
531; CHECK-NEXT:    shrl %cl, %r8d
532; CHECK-NEXT:    testb $1, %dil
533; CHECK-NEXT:    cmovnel %edx, %r8d
534; CHECK-NEXT:    testl %r8d, %esi
535; CHECK-NEXT:    setne %al
536; CHECK-NEXT:    retq
537  %yy = shl i32 1, %y
538  %zz = lshr i32 2147483648, %z
539  %d = select i1 %c, i32 %yy, i32 %zz
540  %and = and i32 %x, %d
541  %r = icmp eq i32 %and, %d
542  ret i1 %r
543}
544
545define i1 @pow2_select_fail0(i1 %c, i32 %x, i32 %y, i32 %z) {
546; CHECK-LABEL: pow2_select_fail0:
547; CHECK:       # %bb.0:
548; CHECK-NEXT:    movl %ecx, %eax
549; CHECK-NEXT:    movl %edx, %ecx
550; CHECK-NEXT:    movl $1, %edx
551; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
552; CHECK-NEXT:    shll %cl, %edx
553; CHECK-NEXT:    movl $1073741824, %r8d # imm = 0x40000000
554; CHECK-NEXT:    movl %eax, %ecx
555; CHECK-NEXT:    shrl %cl, %r8d
556; CHECK-NEXT:    testb $1, %dil
557; CHECK-NEXT:    cmovnel %edx, %r8d
558; CHECK-NEXT:    notl %esi
559; CHECK-NEXT:    testl %esi, %r8d
560; CHECK-NEXT:    sete %al
561; CHECK-NEXT:    retq
562  %yy = shl i32 1, %y
563  %zz = lshr i32 1073741824, %z
564  %d = select i1 %c, i32 %yy, i32 %zz
565  %and = and i32 %x, %d
566  %r = icmp eq i32 %and, %d
567  ret i1 %r
568}
569
570define i1 @pow2_select_fail2(i1 %c, i32 %x, i32 %y, i32 %z) {
571; CHECK-LABEL: pow2_select_fail2:
572; CHECK:       # %bb.0:
573; CHECK-NEXT:    movl %ecx, %eax
574; CHECK-NEXT:    movl %edx, %ecx
575; CHECK-NEXT:    movl $4, %edx
576; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
577; CHECK-NEXT:    shll %cl, %edx
578; CHECK-NEXT:    movl $-2147483648, %r8d # imm = 0x80000000
579; CHECK-NEXT:    movl %eax, %ecx
580; CHECK-NEXT:    shrl %cl, %r8d
581; CHECK-NEXT:    testb $1, %dil
582; CHECK-NEXT:    cmovnel %edx, %r8d
583; CHECK-NEXT:    notl %esi
584; CHECK-NEXT:    testl %esi, %r8d
585; CHECK-NEXT:    sete %al
586; CHECK-NEXT:    retq
587  %yy = shl i32 4, %y
588  %zz = lshr i32 2147483648, %z
589  %d = select i1 %c, i32 %yy, i32 %zz
590  %and = and i32 %x, %d
591  %r = icmp eq i32 %and, %d
592  ret i1 %r
593}
594
595define <4 x i1> @pow2_vselect_eq(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
596; CHECK-LABEL: pow2_vselect_eq:
597; CHECK:       # %bb.0:
598; CHECK-NEXT:    pslld $31, %xmm0
599; CHECK-NEXT:    psrad $31, %xmm0
600; CHECK-NEXT:    pslld $23, %xmm2
601; CHECK-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
602; CHECK-NEXT:    cvttps2dq %xmm2, %xmm2
603; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
604; CHECK-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
605; CHECK-NEXT:    movdqa %xmm5, %xmm6
606; CHECK-NEXT:    psrld %xmm4, %xmm6
607; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[0,1,1,1,4,5,6,7]
608; CHECK-NEXT:    movdqa %xmm5, %xmm7
609; CHECK-NEXT:    psrld %xmm4, %xmm7
610; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm7 = xmm7[0],xmm6[0]
611; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
612; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
613; CHECK-NEXT:    movdqa %xmm5, %xmm6
614; CHECK-NEXT:    psrld %xmm4, %xmm6
615; CHECK-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
616; CHECK-NEXT:    psrld %xmm3, %xmm5
617; CHECK-NEXT:    punpckhqdq {{.*#+}} xmm5 = xmm5[1],xmm6[1]
618; CHECK-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,3],xmm5[0,3]
619; CHECK-NEXT:    pand %xmm0, %xmm2
620; CHECK-NEXT:    pandn %xmm7, %xmm0
621; CHECK-NEXT:    por %xmm2, %xmm0
622; CHECK-NEXT:    pand %xmm0, %xmm1
623; CHECK-NEXT:    pcmpeqd %xmm1, %xmm0
624; CHECK-NEXT:    retq
625  %yy = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y
626  %zz = lshr <4 x i32> <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>, %z
627  %d = select <4 x i1> %c, <4 x i32> %yy, <4 x i32> %zz
628  %and = and <4 x i32> %x, %d
629  %r = icmp eq <4 x i32> %and, %d
630  ret <4 x i1> %r
631}
632
633define <4 x i1> @pow2_vselect_ne(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
634; CHECK-LABEL: pow2_vselect_ne:
635; CHECK:       # %bb.0:
636; CHECK-NEXT:    pslld $31, %xmm0
637; CHECK-NEXT:    psrad $31, %xmm0
638; CHECK-NEXT:    pslld $23, %xmm2
639; CHECK-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
640; CHECK-NEXT:    cvttps2dq %xmm2, %xmm2
641; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
642; CHECK-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
643; CHECK-NEXT:    movdqa %xmm5, %xmm6
644; CHECK-NEXT:    psrld %xmm4, %xmm6
645; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[0,1,1,1,4,5,6,7]
646; CHECK-NEXT:    movdqa %xmm5, %xmm7
647; CHECK-NEXT:    psrld %xmm4, %xmm7
648; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm7 = xmm7[0],xmm6[0]
649; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
650; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
651; CHECK-NEXT:    movdqa %xmm5, %xmm6
652; CHECK-NEXT:    psrld %xmm4, %xmm6
653; CHECK-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
654; CHECK-NEXT:    psrld %xmm3, %xmm5
655; CHECK-NEXT:    punpckhqdq {{.*#+}} xmm5 = xmm5[1],xmm6[1]
656; CHECK-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,3],xmm5[0,3]
657; CHECK-NEXT:    pand %xmm0, %xmm2
658; CHECK-NEXT:    pandn %xmm7, %xmm0
659; CHECK-NEXT:    por %xmm2, %xmm0
660; CHECK-NEXT:    pand %xmm1, %xmm0
661; CHECK-NEXT:    pxor %xmm1, %xmm1
662; CHECK-NEXT:    pcmpeqd %xmm1, %xmm0
663; CHECK-NEXT:    retq
664  %yy = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y
665  %zz = lshr <4 x i32> <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>, %z
666  %d = select <4 x i1> %c, <4 x i32> %yy, <4 x i32> %zz
667  %and = and <4 x i32> %x, %d
668  %r = icmp ne <4 x i32> %and, %d
669  ret <4 x i1> %r
670}
671
672define <4 x i1> @pow2_vselect_fail0_ne(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
673; CHECK-LABEL: pow2_vselect_fail0_ne:
674; CHECK:       # %bb.0:
675; CHECK-NEXT:    pslld $31, %xmm0
676; CHECK-NEXT:    psrad $31, %xmm0
677; CHECK-NEXT:    pslld $23, %xmm2
678; CHECK-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
679; CHECK-NEXT:    cvttps2dq %xmm2, %xmm2
680; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
681; CHECK-NEXT:    movdqa {{.*#+}} xmm5 = [1073741824,1073741824,1073741824,1073741824]
682; CHECK-NEXT:    movdqa %xmm5, %xmm6
683; CHECK-NEXT:    psrld %xmm4, %xmm6
684; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[0,1,1,1,4,5,6,7]
685; CHECK-NEXT:    movdqa %xmm5, %xmm7
686; CHECK-NEXT:    psrld %xmm4, %xmm7
687; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm7 = xmm7[0],xmm6[0]
688; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
689; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
690; CHECK-NEXT:    movdqa %xmm5, %xmm6
691; CHECK-NEXT:    psrld %xmm4, %xmm6
692; CHECK-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
693; CHECK-NEXT:    psrld %xmm3, %xmm5
694; CHECK-NEXT:    punpckhqdq {{.*#+}} xmm5 = xmm5[1],xmm6[1]
695; CHECK-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,3],xmm5[0,3]
696; CHECK-NEXT:    pand %xmm0, %xmm2
697; CHECK-NEXT:    pandn %xmm7, %xmm0
698; CHECK-NEXT:    por %xmm2, %xmm0
699; CHECK-NEXT:    pcmpeqd %xmm2, %xmm2
700; CHECK-NEXT:    pand %xmm0, %xmm1
701; CHECK-NEXT:    pcmpeqd %xmm1, %xmm0
702; CHECK-NEXT:    pxor %xmm2, %xmm0
703; CHECK-NEXT:    retq
704  %yy = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y
705  %zz = lshr <4 x i32> <i32 1073741824, i32 1073741824, i32 1073741824, i32 1073741824>, %z
706  %d = select <4 x i1> %c, <4 x i32> %yy, <4 x i32> %zz
707  %and = and <4 x i32> %x, %d
708  %r = icmp ne <4 x i32> %and, %d
709  ret <4 x i1> %r
710}
711
712define <4 x i1> @pow2_vselect_fail2_ne(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y, <4 x i32> %z) {
713; CHECK-LABEL: pow2_vselect_fail2_ne:
714; CHECK:       # %bb.0:
715; CHECK-NEXT:    pslld $31, %xmm0
716; CHECK-NEXT:    psrad $31, %xmm0
717; CHECK-NEXT:    pslld $23, %xmm2
718; CHECK-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
719; CHECK-NEXT:    cvttps2dq %xmm2, %xmm2
720; CHECK-NEXT:    movdqa {{.*#+}} xmm4 = [4,4,4,4]
721; CHECK-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
722; CHECK-NEXT:    pmuludq %xmm4, %xmm2
723; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
724; CHECK-NEXT:    pmuludq %xmm4, %xmm5
725; CHECK-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3]
726; CHECK-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
727; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
728; CHECK-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
729; CHECK-NEXT:    movdqa %xmm5, %xmm6
730; CHECK-NEXT:    psrld %xmm4, %xmm6
731; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[0,1,1,1,4,5,6,7]
732; CHECK-NEXT:    movdqa %xmm5, %xmm7
733; CHECK-NEXT:    psrld %xmm4, %xmm7
734; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm7 = xmm7[0],xmm6[0]
735; CHECK-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
736; CHECK-NEXT:    pshuflw {{.*#+}} xmm4 = xmm3[2,3,3,3,4,5,6,7]
737; CHECK-NEXT:    movdqa %xmm5, %xmm6
738; CHECK-NEXT:    psrld %xmm4, %xmm6
739; CHECK-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,1,1,4,5,6,7]
740; CHECK-NEXT:    psrld %xmm3, %xmm5
741; CHECK-NEXT:    punpckhqdq {{.*#+}} xmm5 = xmm5[1],xmm6[1]
742; CHECK-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,3],xmm5[0,3]
743; CHECK-NEXT:    pand %xmm0, %xmm2
744; CHECK-NEXT:    pandn %xmm7, %xmm0
745; CHECK-NEXT:    por %xmm2, %xmm0
746; CHECK-NEXT:    pcmpeqd %xmm2, %xmm2
747; CHECK-NEXT:    pand %xmm0, %xmm1
748; CHECK-NEXT:    pcmpeqd %xmm1, %xmm0
749; CHECK-NEXT:    pxor %xmm2, %xmm0
750; CHECK-NEXT:    retq
751  %yy = shl <4 x i32> <i32 4, i32 4, i32 4, i32 4>, %y
752  %zz = lshr <4 x i32> <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>, %z
753  %d = select <4 x i1> %c, <4 x i32> %yy, <4 x i32> %zz
754  %and = and <4 x i32> %x, %d
755  %r = icmp ne <4 x i32> %and, %d
756  ret <4 x i1> %r
757}
758
759define i1 @pow2_and(i32 %x, i32 %y) {
760; CHECK-LABEL: pow2_and:
761; CHECK:       # %bb.0:
762; CHECK-NEXT:    movl %esi, %ecx
763; CHECK-NEXT:    movl $4, %eax
764; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
765; CHECK-NEXT:    shll %cl, %eax
766; CHECK-NEXT:    movl %eax, %ecx
767; CHECK-NEXT:    negl %ecx
768; CHECK-NEXT:    andl %eax, %ecx
769; CHECK-NEXT:    testl %ecx, %edi
770; CHECK-NEXT:    setne %al
771; CHECK-NEXT:    retq
772  %yy = shl nuw nsw i32 4, %y
773  %nyy = sub i32 0, %yy
774  %d = and i32 %yy, %nyy
775  %and = and i32 %x, %d
776  %r = icmp eq i32 %and, %d
777  ret i1 %r
778}
779
780define i1 @pow2_and_fail0(i32 %x, i32 %y) {
781; CHECK-LABEL: pow2_and_fail0:
782; CHECK:       # %bb.0:
783; CHECK-NEXT:    movl %esi, %ecx
784; CHECK-NEXT:    movl $4, %eax
785; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
786; CHECK-NEXT:    shll %cl, %eax
787; CHECK-NEXT:    movl %eax, %ecx
788; CHECK-NEXT:    negl %ecx
789; CHECK-NEXT:    andl %eax, %ecx
790; CHECK-NEXT:    notl %edi
791; CHECK-NEXT:    testl %edi, %ecx
792; CHECK-NEXT:    sete %al
793; CHECK-NEXT:    retq
794  %yy = shl i32 4, %y
795  %nyy = sub i32 0, %yy
796  %d = and i32 %yy, %nyy
797  %and = and i32 %x, %d
798  %r = icmp eq i32 %and, %d
799  ret i1 %r
800}
801
802define i1 @pow2_and_fail1(i32 %x, i32 %y) {
803; CHECK-LABEL: pow2_and_fail1:
804; CHECK:       # %bb.0:
805; CHECK-NEXT:    movl %esi, %ecx
806; CHECK-NEXT:    movl $1, %eax
807; CHECK-NEXT:    movl $1, %edx
808; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
809; CHECK-NEXT:    shll %cl, %edx
810; CHECK-NEXT:    subl %edx, %eax
811; CHECK-NEXT:    andl %edx, %eax
812; CHECK-NEXT:    notl %edi
813; CHECK-NEXT:    testl %edi, %eax
814; CHECK-NEXT:    sete %al
815; CHECK-NEXT:    retq
816  %yy = shl i32 1, %y
817  %nyy = sub i32 1, %yy
818  %d = and i32 %yy, %nyy
819  %and = and i32 %x, %d
820  %r = icmp eq i32 %and, %d
821  ret i1 %r
822}
823
824define i1 @pow2_and_fail2(i32 %x, i32 %y, i32 %z) {
825; CHECK-LABEL: pow2_and_fail2:
826; CHECK:       # %bb.0:
827; CHECK-NEXT:    movl %esi, %ecx
828; CHECK-NEXT:    movl $1, %eax
829; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
830; CHECK-NEXT:    shll %cl, %eax
831; CHECK-NEXT:    andl %edx, %eax
832; CHECK-NEXT:    notl %edi
833; CHECK-NEXT:    testl %edi, %eax
834; CHECK-NEXT:    sete %al
835; CHECK-NEXT:    retq
836  %yy = shl i32 1, %y
837  %d = and i32 %yy, %z
838  %and = and i32 %x, %d
839  %r = icmp eq i32 %and, %d
840  ret i1 %r
841}
842
843define i1 @pow2_though_zext(i32 %x, i16 %y) {
844; CHECK-LABEL: pow2_though_zext:
845; CHECK:       # %bb.0:
846; CHECK-NEXT:    movl %esi, %ecx
847; CHECK-NEXT:    movl $4, %eax
848; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
849; CHECK-NEXT:    shll %cl, %eax
850; CHECK-NEXT:    andl %edi, %eax
851; CHECK-NEXT:    testl $65535, %eax # imm = 0xFFFF
852; CHECK-NEXT:    setne %al
853; CHECK-NEXT:    retq
854  %dd = shl nuw nsw i16 4, %y
855  %d = zext i16 %dd to i32
856  %and = and i32 %x, %d
857  %r = icmp eq i32 %and, %d
858  ret i1 %r
859}
860