blob: 8492df9a1209c00d14c21bf557a9f927516a89a6 [file] [log] [blame]
Chris Lattner74e95472002-05-06 05:43:36 +00001; This test makes sure that these instructions are properly eliminated.
2;
3
Dan Gohman72a13d22009-09-08 22:34:10 +00004; RUN: opt < %s -instcombine -S | not grep and
Chris Lattner74e95472002-05-06 05:43:36 +00005
Tanya Lattneraa6f5c92008-03-09 08:16:40 +00006define i32 @test1(i32 %A) {
7 ; zero result
8 %B = and i32 %A, 0 ; <i32> [#uses=1]
9 ret i32 %B
Chris Lattner74e95472002-05-06 05:43:36 +000010}
11
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000012define i32 @test2(i32 %A) {
13 ; noop
14 %B = and i32 %A, -1 ; <i32> [#uses=1]
15 ret i32 %B
Chris Lattner74e95472002-05-06 05:43:36 +000016}
17
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000018define i1 @test3(i1 %A) {
19 ; always = false
20 %B = and i1 %A, false ; <i1> [#uses=1]
21 ret i1 %B
Chris Lattner74e95472002-05-06 05:43:36 +000022}
23
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000024define i1 @test4(i1 %A) {
25 ; noop
26 %B = and i1 %A, true ; <i1> [#uses=1]
27 ret i1 %B
Chris Lattner74e95472002-05-06 05:43:36 +000028}
29
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000030define i32 @test5(i32 %A) {
31 %B = and i32 %A, %A ; <i32> [#uses=1]
32 ret i32 %B
Chris Lattner6022ad02002-05-06 05:51:26 +000033}
34
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000035define i1 @test6(i1 %A) {
36 %B = and i1 %A, %A ; <i1> [#uses=1]
37 ret i1 %B
Chris Lattner6022ad02002-05-06 05:51:26 +000038}
Chris Lattner74e95472002-05-06 05:43:36 +000039
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000040; A & ~A == 0
41define i32 @test7(i32 %A) {
42 %NotA = xor i32 %A, -1 ; <i32> [#uses=1]
43 %B = and i32 %A, %NotA ; <i32> [#uses=1]
44 ret i32 %B
Chris Lattnerf67d52d2003-03-10 22:43:56 +000045}
46
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000047; AND associates
48define i8 @test8(i8 %A) {
49 %B = and i8 %A, 3 ; <i8> [#uses=1]
50 %C = and i8 %B, 4 ; <i8> [#uses=1]
51 ret i8 %C
Chris Lattnerf67d52d2003-03-10 22:43:56 +000052}
Chris Lattnerdec13672003-03-10 23:52:54 +000053
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000054define i1 @test9(i32 %A) {
55 ; Test of sign bit, convert to setle %A, 0
56 %B = and i32 %A, -2147483648 ; <i32> [#uses=1]
57 %C = icmp ne i32 %B, 0 ; <i1> [#uses=1]
58 ret i1 %C
Chris Lattner9af98802003-07-22 21:44:06 +000059}
60
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000061define i1 @test9a(i32 %A) {
62 ; Test of sign bit, convert to setle %A, 0
63 %B = and i32 %A, -2147483648 ; <i32> [#uses=1]
64 %C = icmp ne i32 %B, 0 ; <i1> [#uses=1]
65 ret i1 %C
Chris Lattner9af98802003-07-22 21:44:06 +000066}
Chris Lattneraeef93c2003-07-23 17:56:34 +000067
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000068define i32 @test10(i32 %A) {
69 %B = and i32 %A, 12 ; <i32> [#uses=1]
70 %C = xor i32 %B, 15 ; <i32> [#uses=1]
71 ; (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
72 %D = and i32 %C, 1 ; <i32> [#uses=1]
73 ret i32 %D
Chris Lattneraeef93c2003-07-23 17:56:34 +000074}
Chris Lattnerb69f30c2003-07-23 19:35:51 +000075
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000076define i32 @test11(i32 %A, i32* %P) {
77 %B = or i32 %A, 3 ; <i32> [#uses=1]
78 %C = xor i32 %B, 12 ; <i32> [#uses=2]
79 ; additional use of C
80 store i32 %C, i32* %P
81 ; %C = and uint %B, 3 --> 3
82 %D = and i32 %C, 3 ; <i32> [#uses=1]
83 ret i32 %D
Chris Lattnerb69f30c2003-07-23 19:35:51 +000084}
85
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000086define i1 @test12(i32 %A, i32 %B) {
87 %C1 = icmp ult i32 %A, %B ; <i1> [#uses=1]
88 %C2 = icmp ule i32 %A, %B ; <i1> [#uses=1]
89 ; (A < B) & (A <= B) === (A < B)
90 %D = and i1 %C1, %C2 ; <i1> [#uses=1]
91 ret i1 %D
Chris Lattnerdaff6442003-07-24 19:44:51 +000092}
93
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000094define i1 @test13(i32 %A, i32 %B) {
95 %C1 = icmp ult i32 %A, %B ; <i1> [#uses=1]
96 %C2 = icmp ugt i32 %A, %B ; <i1> [#uses=1]
97 ; (A < B) & (A > B) === false
98 %D = and i1 %C1, %C2 ; <i1> [#uses=1]
99 ret i1 %D
Chris Lattnerdaff6442003-07-24 19:44:51 +0000100}
Chris Lattnerb69f30c2003-07-23 19:35:51 +0000101
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000102define i1 @test14(i8 %A) {
103 %B = and i8 %A, -128 ; <i8> [#uses=1]
104 %C = icmp ne i8 %B, 0 ; <i1> [#uses=1]
105 ret i1 %C
Chris Lattner9b741f12003-08-13 05:27:57 +0000106}
Chris Lattnerd441d402003-09-19 19:04:43 +0000107
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000108define i8 @test15(i8 %A) {
109 %B = lshr i8 %A, 7 ; <i8> [#uses=1]
110 ; Always equals zero
111 %C = and i8 %B, 2 ; <i8> [#uses=1]
112 ret i8 %C
Chris Lattnerd441d402003-09-19 19:04:43 +0000113}
114
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000115define i8 @test16(i8 %A) {
116 %B = shl i8 %A, 2 ; <i8> [#uses=1]
117 %C = and i8 %B, 3 ; <i8> [#uses=1]
118 ret i8 %C
Chris Lattnerd441d402003-09-19 19:04:43 +0000119}
Chris Lattnerd5829aa2004-06-18 06:07:17 +0000120
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000121;; ~(~X & Y) --> (X | ~Y)
122define i8 @test17(i8 %X, i8 %Y) {
123 %B = xor i8 %X, -1 ; <i8> [#uses=1]
124 %C = and i8 %B, %Y ; <i8> [#uses=1]
125 %D = xor i8 %C, -1 ; <i8> [#uses=1]
126 ret i8 %D
Chris Lattnerd5829aa2004-06-18 06:07:17 +0000127}
128
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000129define i1 @test18(i32 %A) {
130 %B = and i32 %A, -128 ; <i32> [#uses=1]
131 ;; C >= 128
132 %C = icmp ne i32 %B, 0 ; <i1> [#uses=1]
133 ret i1 %C
Chris Lattner45a5ace2004-09-23 21:42:49 +0000134}
135
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000136define i1 @test18a(i8 %A) {
137 %B = and i8 %A, -2 ; <i8> [#uses=1]
138 %C = icmp eq i8 %B, 0 ; <i1> [#uses=1]
139 ret i1 %C
Chris Lattner5f9319a2004-09-27 19:25:20 +0000140}
141
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000142define i32 @test19(i32 %A) {
143 %B = shl i32 %A, 3 ; <i32> [#uses=1]
144 ;; Clearing a zero bit
145 %C = and i32 %B, -2 ; <i32> [#uses=1]
146 ret i32 %C
Chris Lattner8c1c6912004-09-24 15:18:43 +0000147}
148
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000149define i8 @test20(i8 %A) {
150 %C = lshr i8 %A, 7 ; <i8> [#uses=1]
151 ;; Unneeded
152 %D = and i8 %C, 1 ; <i8> [#uses=1]
153 ret i8 %D
Chris Lattner8c1c6912004-09-24 15:18:43 +0000154}
155
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000156define i1 @test22(i32 %A) {
157 %B = icmp eq i32 %A, 1 ; <i1> [#uses=1]
158 %C = icmp sge i32 %A, 3 ; <i1> [#uses=1]
159 ;; false
160 %D = and i1 %B, %C ; <i1> [#uses=1]
161 ret i1 %D
Chris Lattner3cbcd252004-09-28 21:39:35 +0000162}
163
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000164define i1 @test23(i32 %A) {
165 %B = icmp sgt i32 %A, 1 ; <i1> [#uses=1]
166 %C = icmp sle i32 %A, 2 ; <i1> [#uses=1]
167 ;; A == 2
168 %D = and i1 %B, %C ; <i1> [#uses=1]
169 ret i1 %D
Chris Lattner3cbcd252004-09-28 21:39:35 +0000170}
171
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000172define i1 @test24(i32 %A) {
173 %B = icmp sgt i32 %A, 1 ; <i1> [#uses=1]
174 %C = icmp ne i32 %A, 2 ; <i1> [#uses=1]
175 ;; A > 2
176 %D = and i1 %B, %C ; <i1> [#uses=1]
177 ret i1 %D
Chris Lattner3cbcd252004-09-28 21:39:35 +0000178}
179
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000180define i1 @test25(i32 %A) {
181 %B = icmp sge i32 %A, 50 ; <i1> [#uses=1]
182 %C = icmp slt i32 %A, 100 ; <i1> [#uses=1]
183 ;; (A-50) <u 50
184 %D = and i1 %B, %C ; <i1> [#uses=1]
185 ret i1 %D
Chris Lattner3cbcd252004-09-28 21:39:35 +0000186}
187
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000188define i1 @test26(i32 %A) {
189 %B = icmp ne i32 %A, 50 ; <i1> [#uses=1]
190 %C = icmp ne i32 %A, 51 ; <i1> [#uses=1]
191 ;; (A-50) > 1
192 %D = and i1 %B, %C ; <i1> [#uses=1]
193 ret i1 %D
Chris Lattner3cbcd252004-09-28 21:39:35 +0000194}
195
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000196define i8 @test27(i8 %A) {
197 %B = and i8 %A, 4 ; <i8> [#uses=1]
198 %C = sub i8 %B, 16 ; <i8> [#uses=1]
199 ;; 0xF0
200 %D = and i8 %C, -16 ; <i8> [#uses=1]
201 %E = add i8 %D, 16 ; <i8> [#uses=1]
202 ret i8 %E
Chris Lattner94670622004-10-08 05:03:25 +0000203}
Chris Lattner329d0252005-01-01 16:13:19 +0000204
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000205;; This is juse a zero extending shr.
206define i32 @test28(i32 %X) {
207 ;; Sign extend
208 %Y = ashr i32 %X, 24 ; <i32> [#uses=1]
209 ;; Mask out sign bits
210 %Z = and i32 %Y, 255 ; <i32> [#uses=1]
211 ret i32 %Z
Chris Lattner329d0252005-01-01 16:13:19 +0000212}
213
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000214define i32 @test29(i8 %X) {
215 %Y = zext i8 %X to i32 ; <i32> [#uses=1]
216 ;; Zero extend makes this unneeded.
217 %Z = and i32 %Y, 255 ; <i32> [#uses=1]
218 ret i32 %Z
Chris Lattner329d0252005-01-01 16:13:19 +0000219}
220
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000221define i32 @test30(i1 %X) {
222 %Y = zext i1 %X to i32 ; <i32> [#uses=1]
223 %Z = and i32 %Y, 1 ; <i32> [#uses=1]
224 ret i32 %Z
Chris Lattner8169e162005-05-06 01:52:52 +0000225}
Chris Lattner8d83be22005-05-06 04:52:46 +0000226
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000227define i32 @test31(i1 %X) {
228 %Y = zext i1 %X to i32 ; <i32> [#uses=1]
229 %Z = shl i32 %Y, 4 ; <i32> [#uses=1]
230 %A = and i32 %Z, 16 ; <i32> [#uses=1]
231 ret i32 %A
Chris Lattner8d83be22005-05-06 04:52:46 +0000232}
233
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000234define i32 @test32(i32 %In) {
235 %Y = and i32 %In, 16 ; <i32> [#uses=1]
236 %Z = lshr i32 %Y, 2 ; <i32> [#uses=1]
237 %A = and i32 %Z, 1 ; <i32> [#uses=1]
238 ret i32 %A
Chris Lattner8d83be22005-05-06 04:52:46 +0000239}
Chris Lattner19519b32005-05-09 04:54:18 +0000240
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000241;; Code corresponding to one-bit bitfield ^1.
242define i32 @test33(i32 %b) {
243 %tmp.4.mask = and i32 %b, 1 ; <i32> [#uses=1]
244 %tmp.10 = xor i32 %tmp.4.mask, 1 ; <i32> [#uses=1]
245 %tmp.12 = and i32 %b, -2 ; <i32> [#uses=1]
246 %tmp.13 = or i32 %tmp.12, %tmp.10 ; <i32> [#uses=1]
247 ret i32 %tmp.13
Chris Lattner19519b32005-05-09 04:54:18 +0000248}
249
Tanya Lattneraa6f5c92008-03-09 08:16:40 +0000250define i32 @test34(i32 %A, i32 %B) {
251 %tmp.2 = or i32 %B, %A ; <i32> [#uses=1]
252 %tmp.4 = and i32 %tmp.2, %B ; <i32> [#uses=1]
253 ret i32 %tmp.4
Chris Lattner8081f402006-02-13 23:07:02 +0000254}
255