and.ll revision b80e3ada7b15ae299dabe21bef0f06adbf0eb077
1; This test makes sure that these instructions are properly eliminated.
2;
3
4; RUN: llvm-as < %s | opt -instcombine | llvm-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 = setne int %B, 0
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 = setne uint %B, 0
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
77bool %test12(uint %A, uint %B) {
78	%C1 = setlt uint %A, %B
79	%C2 = setle uint %A, %B
80	%D = and bool %C1, %C2      ; (A < B) & (A <= B) === (A < B)
81	ret bool %D
82}
83
84bool %test13(uint %A, uint %B) {
85	%C1 = setlt uint %A, %B
86	%C2 = setgt uint %A, %B
87	%D = and bool %C1, %C2      ; (A < B) & (A > B) === false
88	ret bool %D
89}
90
91bool %test14(ubyte %A) {
92	%B = and ubyte %A, 128
93	%C = setne ubyte %B, 0
94	ret bool %C
95}
96
97ubyte %test15(ubyte %A) {
98	%B = shr ubyte %A, ubyte 7
99	%C = and ubyte %B, 2        ; Always equals zero
100	ret ubyte %C
101}
102
103ubyte %test16(ubyte %A) {
104	%B = shl ubyte %A, ubyte 2
105	%C = and ubyte %B, 3
106	ret ubyte %C
107}
108
109sbyte %test17(sbyte %X, sbyte %Y) { ;; ~(~X & Y) --> (X | ~Y)
110	%B = xor sbyte %X, -1
111	%C = and sbyte %B, %Y
112        %D = xor sbyte %C, -1
113	ret sbyte %D
114}
115
116