and.ll revision 4daaebf170a1b39bf3c2d43a690ceb94165708f3
1; This test makes sure that these instructions are properly eliminated.
2;
3
4; RUN: as < %s | opt -instcombine | dis | not grep and
5
6implementation
7
8int %test1(int %A) {
9	%B = and int %A, 0     ; zero result
10	ret int %B
11}
12
13int %test2(int %A) {
14	%B = and int %A, -1    ; noop
15	ret int %B
16}
17
18bool %test3(bool %A) {
19	%B = and bool %A, false  ; always = false
20	ret bool %B
21}
22
23bool %test4(bool %A) {
24	%B = and bool %A, true  ; noop
25	ret bool %B
26}
27
28int %test5(int %A) {
29	%B = and int %A, %A
30	ret int %B
31}
32
33bool %test6(bool %A) {
34	%B = and bool %A, %A
35	ret bool %B
36}
37
38int %test7(int %A) {         ; A & ~A == 0
39        %NotA = xor int %A, -1
40        %B = and int %A, %NotA
41        ret int %B
42}
43
44ubyte %test8(ubyte %A) {    ; AND associates
45	%B = and ubyte %A, 3
46	%C = and ubyte %B, 4
47	ret ubyte %C
48}
49
50bool %test9(int %A) {
51	%B = and int %A, -2147483648   ; Test of sign bit, convert to setle %A, 0 
52	%C = cast int %B to bool
53	ret bool %C
54}
55
56bool %test9(uint %A) {
57	%B = and uint %A, 2147483648   ; Test of sign bit, convert to setle %A, 0 
58	%C = cast uint %B to bool
59	ret bool %C
60}
61
62uint %test10(uint %A) {
63	%B = and uint %A, 12
64	%C = xor uint %B, 15
65	%D = and uint %C, 1   ; (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
66	ret uint %D
67}
68
69uint %test11(uint %A, uint* %P) {
70	%B = or uint %A, 3
71	%C = xor uint %B, 12
72	store uint %C, uint* %P    ; additional use of C
73	%D = and uint %C, 3        ; %C = and uint %B, 3 --> 3
74	ret uint %D
75}
76
77
78