xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/and.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; There should be no 'and' instructions left in any test.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker  %B = and i32 %A, 0
11*9880d681SAndroid Build Coastguard Worker  ret i32 %B
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %A) {
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 %A
17*9880d681SAndroid Build Coastguard Worker;
18*9880d681SAndroid Build Coastguard Worker  %B = and i32 %A, -1
19*9880d681SAndroid Build Coastguard Worker  ret i32 %B
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerdefine i1 @test3(i1 %A) {
23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
25*9880d681SAndroid Build Coastguard Worker;
26*9880d681SAndroid Build Coastguard Worker  %B = and i1 %A, false
27*9880d681SAndroid Build Coastguard Worker  ret i1 %B
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(i1 %A) {
31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 %A
33*9880d681SAndroid Build Coastguard Worker;
34*9880d681SAndroid Build Coastguard Worker  %B = and i1 %A, true
35*9880d681SAndroid Build Coastguard Worker  ret i1 %B
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %A) {
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 %A
41*9880d681SAndroid Build Coastguard Worker;
42*9880d681SAndroid Build Coastguard Worker  %B = and i32 %A, %A
43*9880d681SAndroid Build Coastguard Worker  ret i32 %B
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine i1 @test6(i1 %A) {
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 %A
49*9880d681SAndroid Build Coastguard Worker;
50*9880d681SAndroid Build Coastguard Worker  %B = and i1 %A, %A
51*9880d681SAndroid Build Coastguard Worker  ret i1 %B
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; A & ~A == 0
55*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %A) {
56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
58*9880d681SAndroid Build Coastguard Worker;
59*9880d681SAndroid Build Coastguard Worker  %NotA = xor i32 %A, -1
60*9880d681SAndroid Build Coastguard Worker  %B = and i32 %A, %NotA
61*9880d681SAndroid Build Coastguard Worker  ret i32 %B
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; AND associates
65*9880d681SAndroid Build Coastguard Workerdefine i8 @test8(i8 %A) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 0
68*9880d681SAndroid Build Coastguard Worker;
69*9880d681SAndroid Build Coastguard Worker  %B = and i8 %A, 3
70*9880d681SAndroid Build Coastguard Worker  %C = and i8 %B, 4
71*9880d681SAndroid Build Coastguard Worker  ret i8 %C
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker; Test of sign bit, convert to setle %A, 0
75*9880d681SAndroid Build Coastguard Workerdefine i1 @test9(i32 %A) {
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 %A, 0
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
79*9880d681SAndroid Build Coastguard Worker;
80*9880d681SAndroid Build Coastguard Worker  %B = and i32 %A, -2147483648
81*9880d681SAndroid Build Coastguard Worker  %C = icmp ne i32 %B, 0
82*9880d681SAndroid Build Coastguard Worker  ret i1 %C
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; Test of sign bit, convert to setle %A, 0
86*9880d681SAndroid Build Coastguard Workerdefine i1 @test9a(i32 %A) {
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9a(
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp slt i32 %A, 0
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
90*9880d681SAndroid Build Coastguard Worker;
91*9880d681SAndroid Build Coastguard Worker  %B = and i32 %A, -2147483648
92*9880d681SAndroid Build Coastguard Worker  %C = icmp ne i32 %B, 0
93*9880d681SAndroid Build Coastguard Worker  ret i1 %C
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %A) {
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 1
99*9880d681SAndroid Build Coastguard Worker;
100*9880d681SAndroid Build Coastguard Worker  %B = and i32 %A, 12
101*9880d681SAndroid Build Coastguard Worker  %C = xor i32 %B, 15
102*9880d681SAndroid Build Coastguard Worker  ; (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
103*9880d681SAndroid Build Coastguard Worker  %D = and i32 %C, 1
104*9880d681SAndroid Build Coastguard Worker  ret i32 %D
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %A, i32* %P) {
108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = or i32 %A, 3
110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = xor i32 [[B]], 12
111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i32 [[C]], i32* %P, align 4
112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 3
113*9880d681SAndroid Build Coastguard Worker;
114*9880d681SAndroid Build Coastguard Worker  %B = or i32 %A, 3
115*9880d681SAndroid Build Coastguard Worker  %C = xor i32 %B, 12
116*9880d681SAndroid Build Coastguard Worker  ; additional use of C
117*9880d681SAndroid Build Coastguard Worker  store i32 %C, i32* %P
118*9880d681SAndroid Build Coastguard Worker  ; %C = and uint %B, 3 --> 3
119*9880d681SAndroid Build Coastguard Worker  %D = and i32 %C, 3
120*9880d681SAndroid Build Coastguard Worker  ret i32 %D
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine i1 @test12(i32 %A, i32 %B) {
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12(
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 %A, %B
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
127*9880d681SAndroid Build Coastguard Worker;
128*9880d681SAndroid Build Coastguard Worker  %C1 = icmp ult i32 %A, %B
129*9880d681SAndroid Build Coastguard Worker  %C2 = icmp ule i32 %A, %B
130*9880d681SAndroid Build Coastguard Worker  ; (A < B) & (A <= B) === (A < B)
131*9880d681SAndroid Build Coastguard Worker  %D = and i1 %C1, %C2
132*9880d681SAndroid Build Coastguard Worker  ret i1 %D
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine i1 @test13(i32 %A, i32 %B) {
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13(
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
138*9880d681SAndroid Build Coastguard Worker;
139*9880d681SAndroid Build Coastguard Worker  %C1 = icmp ult i32 %A, %B
140*9880d681SAndroid Build Coastguard Worker  %C2 = icmp ugt i32 %A, %B
141*9880d681SAndroid Build Coastguard Worker  ; (A < B) & (A > B) === false
142*9880d681SAndroid Build Coastguard Worker  %D = and i1 %C1, %C2
143*9880d681SAndroid Build Coastguard Worker  ret i1 %D
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdefine i1 @test14(i8 %A) {
147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14(
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp slt i8 %A, 0
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
150*9880d681SAndroid Build Coastguard Worker;
151*9880d681SAndroid Build Coastguard Worker  %B = and i8 %A, -128
152*9880d681SAndroid Build Coastguard Worker  %C = icmp ne i8 %B, 0
153*9880d681SAndroid Build Coastguard Worker  ret i1 %C
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdefine i8 @test15(i8 %A) {
157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15(
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 0
159*9880d681SAndroid Build Coastguard Worker;
160*9880d681SAndroid Build Coastguard Worker  %B = lshr i8 %A, 7
161*9880d681SAndroid Build Coastguard Worker  ; Always equals zero
162*9880d681SAndroid Build Coastguard Worker  %C = and i8 %B, 2
163*9880d681SAndroid Build Coastguard Worker  ret i8 %C
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerdefine i8 @test16(i8 %A) {
167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16(
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 0
169*9880d681SAndroid Build Coastguard Worker;
170*9880d681SAndroid Build Coastguard Worker  %B = shl i8 %A, 2
171*9880d681SAndroid Build Coastguard Worker  %C = and i8 %B, 3
172*9880d681SAndroid Build Coastguard Worker  ret i8 %C
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker;; ~(~X & Y) --> (X | ~Y)
176*9880d681SAndroid Build Coastguard Workerdefine i8 @test17(i8 %X, i8 %Y) {
177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17(
178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y_NOT:%.*]] = xor i8 %Y, -1
179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = or i8 %X, [[Y_NOT]]
180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[D]]
181*9880d681SAndroid Build Coastguard Worker;
182*9880d681SAndroid Build Coastguard Worker  %B = xor i8 %X, -1
183*9880d681SAndroid Build Coastguard Worker  %C = and i8 %B, %Y
184*9880d681SAndroid Build Coastguard Worker  %D = xor i8 %C, -1
185*9880d681SAndroid Build Coastguard Worker  ret i8 %D
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdefine i1 @test18(i32 %A) {
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18(
190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ugt i32 %A, 127
191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
192*9880d681SAndroid Build Coastguard Worker;
193*9880d681SAndroid Build Coastguard Worker  %B = and i32 %A, -128
194*9880d681SAndroid Build Coastguard Worker  ;; C >= 128
195*9880d681SAndroid Build Coastguard Worker  %C = icmp ne i32 %B, 0
196*9880d681SAndroid Build Coastguard Worker  ret i1 %C
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdefine i1 @test18a(i8 %A) {
200*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18a(
201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ult i8 %A, 2
202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
203*9880d681SAndroid Build Coastguard Worker;
204*9880d681SAndroid Build Coastguard Worker  %B = and i8 %A, -2
205*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i8 %B, 0
206*9880d681SAndroid Build Coastguard Worker  ret i1 %C
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdefine i32 @test19(i32 %A) {
210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19(
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = shl i32 %A, 3
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[B]]
213*9880d681SAndroid Build Coastguard Worker;
214*9880d681SAndroid Build Coastguard Worker  %B = shl i32 %A, 3
215*9880d681SAndroid Build Coastguard Worker  ;; Clearing a zero bit
216*9880d681SAndroid Build Coastguard Worker  %C = and i32 %B, -2
217*9880d681SAndroid Build Coastguard Worker  ret i32 %C
218*9880d681SAndroid Build Coastguard Worker}
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Workerdefine i8 @test20(i8 %A) {
221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20(
222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = lshr i8 %A, 7
223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[C]]
224*9880d681SAndroid Build Coastguard Worker;
225*9880d681SAndroid Build Coastguard Worker  %C = lshr i8 %A, 7
226*9880d681SAndroid Build Coastguard Worker  ;; Unneeded
227*9880d681SAndroid Build Coastguard Worker  %D = and i8 %C, 1
228*9880d681SAndroid Build Coastguard Worker  ret i8 %D
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Workerdefine i1 @test23(i32 %A) {
232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23(
233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 %A, 2
234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
235*9880d681SAndroid Build Coastguard Worker;
236*9880d681SAndroid Build Coastguard Worker  %B = icmp sgt i32 %A, 1
237*9880d681SAndroid Build Coastguard Worker  %C = icmp sle i32 %A, 2
238*9880d681SAndroid Build Coastguard Worker  ;; A == 2
239*9880d681SAndroid Build Coastguard Worker  %D = and i1 %B, %C
240*9880d681SAndroid Build Coastguard Worker  ret i1 %D
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Workerdefine i1 @test24(i32 %A) {
244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24(
245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i32 %A, 2
246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
247*9880d681SAndroid Build Coastguard Worker;
248*9880d681SAndroid Build Coastguard Worker  %B = icmp sgt i32 %A, 1
249*9880d681SAndroid Build Coastguard Worker  %C = icmp ne i32 %A, 2
250*9880d681SAndroid Build Coastguard Worker  ;; A > 2
251*9880d681SAndroid Build Coastguard Worker  %D = and i1 %B, %C
252*9880d681SAndroid Build Coastguard Worker  ret i1 %D
253*9880d681SAndroid Build Coastguard Worker}
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Workerdefine i1 @test25(i32 %A) {
256*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25(
257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A_OFF:%.*]] = add i32 %A, -50
258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[A_OFF]], 50
259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
260*9880d681SAndroid Build Coastguard Worker;
261*9880d681SAndroid Build Coastguard Worker  %B = icmp sge i32 %A, 50
262*9880d681SAndroid Build Coastguard Worker  %C = icmp slt i32 %A, 100
263*9880d681SAndroid Build Coastguard Worker  ;; (A-50) <u 50
264*9880d681SAndroid Build Coastguard Worker  %D = and i1 %B, %C
265*9880d681SAndroid Build Coastguard Worker  ret i1 %D
266*9880d681SAndroid Build Coastguard Worker}
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Workerdefine i1 @test26(i32 %A) {
269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26(
270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A_OFF:%.*]] = add i32 %A, -49
271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A_CMP:%.*]] = icmp ugt i32 [[A_OFF]], 1
272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[A_CMP]]
273*9880d681SAndroid Build Coastguard Worker;
274*9880d681SAndroid Build Coastguard Worker  %B = icmp ne i32 %A, 49
275*9880d681SAndroid Build Coastguard Worker  %C = icmp ne i32 %A, 50
276*9880d681SAndroid Build Coastguard Worker  ;; (A-49) > 1
277*9880d681SAndroid Build Coastguard Worker  %D = and i1 %B, %C
278*9880d681SAndroid Build Coastguard Worker  ret i1 %D
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Workerdefine i8 @test27(i8 %A) {
282*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27(
283*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 0
284*9880d681SAndroid Build Coastguard Worker;
285*9880d681SAndroid Build Coastguard Worker  %B = and i8 %A, 4
286*9880d681SAndroid Build Coastguard Worker  %C = sub i8 %B, 16
287*9880d681SAndroid Build Coastguard Worker  ;; 0xF0
288*9880d681SAndroid Build Coastguard Worker  %D = and i8 %C, -16
289*9880d681SAndroid Build Coastguard Worker  %E = add i8 %D, 16
290*9880d681SAndroid Build Coastguard Worker  ret i8 %E
291*9880d681SAndroid Build Coastguard Worker}
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker;; This is juse a zero extending shr.
294*9880d681SAndroid Build Coastguard Workerdefine i32 @test28(i32 %X) {
295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28(
296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y1:%.*]] = lshr i32 %X, 24
297*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Y1]]
298*9880d681SAndroid Build Coastguard Worker;
299*9880d681SAndroid Build Coastguard Worker  ;; Sign extend
300*9880d681SAndroid Build Coastguard Worker  %Y = ashr i32 %X, 24
301*9880d681SAndroid Build Coastguard Worker  ;; Mask out sign bits
302*9880d681SAndroid Build Coastguard Worker  %Z = and i32 %Y, 255
303*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
304*9880d681SAndroid Build Coastguard Worker}
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Workerdefine i32 @test29(i8 %X) {
307*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29(
308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = zext i8 %X to i32
309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Y]]
310*9880d681SAndroid Build Coastguard Worker;
311*9880d681SAndroid Build Coastguard Worker  %Y = zext i8 %X to i32
312*9880d681SAndroid Build Coastguard Worker  ;; Zero extend makes this unneeded.
313*9880d681SAndroid Build Coastguard Worker  %Z = and i32 %Y, 255
314*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
315*9880d681SAndroid Build Coastguard Worker}
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Workerdefine i32 @test30(i1 %X) {
318*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30(
319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = zext i1 %X to i32
320*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Y]]
321*9880d681SAndroid Build Coastguard Worker;
322*9880d681SAndroid Build Coastguard Worker  %Y = zext i1 %X to i32
323*9880d681SAndroid Build Coastguard Worker  %Z = and i32 %Y, 1
324*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
325*9880d681SAndroid Build Coastguard Worker}
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerdefine i32 @test31(i1 %X) {
328*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31(
329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = zext i1 %X to i32
330*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = shl nuw nsw i32 [[Y]], 4
331*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
332*9880d681SAndroid Build Coastguard Worker;
333*9880d681SAndroid Build Coastguard Worker  %Y = zext i1 %X to i32
334*9880d681SAndroid Build Coastguard Worker  %Z = shl i32 %Y, 4
335*9880d681SAndroid Build Coastguard Worker  %A = and i32 %Z, 16
336*9880d681SAndroid Build Coastguard Worker  ret i32 %A
337*9880d681SAndroid Build Coastguard Worker}
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Workerdefine i32 @test32(i32 %In) {
340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32(
341*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
342*9880d681SAndroid Build Coastguard Worker;
343*9880d681SAndroid Build Coastguard Worker  %Y = and i32 %In, 16
344*9880d681SAndroid Build Coastguard Worker  %Z = lshr i32 %Y, 2
345*9880d681SAndroid Build Coastguard Worker  %A = and i32 %Z, 1
346*9880d681SAndroid Build Coastguard Worker  ret i32 %A
347*9880d681SAndroid Build Coastguard Worker}
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker;; Code corresponding to one-bit bitfield ^1.
350*9880d681SAndroid Build Coastguard Workerdefine i32 @test33(i32 %b) {
351*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33(
352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_13:%.*]] = xor i32 %b, 1
353*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP_13]]
354*9880d681SAndroid Build Coastguard Worker;
355*9880d681SAndroid Build Coastguard Worker  %tmp.4.mask = and i32 %b, 1
356*9880d681SAndroid Build Coastguard Worker  %tmp.10 = xor i32 %tmp.4.mask, 1
357*9880d681SAndroid Build Coastguard Worker  %tmp.12 = and i32 %b, -2
358*9880d681SAndroid Build Coastguard Worker  %tmp.13 = or i32 %tmp.12, %tmp.10
359*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp.13
360*9880d681SAndroid Build Coastguard Worker}
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Workerdefine i32 @test34(i32 %A, i32 %B) {
363*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test34(
364*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 %B
365*9880d681SAndroid Build Coastguard Worker;
366*9880d681SAndroid Build Coastguard Worker  %tmp.2 = or i32 %B, %A
367*9880d681SAndroid Build Coastguard Worker  %tmp.4 = and i32 %tmp.2, %B
368*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp.4
369*9880d681SAndroid Build Coastguard Worker}
370*9880d681SAndroid Build Coastguard Worker
371