1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
3
4define void @test64(i64 inreg %x) {
5; CHECK-LABEL: test64:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
8; CHECK-NEXT:    jne .LBB0_2
9; CHECK-NEXT:  # %bb.1: # %yes
10; CHECK-NEXT:    pushq %rax
11; CHECK-NEXT:    .cfi_def_cfa_offset 16
12; CHECK-NEXT:    callq bar@PLT
13; CHECK-NEXT:    popq %rax
14; CHECK-NEXT:    .cfi_def_cfa_offset 8
15; CHECK-NEXT:  .LBB0_2: # %no
16; CHECK-NEXT:    retq
17  %t = and i64 %x, 2048
18  %s = icmp eq i64 %t, 0
19  br i1 %s, label %yes, label %no
20
21yes:
22  call void @bar()
23  ret void
24no:
25  ret void
26}
27
28define void @test64_optsize(i64 inreg %x) optsize {
29; CHECK-LABEL: test64_optsize:
30; CHECK:       # %bb.0:
31; CHECK-NEXT:    btl $11, %edi
32; CHECK-NEXT:    jb .LBB1_2
33; CHECK-NEXT:  # %bb.1: # %yes
34; CHECK-NEXT:    pushq %rax
35; CHECK-NEXT:    .cfi_def_cfa_offset 16
36; CHECK-NEXT:    callq bar@PLT
37; CHECK-NEXT:    popq %rax
38; CHECK-NEXT:    .cfi_def_cfa_offset 8
39; CHECK-NEXT:  .LBB1_2: # %no
40; CHECK-NEXT:    retq
41  %t = and i64 %x, 2048
42  %s = icmp eq i64 %t, 0
43  br i1 %s, label %yes, label %no
44
45yes:
46  call void @bar()
47  ret void
48no:
49  ret void
50}
51
52define void @test64_pgso(i64 inreg %x) !prof !14 {
53; CHECK-LABEL: test64_pgso:
54; CHECK:       # %bb.0:
55; CHECK-NEXT:    btl $11, %edi
56; CHECK-NEXT:    jb .LBB2_2
57; CHECK-NEXT:  # %bb.1: # %yes
58; CHECK-NEXT:    pushq %rax
59; CHECK-NEXT:    .cfi_def_cfa_offset 16
60; CHECK-NEXT:    callq bar@PLT
61; CHECK-NEXT:    popq %rax
62; CHECK-NEXT:    .cfi_def_cfa_offset 8
63; CHECK-NEXT:  .LBB2_2: # %no
64; CHECK-NEXT:    retq
65  %t = and i64 %x, 2048
66  %s = icmp eq i64 %t, 0
67  br i1 %s, label %yes, label %no
68
69yes:
70  call void @bar()
71  ret void
72no:
73  ret void
74}
75
76; This test is identical to test64 above with only the destination of the br
77; reversed. This somehow causes the two functions to get slightly different
78; initial IR. One has an extra invert of the setcc. This previous caused one
79; the functions to use a BT while the other used a TEST due to another DAG
80; combine messing with an expected canonical form.
81define void @test64_2(i64 inreg %x) {
82; CHECK-LABEL: test64_2:
83; CHECK:       # %bb.0:
84; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
85; CHECK-NEXT:    je .LBB3_2
86; CHECK-NEXT:  # %bb.1: # %yes
87; CHECK-NEXT:    pushq %rax
88; CHECK-NEXT:    .cfi_def_cfa_offset 16
89; CHECK-NEXT:    callq bar@PLT
90; CHECK-NEXT:    popq %rax
91; CHECK-NEXT:    .cfi_def_cfa_offset 8
92; CHECK-NEXT:  .LBB3_2: # %no
93; CHECK-NEXT:    retq
94  %t = and i64 %x, 2048
95  %s = icmp eq i64 %t, 0
96  br i1 %s, label %no, label %yes
97
98yes:
99  call void @bar()
100  ret void
101no:
102  ret void
103}
104
105define void @test64_optsize_2(i64 inreg %x) optsize {
106; CHECK-LABEL: test64_optsize_2:
107; CHECK:       # %bb.0:
108; CHECK-NEXT:    btl $11, %edi
109; CHECK-NEXT:    jae .LBB4_2
110; CHECK-NEXT:  # %bb.1: # %yes
111; CHECK-NEXT:    pushq %rax
112; CHECK-NEXT:    .cfi_def_cfa_offset 16
113; CHECK-NEXT:    callq bar@PLT
114; CHECK-NEXT:    popq %rax
115; CHECK-NEXT:    .cfi_def_cfa_offset 8
116; CHECK-NEXT:  .LBB4_2: # %no
117; CHECK-NEXT:    retq
118  %t = and i64 %x, 2048
119  %s = icmp eq i64 %t, 0
120  br i1 %s, label %no, label %yes
121
122yes:
123  call void @bar()
124  ret void
125no:
126  ret void
127}
128
129define void @test64_pgso_2(i64 inreg %x) !prof !14 {
130; CHECK-LABEL: test64_pgso_2:
131; CHECK:       # %bb.0:
132; CHECK-NEXT:    btl $11, %edi
133; CHECK-NEXT:    jae .LBB5_2
134; CHECK-NEXT:  # %bb.1: # %yes
135; CHECK-NEXT:    pushq %rax
136; CHECK-NEXT:    .cfi_def_cfa_offset 16
137; CHECK-NEXT:    callq bar@PLT
138; CHECK-NEXT:    popq %rax
139; CHECK-NEXT:    .cfi_def_cfa_offset 8
140; CHECK-NEXT:  .LBB5_2: # %no
141; CHECK-NEXT:    retq
142  %t = and i64 %x, 2048
143  %s = icmp eq i64 %t, 0
144  br i1 %s, label %no, label %yes
145
146yes:
147  call void @bar()
148  ret void
149no:
150  ret void
151}
152
153define void @test64_3(i64 inreg %x) {
154; CHECK-LABEL: test64_3:
155; CHECK:       # %bb.0:
156; CHECK-NEXT:    btq $32, %rdi
157; CHECK-NEXT:    jb .LBB6_2
158; CHECK-NEXT:  # %bb.1: # %yes
159; CHECK-NEXT:    pushq %rax
160; CHECK-NEXT:    .cfi_def_cfa_offset 16
161; CHECK-NEXT:    callq bar@PLT
162; CHECK-NEXT:    popq %rax
163; CHECK-NEXT:    .cfi_def_cfa_offset 8
164; CHECK-NEXT:  .LBB6_2: # %no
165; CHECK-NEXT:    retq
166  %t = and i64 %x, 4294967296
167  %s = icmp eq i64 %t, 0
168  br i1 %s, label %yes, label %no
169
170yes:
171  call void @bar()
172  ret void
173no:
174  ret void
175}
176
177define void @test64_optsize_3(i64 inreg %x) optsize {
178; CHECK-LABEL: test64_optsize_3:
179; CHECK:       # %bb.0:
180; CHECK-NEXT:    btq $32, %rdi
181; CHECK-NEXT:    jb .LBB7_2
182; CHECK-NEXT:  # %bb.1: # %yes
183; CHECK-NEXT:    pushq %rax
184; CHECK-NEXT:    .cfi_def_cfa_offset 16
185; CHECK-NEXT:    callq bar@PLT
186; CHECK-NEXT:    popq %rax
187; CHECK-NEXT:    .cfi_def_cfa_offset 8
188; CHECK-NEXT:  .LBB7_2: # %no
189; CHECK-NEXT:    retq
190  %t = and i64 %x, 4294967296
191  %s = icmp eq i64 %t, 0
192  br i1 %s, label %yes, label %no
193
194yes:
195  call void @bar()
196  ret void
197no:
198  ret void
199}
200
201define void @test64_pgso_3(i64 inreg %x) !prof !14 {
202; CHECK-LABEL: test64_pgso_3:
203; CHECK:       # %bb.0:
204; CHECK-NEXT:    btq $32, %rdi
205; CHECK-NEXT:    jb .LBB8_2
206; CHECK-NEXT:  # %bb.1: # %yes
207; CHECK-NEXT:    pushq %rax
208; CHECK-NEXT:    .cfi_def_cfa_offset 16
209; CHECK-NEXT:    callq bar@PLT
210; CHECK-NEXT:    popq %rax
211; CHECK-NEXT:    .cfi_def_cfa_offset 8
212; CHECK-NEXT:  .LBB8_2: # %no
213; CHECK-NEXT:    retq
214  %t = and i64 %x, 4294967296
215  %s = icmp eq i64 %t, 0
216  br i1 %s, label %yes, label %no
217
218yes:
219  call void @bar()
220  ret void
221no:
222  ret void
223}
224
225define void @test64_4(i64 inreg %x) {
226; CHECK-LABEL: test64_4:
227; CHECK:       # %bb.0:
228; CHECK-NEXT:    btq $32, %rdi
229; CHECK-NEXT:    jae .LBB9_2
230; CHECK-NEXT:  # %bb.1: # %yes
231; CHECK-NEXT:    pushq %rax
232; CHECK-NEXT:    .cfi_def_cfa_offset 16
233; CHECK-NEXT:    callq bar@PLT
234; CHECK-NEXT:    popq %rax
235; CHECK-NEXT:    .cfi_def_cfa_offset 8
236; CHECK-NEXT:  .LBB9_2: # %no
237; CHECK-NEXT:    retq
238  %t = and i64 %x, 4294967296
239  %s = icmp eq i64 %t, 0
240  br i1 %s, label %no, label %yes
241
242yes:
243  call void @bar()
244  ret void
245no:
246  ret void
247}
248
249define void @test64_optsize_4(i64 inreg %x) optsize {
250; CHECK-LABEL: test64_optsize_4:
251; CHECK:       # %bb.0:
252; CHECK-NEXT:    btq $32, %rdi
253; CHECK-NEXT:    jae .LBB10_2
254; CHECK-NEXT:  # %bb.1: # %yes
255; CHECK-NEXT:    pushq %rax
256; CHECK-NEXT:    .cfi_def_cfa_offset 16
257; CHECK-NEXT:    callq bar@PLT
258; CHECK-NEXT:    popq %rax
259; CHECK-NEXT:    .cfi_def_cfa_offset 8
260; CHECK-NEXT:  .LBB10_2: # %no
261; CHECK-NEXT:    retq
262  %t = and i64 %x, 4294967296
263  %s = icmp eq i64 %t, 0
264  br i1 %s, label %no, label %yes
265
266yes:
267  call void @bar()
268  ret void
269no:
270  ret void
271}
272
273define void @test64_pgso_4(i64 inreg %x) !prof !14 {
274; CHECK-LABEL: test64_pgso_4:
275; CHECK:       # %bb.0:
276; CHECK-NEXT:    btq $32, %rdi
277; CHECK-NEXT:    jae .LBB11_2
278; CHECK-NEXT:  # %bb.1: # %yes
279; CHECK-NEXT:    pushq %rax
280; CHECK-NEXT:    .cfi_def_cfa_offset 16
281; CHECK-NEXT:    callq bar@PLT
282; CHECK-NEXT:    popq %rax
283; CHECK-NEXT:    .cfi_def_cfa_offset 8
284; CHECK-NEXT:  .LBB11_2: # %no
285; CHECK-NEXT:    retq
286  %t = and i64 %x, 4294967296
287  %s = icmp eq i64 %t, 0
288  br i1 %s, label %no, label %yes
289
290yes:
291  call void @bar()
292  ret void
293no:
294  ret void
295}
296
297define void @test32(i32 inreg %x) {
298; CHECK-LABEL: test32:
299; CHECK:       # %bb.0:
300; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
301; CHECK-NEXT:    jne .LBB12_2
302; CHECK-NEXT:  # %bb.1: # %yes
303; CHECK-NEXT:    pushq %rax
304; CHECK-NEXT:    .cfi_def_cfa_offset 16
305; CHECK-NEXT:    callq bar@PLT
306; CHECK-NEXT:    popq %rax
307; CHECK-NEXT:    .cfi_def_cfa_offset 8
308; CHECK-NEXT:  .LBB12_2: # %no
309; CHECK-NEXT:    retq
310  %t = and i32 %x, 2048
311  %s = icmp eq i32 %t, 0
312  br i1 %s, label %yes, label %no
313
314yes:
315  call void @bar()
316  ret void
317no:
318  ret void
319}
320
321define void @test32_optsize(i32 inreg %x) optsize {
322; CHECK-LABEL: test32_optsize:
323; CHECK:       # %bb.0:
324; CHECK-NEXT:    btl $11, %edi
325; CHECK-NEXT:    jb .LBB13_2
326; CHECK-NEXT:  # %bb.1: # %yes
327; CHECK-NEXT:    pushq %rax
328; CHECK-NEXT:    .cfi_def_cfa_offset 16
329; CHECK-NEXT:    callq bar@PLT
330; CHECK-NEXT:    popq %rax
331; CHECK-NEXT:    .cfi_def_cfa_offset 8
332; CHECK-NEXT:  .LBB13_2: # %no
333; CHECK-NEXT:    retq
334  %t = and i32 %x, 2048
335  %s = icmp eq i32 %t, 0
336  br i1 %s, label %yes, label %no
337
338yes:
339  call void @bar()
340  ret void
341no:
342  ret void
343}
344
345define void @test32_2(i32 inreg %x) {
346; CHECK-LABEL: test32_2:
347; CHECK:       # %bb.0:
348; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
349; CHECK-NEXT:    je .LBB14_2
350; CHECK-NEXT:  # %bb.1: # %yes
351; CHECK-NEXT:    pushq %rax
352; CHECK-NEXT:    .cfi_def_cfa_offset 16
353; CHECK-NEXT:    callq bar@PLT
354; CHECK-NEXT:    popq %rax
355; CHECK-NEXT:    .cfi_def_cfa_offset 8
356; CHECK-NEXT:  .LBB14_2: # %no
357; CHECK-NEXT:    retq
358  %t = and i32 %x, 2048
359  %s = icmp eq i32 %t, 0
360  br i1 %s, label %no, label %yes
361
362yes:
363  call void @bar()
364  ret void
365no:
366  ret void
367}
368
369define void @test32_optsize_2(i32 inreg %x) optsize {
370; CHECK-LABEL: test32_optsize_2:
371; CHECK:       # %bb.0:
372; CHECK-NEXT:    btl $11, %edi
373; CHECK-NEXT:    jae .LBB15_2
374; CHECK-NEXT:  # %bb.1: # %yes
375; CHECK-NEXT:    pushq %rax
376; CHECK-NEXT:    .cfi_def_cfa_offset 16
377; CHECK-NEXT:    callq bar@PLT
378; CHECK-NEXT:    popq %rax
379; CHECK-NEXT:    .cfi_def_cfa_offset 8
380; CHECK-NEXT:  .LBB15_2: # %no
381; CHECK-NEXT:    retq
382  %t = and i32 %x, 2048
383  %s = icmp eq i32 %t, 0
384  br i1 %s, label %no, label %yes
385
386yes:
387  call void @bar()
388  ret void
389no:
390  ret void
391}
392
393define void @test32_pgso_2(i32 inreg %x) !prof !14 {
394; CHECK-LABEL: test32_pgso_2:
395; CHECK:       # %bb.0:
396; CHECK-NEXT:    btl $11, %edi
397; CHECK-NEXT:    jae .LBB16_2
398; CHECK-NEXT:  # %bb.1: # %yes
399; CHECK-NEXT:    pushq %rax
400; CHECK-NEXT:    .cfi_def_cfa_offset 16
401; CHECK-NEXT:    callq bar@PLT
402; CHECK-NEXT:    popq %rax
403; CHECK-NEXT:    .cfi_def_cfa_offset 8
404; CHECK-NEXT:  .LBB16_2: # %no
405; CHECK-NEXT:    retq
406  %t = and i32 %x, 2048
407  %s = icmp eq i32 %t, 0
408  br i1 %s, label %no, label %yes
409
410yes:
411  call void @bar()
412  ret void
413no:
414  ret void
415}
416
417define void @test16(i16 inreg %x) {
418; CHECK-LABEL: test16:
419; CHECK:       # %bb.0:
420; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
421; CHECK-NEXT:    jne .LBB17_2
422; CHECK-NEXT:  # %bb.1: # %yes
423; CHECK-NEXT:    pushq %rax
424; CHECK-NEXT:    .cfi_def_cfa_offset 16
425; CHECK-NEXT:    callq bar@PLT
426; CHECK-NEXT:    popq %rax
427; CHECK-NEXT:    .cfi_def_cfa_offset 8
428; CHECK-NEXT:  .LBB17_2: # %no
429; CHECK-NEXT:    retq
430  %t = and i16 %x, 2048
431  %s = icmp eq i16 %t, 0
432  br i1 %s, label %yes, label %no
433
434yes:
435  call void @bar()
436  ret void
437no:
438  ret void
439}
440
441define void @test16_optsize(i16 inreg %x) optsize {
442; CHECK-LABEL: test16_optsize:
443; CHECK:       # %bb.0:
444; CHECK-NEXT:    btl $11, %edi
445; CHECK-NEXT:    jb .LBB18_2
446; CHECK-NEXT:  # %bb.1: # %yes
447; CHECK-NEXT:    pushq %rax
448; CHECK-NEXT:    .cfi_def_cfa_offset 16
449; CHECK-NEXT:    callq bar@PLT
450; CHECK-NEXT:    popq %rax
451; CHECK-NEXT:    .cfi_def_cfa_offset 8
452; CHECK-NEXT:  .LBB18_2: # %no
453; CHECK-NEXT:    retq
454  %t = and i16 %x, 2048
455  %s = icmp eq i16 %t, 0
456  br i1 %s, label %yes, label %no
457
458yes:
459  call void @bar()
460  ret void
461no:
462  ret void
463}
464
465define void @test16_pgso(i16 inreg %x) !prof !14 {
466; CHECK-LABEL: test16_pgso:
467; CHECK:       # %bb.0:
468; CHECK-NEXT:    btl $11, %edi
469; CHECK-NEXT:    jb .LBB19_2
470; CHECK-NEXT:  # %bb.1: # %yes
471; CHECK-NEXT:    pushq %rax
472; CHECK-NEXT:    .cfi_def_cfa_offset 16
473; CHECK-NEXT:    callq bar@PLT
474; CHECK-NEXT:    popq %rax
475; CHECK-NEXT:    .cfi_def_cfa_offset 8
476; CHECK-NEXT:  .LBB19_2: # %no
477; CHECK-NEXT:    retq
478  %t = and i16 %x, 2048
479  %s = icmp eq i16 %t, 0
480  br i1 %s, label %yes, label %no
481
482yes:
483  call void @bar()
484  ret void
485no:
486  ret void
487}
488
489define void @test16_2(i16 inreg %x) {
490; CHECK-LABEL: test16_2:
491; CHECK:       # %bb.0:
492; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
493; CHECK-NEXT:    je .LBB20_2
494; CHECK-NEXT:  # %bb.1: # %yes
495; CHECK-NEXT:    pushq %rax
496; CHECK-NEXT:    .cfi_def_cfa_offset 16
497; CHECK-NEXT:    callq bar@PLT
498; CHECK-NEXT:    popq %rax
499; CHECK-NEXT:    .cfi_def_cfa_offset 8
500; CHECK-NEXT:  .LBB20_2: # %no
501; CHECK-NEXT:    retq
502  %t = and i16 %x, 2048
503  %s = icmp eq i16 %t, 0
504  br i1 %s, label %no, label %yes
505
506yes:
507  call void @bar()
508  ret void
509no:
510  ret void
511}
512
513define void @test16_optsize_2(i16 inreg %x) optsize {
514; CHECK-LABEL: test16_optsize_2:
515; CHECK:       # %bb.0:
516; CHECK-NEXT:    btl $11, %edi
517; CHECK-NEXT:    jae .LBB21_2
518; CHECK-NEXT:  # %bb.1: # %yes
519; CHECK-NEXT:    pushq %rax
520; CHECK-NEXT:    .cfi_def_cfa_offset 16
521; CHECK-NEXT:    callq bar@PLT
522; CHECK-NEXT:    popq %rax
523; CHECK-NEXT:    .cfi_def_cfa_offset 8
524; CHECK-NEXT:  .LBB21_2: # %no
525; CHECK-NEXT:    retq
526  %t = and i16 %x, 2048
527  %s = icmp eq i16 %t, 0
528  br i1 %s, label %no, label %yes
529
530yes:
531  call void @bar()
532  ret void
533no:
534  ret void
535}
536
537define void @test16_pgso_2(i16 inreg %x) !prof !14 {
538; CHECK-LABEL: test16_pgso_2:
539; CHECK:       # %bb.0:
540; CHECK-NEXT:    btl $11, %edi
541; CHECK-NEXT:    jae .LBB22_2
542; CHECK-NEXT:  # %bb.1: # %yes
543; CHECK-NEXT:    pushq %rax
544; CHECK-NEXT:    .cfi_def_cfa_offset 16
545; CHECK-NEXT:    callq bar@PLT
546; CHECK-NEXT:    popq %rax
547; CHECK-NEXT:    .cfi_def_cfa_offset 8
548; CHECK-NEXT:  .LBB22_2: # %no
549; CHECK-NEXT:    retq
550  %t = and i16 %x, 2048
551  %s = icmp eq i16 %t, 0
552  br i1 %s, label %no, label %yes
553
554yes:
555  call void @bar()
556  ret void
557no:
558  ret void
559}
560
561define i64 @is_upper_bit_clear_i64(i64 %x) {
562; CHECK-LABEL: is_upper_bit_clear_i64:
563; CHECK:       # %bb.0:
564; CHECK-NEXT:    xorl %eax, %eax
565; CHECK-NEXT:    btq $37, %rdi
566; CHECK-NEXT:    setae %al
567; CHECK-NEXT:    retq
568  %sh = lshr i64 %x, 37
569  %m = and i64 %sh, 1
570  %r = xor i64 %m, 1
571  ret i64 %r
572}
573
574define i64 @is_lower_bit_clear_i64(i64 %x) {
575; CHECK-LABEL: is_lower_bit_clear_i64:
576; CHECK:       # %bb.0:
577; CHECK-NEXT:    xorl %eax, %eax
578; CHECK-NEXT:    testl $134217728, %edi # imm = 0x8000000
579; CHECK-NEXT:    sete %al
580; CHECK-NEXT:    retq
581  %sh = lshr i64 %x, 27
582  %m = and i64 %sh, 1
583  %r = xor i64 %m, 1
584  ret i64 %r
585}
586
587define i32 @is_bit_clear_i32(i32 %x) {
588; CHECK-LABEL: is_bit_clear_i32:
589; CHECK:       # %bb.0:
590; CHECK-NEXT:    xorl %eax, %eax
591; CHECK-NEXT:    testl $134217728, %edi # imm = 0x8000000
592; CHECK-NEXT:    sete %al
593; CHECK-NEXT:    retq
594  %sh = lshr i32 %x, 27
595  %n = xor i32 %sh, -1
596  %r = and i32 %n, 1
597  ret i32 %r
598}
599
600define i16 @is_bit_clear_i16(i16 %x) {
601; CHECK-LABEL: is_bit_clear_i16:
602; CHECK:       # %bb.0:
603; CHECK-NEXT:    xorl %eax, %eax
604; CHECK-NEXT:    testb $-128, %dil
605; CHECK-NEXT:    sete %al
606; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
607; CHECK-NEXT:    retq
608  %sh = lshr i16 %x, 7
609  %m = and i16 %sh, 1
610  %r = xor i16 %m, 1
611  ret i16 %r
612}
613
614define i8 @is_bit_clear_i8(i8 %x) {
615; CHECK-LABEL: is_bit_clear_i8:
616; CHECK:       # %bb.0:
617; CHECK-NEXT:    testb $8, %dil
618; CHECK-NEXT:    sete %al
619; CHECK-NEXT:    retq
620  %sh = lshr i8 %x, 3
621  %m = and i8 %sh, 1
622  %r = xor i8 %m, 1
623  ret i8 %r
624}
625
626; TODO: We could use bt/test on the 64-bit value.
627
628define i8 @overshift(i64 %x) {
629; CHECK-LABEL: overshift:
630; CHECK:       # %bb.0:
631; CHECK-NEXT:    movq %rdi, %rax
632; CHECK-NEXT:    shrq $42, %rax
633; CHECK-NEXT:    notb %al
634; CHECK-NEXT:    andb $1, %al
635; CHECK-NEXT:    # kill: def $al killed $al killed $rax
636; CHECK-NEXT:    retq
637  %a = lshr i64 %x, 42
638  %t = trunc i64 %a to i8
639  %n = xor i8 %t, -1
640  %r = and i8 %n, 1
641  ret i8 %r
642}
643
644define i32 @setcc_is_bit_clear(i32 %x) {
645; CHECK-LABEL: setcc_is_bit_clear:
646; CHECK:       # %bb.0:
647; CHECK-NEXT:    xorl %eax, %eax
648; CHECK-NEXT:    testl $1024, %edi # imm = 0x400
649; CHECK-NEXT:    sete %al
650; CHECK-NEXT:    retq
651  %a1 = and i32 %x, 1024
652  %b1 = icmp eq i32 %a1, 0
653  %r = zext i1 %b1 to i32
654  ret i32 %r
655}
656
657define i32 @is_bit_set(i32 %x) {
658; CHECK-LABEL: is_bit_set:
659; CHECK:       # %bb.0:
660; CHECK-NEXT:    movl %edi, %eax
661; CHECK-NEXT:    shrl $10, %eax
662; CHECK-NEXT:    andl $1, %eax
663; CHECK-NEXT:    retq
664  %sh = lshr i32 %x, 10
665  %m = and i32 %sh, 1
666  ret i32 %m
667}
668
669define i32 @setcc_is_bit_set(i32 %x) {
670; CHECK-LABEL: setcc_is_bit_set:
671; CHECK:       # %bb.0:
672; CHECK-NEXT:    movl %edi, %eax
673; CHECK-NEXT:    shrl $10, %eax
674; CHECK-NEXT:    andl $1, %eax
675; CHECK-NEXT:    retq
676  %a1 = and i32 %x, 1024
677  %b1 = icmp ne i32 %a1, 0
678  %r = zext i1 %b1 to i32
679  ret i32 %r
680}
681
682declare void @bar()
683
684!llvm.module.flags = !{!0}
685!0 = !{i32 1, !"ProfileSummary", !1}
686!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
687!2 = !{!"ProfileFormat", !"InstrProf"}
688!3 = !{!"TotalCount", i64 10000}
689!4 = !{!"MaxCount", i64 10}
690!5 = !{!"MaxInternalCount", i64 1}
691!6 = !{!"MaxFunctionCount", i64 1000}
692!7 = !{!"NumCounts", i64 3}
693!8 = !{!"NumFunctions", i64 3}
694!9 = !{!"DetailedSummary", !10}
695!10 = !{!11, !12, !13}
696!11 = !{i32 10000, i64 100, i32 1}
697!12 = !{i32 999000, i64 100, i32 1}
698!13 = !{i32 999999, i64 1, i32 2}
699!14 = !{!"function_entry_count", i64 0}
700