xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/shift.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; This test makes sure that these instructions are properly eliminated.
3*9880d681SAndroid Build Coastguard Worker;
4*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
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 %A
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker  %B = shl i32 %A, 0              ; <i32> [#uses=1]
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(i8 %A) {
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
17*9880d681SAndroid Build Coastguard Worker;
18*9880d681SAndroid Build Coastguard Worker  %shift.upgrd.1 = zext i8 %A to i32              ; <i32> [#uses=1]
19*9880d681SAndroid Build Coastguard Worker  %B = shl i32 0, %shift.upgrd.1          ; <i32> [#uses=1]
20*9880d681SAndroid Build Coastguard Worker  ret i32 %B
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %A) {
24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 %A
26*9880d681SAndroid Build Coastguard Worker;
27*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 %A, 0             ; <i32> [#uses=1]
28*9880d681SAndroid Build Coastguard Worker  ret i32 %B
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i8 %A) {
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
34*9880d681SAndroid Build Coastguard Worker;
35*9880d681SAndroid Build Coastguard Worker  %shift.upgrd.2 = zext i8 %A to i32              ; <i32> [#uses=1]
36*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 0, %shift.upgrd.2         ; <i32> [#uses=1]
37*9880d681SAndroid Build Coastguard Worker  ret i32 %B
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %A) {
42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 undef
44*9880d681SAndroid Build Coastguard Worker;
45*9880d681SAndroid Build Coastguard Worker  %B = lshr i32 %A, 32  ;; shift all bits out
46*9880d681SAndroid Build Coastguard Worker  ret i32 %B
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5_splat_vector(<4 x i32> %A) {
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5_splat_vector(
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> undef
52*9880d681SAndroid Build Coastguard Worker;
53*9880d681SAndroid Build Coastguard Worker  %B = lshr <4 x i32> %A, <i32 32, i32 32, i32 32, i32 32>     ;; shift all bits out
54*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %B
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5_zero_vector(<4 x i32> %A) {
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5_zero_vector(
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> %A
60*9880d681SAndroid Build Coastguard Worker;
61*9880d681SAndroid Build Coastguard Worker  %B = lshr <4 x i32> %A, zeroinitializer
62*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %B
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5_non_splat_vector(<4 x i32> %A) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5_non_splat_vector(
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = lshr <4 x i32> %A, <i32 32, i32 1, i32 2, i32 3>
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> [[B]]
69*9880d681SAndroid Build Coastguard Worker;
70*9880d681SAndroid Build Coastguard Worker  %B = lshr <4 x i32> %A, <i32 32, i32 1, i32 2, i32 3>
71*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %B
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine i32 @test5a(i32 %A) {
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5a(
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 undef
77*9880d681SAndroid Build Coastguard Worker;
78*9880d681SAndroid Build Coastguard Worker  %B = shl i32 %A, 32     ;; shift all bits out
79*9880d681SAndroid Build Coastguard Worker  ret i32 %B
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5a_splat_vector(<4 x i32> %A) {
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5a_splat_vector(
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> undef
85*9880d681SAndroid Build Coastguard Worker;
86*9880d681SAndroid Build Coastguard Worker  %B = shl <4 x i32> %A, <i32 32, i32 32, i32 32, i32 32>     ;; shift all bits out
87*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %B
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5a_non_splat_vector(<4 x i32> %A) {
91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5a_non_splat_vector(
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = shl <4 x i32> %A, <i32 32, i32 1, i32 2, i32 3>
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> [[B]]
94*9880d681SAndroid Build Coastguard Worker;
95*9880d681SAndroid Build Coastguard Worker  %B = shl <4 x i32> %A, <i32 32, i32 1, i32 2, i32 3>
96*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %B
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine i32 @test5b() {
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5b(
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
102*9880d681SAndroid Build Coastguard Worker;
103*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 undef, 2  ;; top two bits must be equal, so not undef
104*9880d681SAndroid Build Coastguard Worker  ret i32 %B
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdefine i32 @test5b2(i32 %A) {
108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5b2(
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
110*9880d681SAndroid Build Coastguard Worker;
111*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 undef, %A  ;; top %A bits must be equal, so not undef
112*9880d681SAndroid Build Coastguard Worker  ret i32 %B
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %A) {
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = mul i32 %A, 6
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[C]]
119*9880d681SAndroid Build Coastguard Worker;
120*9880d681SAndroid Build Coastguard Worker  %B = shl i32 %A, 1      ;; convert to an mul instruction
121*9880d681SAndroid Build Coastguard Worker  %C = mul i32 %B, 3
122*9880d681SAndroid Build Coastguard Worker  ret i32 %C
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine i32 @test6a(i32 %A) {
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6a(
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = mul i32 %A, 6
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[C]]
129*9880d681SAndroid Build Coastguard Worker;
130*9880d681SAndroid Build Coastguard Worker  %B = mul i32 %A, 3
131*9880d681SAndroid Build Coastguard Worker  %C = shl i32 %B, 1      ;; convert to an mul instruction
132*9880d681SAndroid Build Coastguard Worker  ret i32 %C
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i8 %A) {
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 -1
138*9880d681SAndroid Build Coastguard Worker;
139*9880d681SAndroid Build Coastguard Worker  %shift.upgrd.3 = zext i8 %A to i32
140*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 -1, %shift.upgrd.3  ;; Always equal to -1
141*9880d681SAndroid Build Coastguard Worker  ret i32 %B
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker;; (A << 5) << 3 === A << 8 == 0
145*9880d681SAndroid Build Coastguard Workerdefine i8 @test8(i8 %A) {
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 0
148*9880d681SAndroid Build Coastguard Worker;
149*9880d681SAndroid Build Coastguard Worker  %B = shl i8 %A, 5               ; <i8> [#uses=1]
150*9880d681SAndroid Build Coastguard Worker  %C = shl i8 %B, 3               ; <i8> [#uses=1]
151*9880d681SAndroid Build Coastguard Worker  ret i8 %C
152*9880d681SAndroid Build Coastguard Worker}
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker;; (A << 7) >> 7 === A & 1
155*9880d681SAndroid Build Coastguard Workerdefine i8 @test9(i8 %A) {
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = and i8 %A, 1
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[B]]
159*9880d681SAndroid Build Coastguard Worker;
160*9880d681SAndroid Build Coastguard Worker  %B = shl i8 %A, 7               ; <i8> [#uses=1]
161*9880d681SAndroid Build Coastguard Worker  %C = lshr i8 %B, 7              ; <i8> [#uses=1]
162*9880d681SAndroid Build Coastguard Worker  ret i8 %C
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker;; This transformation is deferred to DAGCombine:
166*9880d681SAndroid Build Coastguard Worker;; (A >> 7) << 7 === A & 128
167*9880d681SAndroid Build Coastguard Worker;; The shl may be valuable to scalar evolution.
168*9880d681SAndroid Build Coastguard Workerdefine i8 @test10(i8 %A) {
169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = and i8 %A, -128
171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[B]]
172*9880d681SAndroid Build Coastguard Worker;
173*9880d681SAndroid Build Coastguard Worker  %B = lshr i8 %A, 7              ; <i8> [#uses=1]
174*9880d681SAndroid Build Coastguard Worker  %C = shl i8 %B, 7               ; <i8> [#uses=1]
175*9880d681SAndroid Build Coastguard Worker  ret i8 %C
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker;; Allow the simplification when the lshr shift is exact.
179*9880d681SAndroid Build Coastguard Workerdefine i8 @test10a(i8 %A) {
180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10a(
181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 %A
182*9880d681SAndroid Build Coastguard Worker;
183*9880d681SAndroid Build Coastguard Worker  %B = lshr exact i8 %A, 7
184*9880d681SAndroid Build Coastguard Worker  %C = shl i8 %B, 7
185*9880d681SAndroid Build Coastguard Worker  ret i8 %C
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker;; This transformation is deferred to DAGCombine:
189*9880d681SAndroid Build Coastguard Worker;; (A >> 3) << 4 === (A & 0x1F) << 1
190*9880d681SAndroid Build Coastguard Worker;; The shl may be valuable to scalar evolution.
191*9880d681SAndroid Build Coastguard Workerdefine i8 @test11(i8 %A) {
192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = mul i8 %A, 3
194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = lshr i8 [[A]], 3
195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = shl i8 [[B]], 4
196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[C]]
197*9880d681SAndroid Build Coastguard Worker;
198*9880d681SAndroid Build Coastguard Worker  %a = mul i8 %A, 3               ; <i8> [#uses=1]
199*9880d681SAndroid Build Coastguard Worker  %B = lshr i8 %a, 3              ; <i8> [#uses=1]
200*9880d681SAndroid Build Coastguard Worker  %C = shl i8 %B, 4               ; <i8> [#uses=1]
201*9880d681SAndroid Build Coastguard Worker  ret i8 %C
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker;; Allow the simplification in InstCombine when the lshr shift is exact.
205*9880d681SAndroid Build Coastguard Workerdefine i8 @test11a(i8 %A) {
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11a(
207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = mul i8 %A, 6
208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[C]]
209*9880d681SAndroid Build Coastguard Worker;
210*9880d681SAndroid Build Coastguard Worker  %a = mul i8 %A, 3
211*9880d681SAndroid Build Coastguard Worker  %B = lshr exact i8 %a, 3
212*9880d681SAndroid Build Coastguard Worker  %C = shl i8 %B, 4
213*9880d681SAndroid Build Coastguard Worker  ret i8 %C
214*9880d681SAndroid Build Coastguard Worker}
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker;; This is deferred to DAGCombine unless %B is single-use.
217*9880d681SAndroid Build Coastguard Worker;; (A >> 8) << 8 === A & -256
218*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i32 %A) {
219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12(
220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B1:%.*]] = and i32 %A, -256
221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[B1]]
222*9880d681SAndroid Build Coastguard Worker;
223*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 %A, 8             ; <i32> [#uses=1]
224*9880d681SAndroid Build Coastguard Worker  %C = shl i32 %B, 8              ; <i32> [#uses=1]
225*9880d681SAndroid Build Coastguard Worker  ret i32 %C
226*9880d681SAndroid Build Coastguard Worker}
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker;; This transformation is deferred to DAGCombine:
229*9880d681SAndroid Build Coastguard Worker;; (A >> 3) << 4 === (A & -8) * 2
230*9880d681SAndroid Build Coastguard Worker;; The shl may be valuable to scalar evolution.
231*9880d681SAndroid Build Coastguard Workerdefine i8 @test13(i8 %A) {
232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13(
233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = mul i8 %A, 3
234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B1:%.*]] = lshr i8 [[A]], 3
235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = shl i8 [[B1]], 4
236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[C]]
237*9880d681SAndroid Build Coastguard Worker;
238*9880d681SAndroid Build Coastguard Worker  %a = mul i8 %A, 3               ; <i8> [#uses=1]
239*9880d681SAndroid Build Coastguard Worker  %B = ashr i8 %a, 3              ; <i8> [#uses=1]
240*9880d681SAndroid Build Coastguard Worker  %C = shl i8 %B, 4               ; <i8> [#uses=1]
241*9880d681SAndroid Build Coastguard Worker  ret i8 %C
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerdefine i8 @test13a(i8 %A) {
245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13a(
246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = mul i8 %A, 6
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[C]]
248*9880d681SAndroid Build Coastguard Worker;
249*9880d681SAndroid Build Coastguard Worker  %a = mul i8 %A, 3
250*9880d681SAndroid Build Coastguard Worker  %B = ashr exact i8 %a, 3
251*9880d681SAndroid Build Coastguard Worker  %C = shl i8 %B, 4
252*9880d681SAndroid Build Coastguard Worker  ret i8 %C
253*9880d681SAndroid Build Coastguard Worker}
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4)
256*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i32 %A) {
257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14(
258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = and i32 %A, -19760
259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = or i32 [[B]], 19744
260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[C]]
261*9880d681SAndroid Build Coastguard Worker;
262*9880d681SAndroid Build Coastguard Worker  %B = lshr i32 %A, 4             ; <i32> [#uses=1]
263*9880d681SAndroid Build Coastguard Worker  %C = or i32 %B, 1234            ; <i32> [#uses=1]
264*9880d681SAndroid Build Coastguard Worker  %D = shl i32 %C, 4              ; <i32> [#uses=1]
265*9880d681SAndroid Build Coastguard Worker  ret i32 %D
266*9880d681SAndroid Build Coastguard Worker}
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4)
269*9880d681SAndroid Build Coastguard Workerdefine i32 @test14a(i32 %A) {
270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14a(
271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = and i32 %A, 77
272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[C]]
273*9880d681SAndroid Build Coastguard Worker;
274*9880d681SAndroid Build Coastguard Worker  %B = shl i32 %A, 4              ; <i32> [#uses=1]
275*9880d681SAndroid Build Coastguard Worker  %C = and i32 %B, 1234           ; <i32> [#uses=1]
276*9880d681SAndroid Build Coastguard Worker  %D = lshr i32 %C, 4             ; <i32> [#uses=1]
277*9880d681SAndroid Build Coastguard Worker  ret i32 %D
278*9880d681SAndroid Build Coastguard Worker}
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i1 %C) {
281*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15(
282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = select i1 %C, i32 12, i32 4
283*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[A]]
284*9880d681SAndroid Build Coastguard Worker;
285*9880d681SAndroid Build Coastguard Worker  %A = select i1 %C, i32 3, i32 1         ; <i32> [#uses=1]
286*9880d681SAndroid Build Coastguard Worker  %V = shl i32 %A, 2              ; <i32> [#uses=1]
287*9880d681SAndroid Build Coastguard Worker  ret i32 %V
288*9880d681SAndroid Build Coastguard Worker}
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Workerdefine i32 @test15a(i1 %C) {
291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15a(
292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[V:%.*]] = select i1 %C, i32 512, i32 128
293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[V]]
294*9880d681SAndroid Build Coastguard Worker;
295*9880d681SAndroid Build Coastguard Worker  %A = select i1 %C, i8 3, i8 1           ; <i8> [#uses=1]
296*9880d681SAndroid Build Coastguard Worker  %shift.upgrd.4 = zext i8 %A to i32              ; <i32> [#uses=1]
297*9880d681SAndroid Build Coastguard Worker  %V = shl i32 64, %shift.upgrd.4         ; <i32> [#uses=1]
298*9880d681SAndroid Build Coastguard Worker  ret i32 %V
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Workerdefine i1 @test16(i32 %X) {
302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16(
303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_6:%.*]] = and i32 %X, 16
304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_7:%.*]] = icmp ne i32 [[TMP_6]], 0
305*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP_7]]
306*9880d681SAndroid Build Coastguard Worker;
307*9880d681SAndroid Build Coastguard Worker  %tmp.3 = ashr i32 %X, 4
308*9880d681SAndroid Build Coastguard Worker  %tmp.6 = and i32 %tmp.3, 1
309*9880d681SAndroid Build Coastguard Worker  %tmp.7 = icmp ne i32 %tmp.6, 0
310*9880d681SAndroid Build Coastguard Worker  ret i1 %tmp.7
311*9880d681SAndroid Build Coastguard Worker}
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Workerdefine i1 @test17(i32 %A) {
314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17(
315*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B_MASK:%.*]] = and i32 %A, -8
316*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[B_MASK]], 9872
317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
318*9880d681SAndroid Build Coastguard Worker;
319*9880d681SAndroid Build Coastguard Worker  %B = lshr i32 %A, 3             ; <i32> [#uses=1]
320*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i32 %B, 1234               ; <i1> [#uses=1]
321*9880d681SAndroid Build Coastguard Worker  ret i1 %C
322*9880d681SAndroid Build Coastguard Worker}
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Workerdefine i1 @test18(i8 %A) {
326*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18(
327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
328*9880d681SAndroid Build Coastguard Worker;
329*9880d681SAndroid Build Coastguard Worker  %B = lshr i8 %A, 7              ; <i8> [#uses=1]
330*9880d681SAndroid Build Coastguard Worker  ;; false
331*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i8 %B, 123         ; <i1> [#uses=1]
332*9880d681SAndroid Build Coastguard Worker  ret i1 %C
333*9880d681SAndroid Build Coastguard Worker}
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Workerdefine i1 @test19(i32 %A) {
336*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19(
337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 %A, 4
338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
339*9880d681SAndroid Build Coastguard Worker;
340*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 %A, 2             ; <i32> [#uses=1]
341*9880d681SAndroid Build Coastguard Worker  ;; (X & -4) == 0
342*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i32 %B, 0          ; <i1> [#uses=1]
343*9880d681SAndroid Build Coastguard Worker  ret i1 %C
344*9880d681SAndroid Build Coastguard Worker}
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Workerdefine i1 @test19a(i32 %A) {
348*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19a(
349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ugt i32 %A, -5
350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
351*9880d681SAndroid Build Coastguard Worker;
352*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 %A, 2             ; <i32> [#uses=1]
353*9880d681SAndroid Build Coastguard Worker  ;; X >u ~4
354*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i32 %B, -1         ; <i1> [#uses=1]
355*9880d681SAndroid Build Coastguard Worker  ret i1 %C
356*9880d681SAndroid Build Coastguard Worker}
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Workerdefine i1 @test20(i8 %A) {
359*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20(
360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
361*9880d681SAndroid Build Coastguard Worker;
362*9880d681SAndroid Build Coastguard Worker  %B = ashr i8 %A, 7              ; <i8> [#uses=1]
363*9880d681SAndroid Build Coastguard Worker  ;; false
364*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i8 %B, 123         ; <i1> [#uses=1]
365*9880d681SAndroid Build Coastguard Worker  ret i1 %C
366*9880d681SAndroid Build Coastguard Worker}
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Workerdefine i1 @test21(i8 %A) {
369*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21(
370*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B_MASK:%.*]] = and i8 %A, 15
371*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[B_MASK]], 8
372*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
373*9880d681SAndroid Build Coastguard Worker;
374*9880d681SAndroid Build Coastguard Worker  %B = shl i8 %A, 4               ; <i8> [#uses=1]
375*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i8 %B, -128                ; <i1> [#uses=1]
376*9880d681SAndroid Build Coastguard Worker  ret i1 %C
377*9880d681SAndroid Build Coastguard Worker}
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Workerdefine i1 @test22(i8 %A) {
380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22(
381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B_MASK:%.*]] = and i8 %A, 15
382*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[B_MASK]], 0
383*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
384*9880d681SAndroid Build Coastguard Worker;
385*9880d681SAndroid Build Coastguard Worker  %B = shl i8 %A, 4               ; <i8> [#uses=1]
386*9880d681SAndroid Build Coastguard Worker  %C = icmp eq i8 %B, 0           ; <i1> [#uses=1]
387*9880d681SAndroid Build Coastguard Worker  ret i1 %C
388*9880d681SAndroid Build Coastguard Worker}
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Workerdefine i8 @test23(i32 %A) {
391*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23(
392*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = trunc i32 %A to i8
393*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[D]]
394*9880d681SAndroid Build Coastguard Worker;
395*9880d681SAndroid Build Coastguard Worker  ;; casts not needed
396*9880d681SAndroid Build Coastguard Worker  %B = shl i32 %A, 24             ; <i32> [#uses=1]
397*9880d681SAndroid Build Coastguard Worker  %C = ashr i32 %B, 24            ; <i32> [#uses=1]
398*9880d681SAndroid Build Coastguard Worker  %D = trunc i32 %C to i8         ; <i8> [#uses=1]
399*9880d681SAndroid Build Coastguard Worker  ret i8 %D
400*9880d681SAndroid Build Coastguard Worker}
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Workerdefine i8 @test24(i8 %X) {
403*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24(
404*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = and i8 %X, 3
405*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[Z]]
406*9880d681SAndroid Build Coastguard Worker;
407*9880d681SAndroid Build Coastguard Worker  %Y = and i8 %X, -5              ; <i8> [#uses=1]
408*9880d681SAndroid Build Coastguard Worker  %Z = shl i8 %Y, 5               ; <i8> [#uses=1]
409*9880d681SAndroid Build Coastguard Worker  %Q = ashr i8 %Z, 5              ; <i8> [#uses=1]
410*9880d681SAndroid Build Coastguard Worker  ret i8 %Q
411*9880d681SAndroid Build Coastguard Worker}
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Workerdefine i32 @test25(i32 %tmp.2, i32 %AA) {
414*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25(
415*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_3:%.*]] = and i32 %tmp.2, -131072
416*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X2:%.*]] = add i32 [[TMP_3]], %AA
417*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_6:%.*]] = and i32 [[X2]], -131072
418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP_6]]
419*9880d681SAndroid Build Coastguard Worker;
420*9880d681SAndroid Build Coastguard Worker  %x = lshr i32 %AA, 17           ; <i32> [#uses=1]
421*9880d681SAndroid Build Coastguard Worker  %tmp.3 = lshr i32 %tmp.2, 17            ; <i32> [#uses=1]
422*9880d681SAndroid Build Coastguard Worker  %tmp.5 = add i32 %tmp.3, %x             ; <i32> [#uses=1]
423*9880d681SAndroid Build Coastguard Worker  %tmp.6 = shl i32 %tmp.5, 17             ; <i32> [#uses=1]
424*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp.6
425*9880d681SAndroid Build Coastguard Worker}
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test25_vector(<2 x i32> %tmp.2, <2 x i32> %AA) {
428*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25_vector(
429*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_3:%.*]] = lshr <2 x i32> %tmp.2, <i32 17, i32 17>
430*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_51:%.*]] = shl <2 x i32> [[TMP_3]], <i32 17, i32 17>
431*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X2:%.*]] = add <2 x i32> [[TMP_51]], %AA
432*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_6:%.*]] = and <2 x i32> [[X2]], <i32 -131072, i32 -131072>
433*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i32> [[TMP_6]]
434*9880d681SAndroid Build Coastguard Worker;
435*9880d681SAndroid Build Coastguard Worker  %x = lshr <2 x i32> %AA, <i32 17, i32 17>
436*9880d681SAndroid Build Coastguard Worker  %tmp.3 = lshr <2 x i32> %tmp.2, <i32 17, i32 17>
437*9880d681SAndroid Build Coastguard Worker  %tmp.5 = add <2 x i32> %tmp.3, %x
438*9880d681SAndroid Build Coastguard Worker  %tmp.6 = shl <2 x i32> %tmp.5, <i32 17, i32 17>
439*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %tmp.6
440*9880d681SAndroid Build Coastguard Worker}
441*9880d681SAndroid Build Coastguard Worker
442*9880d681SAndroid Build Coastguard Worker;; handle casts between shifts.
443*9880d681SAndroid Build Coastguard Workerdefine i32 @test26(i32 %A) {
444*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26(
445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = and i32 %A, -2
446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[B]]
447*9880d681SAndroid Build Coastguard Worker;
448*9880d681SAndroid Build Coastguard Worker  %B = lshr i32 %A, 1             ; <i32> [#uses=1]
449*9880d681SAndroid Build Coastguard Worker  %C = bitcast i32 %B to i32              ; <i32> [#uses=1]
450*9880d681SAndroid Build Coastguard Worker  %D = shl i32 %C, 1              ; <i32> [#uses=1]
451*9880d681SAndroid Build Coastguard Worker  ret i32 %D
452*9880d681SAndroid Build Coastguard Worker}
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Workerdefine i1 @test27(i32 %x) nounwind {
456*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27(
457*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 %x, 8
458*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = icmp ne i32 [[TMP1]], 0
459*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[Z]]
460*9880d681SAndroid Build Coastguard Worker;
461*9880d681SAndroid Build Coastguard Worker  %y = lshr i32 %x, 3
462*9880d681SAndroid Build Coastguard Worker  %z = trunc i32 %y to i1
463*9880d681SAndroid Build Coastguard Worker  ret i1 %z
464*9880d681SAndroid Build Coastguard Worker}
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Workerdefine i8 @test28(i8 %x) {
467*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28(
468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
469*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[COND1:%.*]] = icmp slt i8 %x, 0
470*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 [[COND1]], label %bb1, label %bb2
471*9880d681SAndroid Build Coastguard Worker; CHECK:       bb1:
472*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 0
473*9880d681SAndroid Build Coastguard Worker; CHECK:       bb2:
474*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 1
475*9880d681SAndroid Build Coastguard Worker;
476*9880d681SAndroid Build Coastguard Workerentry:
477*9880d681SAndroid Build Coastguard Worker  %tmp1 = lshr i8 %x, 7
478*9880d681SAndroid Build Coastguard Worker  %cond1 = icmp ne i8 %tmp1, 0
479*9880d681SAndroid Build Coastguard Worker  br i1 %cond1, label %bb1, label %bb2
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Workerbb1:
482*9880d681SAndroid Build Coastguard Worker  ret i8 0
483*9880d681SAndroid Build Coastguard Worker
484*9880d681SAndroid Build Coastguard Workerbb2:
485*9880d681SAndroid Build Coastguard Worker  ret i8 1
486*9880d681SAndroid Build Coastguard Worker}
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard Workerdefine i8 @test28a(i8 %x, i8 %y) {
489*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28a(
490*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
491*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = lshr i8 %x, 7
492*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[COND1:%.*]] = icmp eq i8 [[TMP1]], 0
493*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 [[COND1]], label %bb2, label %bb1
494*9880d681SAndroid Build Coastguard Worker; CHECK:       bb1:
495*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[TMP1]]
496*9880d681SAndroid Build Coastguard Worker; CHECK:       bb2:
497*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[TMP1]], %y
498*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[TMP2]]
499*9880d681SAndroid Build Coastguard Worker;
500*9880d681SAndroid Build Coastguard Workerentry:
501*9880d681SAndroid Build Coastguard Worker; This shouldn't be transformed.
502*9880d681SAndroid Build Coastguard Worker  %tmp1 = lshr i8 %x, 7
503*9880d681SAndroid Build Coastguard Worker  %cond1 = icmp ne i8 %tmp1, 0
504*9880d681SAndroid Build Coastguard Worker  br i1 %cond1, label %bb1, label %bb2
505*9880d681SAndroid Build Coastguard Workerbb1:
506*9880d681SAndroid Build Coastguard Worker  ret i8 %tmp1
507*9880d681SAndroid Build Coastguard Workerbb2:
508*9880d681SAndroid Build Coastguard Worker  %tmp2 = add i8 %tmp1, %y
509*9880d681SAndroid Build Coastguard Worker  ret i8 %tmp2
510*9880d681SAndroid Build Coastguard Worker}
511*9880d681SAndroid Build Coastguard Worker
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Workerdefine i32 @test29(i64 %d18) {
514*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29(
515*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
516*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP916:%.*]] = lshr i64 %d18, 63
517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP10:%.*]] = trunc i64 [[TMP916]] to i32
518*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP10]]
519*9880d681SAndroid Build Coastguard Worker;
520*9880d681SAndroid Build Coastguard Workerentry:
521*9880d681SAndroid Build Coastguard Worker  %tmp916 = lshr i64 %d18, 32
522*9880d681SAndroid Build Coastguard Worker  %tmp917 = trunc i64 %tmp916 to i32
523*9880d681SAndroid Build Coastguard Worker  %tmp10 = lshr i32 %tmp917, 31
524*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp10
525*9880d681SAndroid Build Coastguard Worker}
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Workerdefine i32 @test30(i32 %A, i32 %B, i32 %C) {
529*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30(
530*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X1:%.*]] = and i32 %A, %B
531*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = shl i32 [[X1]], %C
532*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
533*9880d681SAndroid Build Coastguard Worker;
534*9880d681SAndroid Build Coastguard Worker  %X = shl i32 %A, %C
535*9880d681SAndroid Build Coastguard Worker  %Y = shl i32 %B, %C
536*9880d681SAndroid Build Coastguard Worker  %Z = and i32 %X, %Y
537*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
538*9880d681SAndroid Build Coastguard Worker}
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Workerdefine i32 @test31(i32 %A, i32 %B, i32 %C) {
541*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31(
542*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X1:%.*]] = or i32 %A, %B
543*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = lshr i32 [[X1]], %C
544*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
545*9880d681SAndroid Build Coastguard Worker;
546*9880d681SAndroid Build Coastguard Worker  %X = lshr i32 %A, %C
547*9880d681SAndroid Build Coastguard Worker  %Y = lshr i32 %B, %C
548*9880d681SAndroid Build Coastguard Worker  %Z = or i32 %X, %Y
549*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
550*9880d681SAndroid Build Coastguard Worker}
551*9880d681SAndroid Build Coastguard Worker
552*9880d681SAndroid Build Coastguard Workerdefine i32 @test32(i32 %A, i32 %B, i32 %C) {
553*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32(
554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X1:%.*]] = xor i32 %A, %B
555*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = ashr i32 [[X1]], %C
556*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
557*9880d681SAndroid Build Coastguard Worker;
558*9880d681SAndroid Build Coastguard Worker  %X = ashr i32 %A, %C
559*9880d681SAndroid Build Coastguard Worker  %Y = ashr i32 %B, %C
560*9880d681SAndroid Build Coastguard Worker  %Z = xor i32 %X, %Y
561*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
562*9880d681SAndroid Build Coastguard Worker}
563*9880d681SAndroid Build Coastguard Worker
564*9880d681SAndroid Build Coastguard Workerdefine i1 @test33(i32 %X) {
565*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33(
566*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1_MASK:%.*]] = and i32 %X, 16777216
567*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1_MASK]], 0
568*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP2]]
569*9880d681SAndroid Build Coastguard Worker;
570*9880d681SAndroid Build Coastguard Worker  %tmp1 = shl i32 %X, 7
571*9880d681SAndroid Build Coastguard Worker  %tmp2 = icmp slt i32 %tmp1, 0
572*9880d681SAndroid Build Coastguard Worker  ret i1 %tmp2
573*9880d681SAndroid Build Coastguard Worker}
574*9880d681SAndroid Build Coastguard Worker
575*9880d681SAndroid Build Coastguard Workerdefine i1 @test34(i32 %X) {
576*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test34(
577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
578*9880d681SAndroid Build Coastguard Worker;
579*9880d681SAndroid Build Coastguard Worker  %tmp1 = lshr i32 %X, 7
580*9880d681SAndroid Build Coastguard Worker  %tmp2 = icmp slt i32 %tmp1, 0
581*9880d681SAndroid Build Coastguard Worker  ret i1 %tmp2
582*9880d681SAndroid Build Coastguard Worker}
583*9880d681SAndroid Build Coastguard Worker
584*9880d681SAndroid Build Coastguard Workerdefine i1 @test35(i32 %X) {
585*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test35(
586*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i32 %X, 0
587*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP2]]
588*9880d681SAndroid Build Coastguard Worker;
589*9880d681SAndroid Build Coastguard Worker  %tmp1 = ashr i32 %X, 7
590*9880d681SAndroid Build Coastguard Worker  %tmp2 = icmp slt i32 %tmp1, 0
591*9880d681SAndroid Build Coastguard Worker  ret i1 %tmp2
592*9880d681SAndroid Build Coastguard Worker}
593*9880d681SAndroid Build Coastguard Worker
594*9880d681SAndroid Build Coastguard Workerdefine i128 @test36(i128 %A, i128 %B) {
595*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test36(
596*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
597*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP231:%.*]] = or i128 %B, %A
598*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[INS:%.*]] = and i128 [[TMP231]], 18446744073709551615
599*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i128 [[INS]]
600*9880d681SAndroid Build Coastguard Worker;
601*9880d681SAndroid Build Coastguard Workerentry:
602*9880d681SAndroid Build Coastguard Worker  %tmp27 = shl i128 %A, 64
603*9880d681SAndroid Build Coastguard Worker  %tmp23 = shl i128 %B, 64
604*9880d681SAndroid Build Coastguard Worker  %ins = or i128 %tmp23, %tmp27
605*9880d681SAndroid Build Coastguard Worker  %tmp45 = lshr i128 %ins, 64
606*9880d681SAndroid Build Coastguard Worker  ret i128 %tmp45
607*9880d681SAndroid Build Coastguard Worker
608*9880d681SAndroid Build Coastguard Worker}
609*9880d681SAndroid Build Coastguard Worker
610*9880d681SAndroid Build Coastguard Workerdefine i64 @test37(i128 %A, i32 %B) {
611*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test37(
612*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
613*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 %B to i128
614*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP23:%.*]] = shl nuw nsw i128 [[TMP22]], 32
615*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[INS:%.*]] = or i128 [[TMP23]], %A
616*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP46:%.*]] = trunc i128 [[INS]] to i64
617*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[TMP46]]
618*9880d681SAndroid Build Coastguard Worker;
619*9880d681SAndroid Build Coastguard Workerentry:
620*9880d681SAndroid Build Coastguard Worker  %tmp27 = shl i128 %A, 64
621*9880d681SAndroid Build Coastguard Worker  %tmp22 = zext i32 %B to i128
622*9880d681SAndroid Build Coastguard Worker  %tmp23 = shl i128 %tmp22, 96
623*9880d681SAndroid Build Coastguard Worker  %ins = or i128 %tmp23, %tmp27
624*9880d681SAndroid Build Coastguard Worker  %tmp45 = lshr i128 %ins, 64
625*9880d681SAndroid Build Coastguard Worker  %tmp46 = trunc i128 %tmp45 to i64
626*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp46
627*9880d681SAndroid Build Coastguard Worker
628*9880d681SAndroid Build Coastguard Worker}
629*9880d681SAndroid Build Coastguard Worker
630*9880d681SAndroid Build Coastguard Workerdefine i32 @test38(i32 %x) nounwind readnone {
631*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test38(
632*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[REM1:%.*]] = and i32 %x, 31
633*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHL:%.*]] = shl i32 1, [[REM1]]
634*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[SHL]]
635*9880d681SAndroid Build Coastguard Worker;
636*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %x, 32
637*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 1, %rem
638*9880d681SAndroid Build Coastguard Worker  ret i32 %shl
639*9880d681SAndroid Build Coastguard Worker}
640*9880d681SAndroid Build Coastguard Worker
641*9880d681SAndroid Build Coastguard Worker; <rdar://problem/8756731>
642*9880d681SAndroid Build Coastguard Workerdefine i8 @test39(i32 %a0) {
643*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test39(
644*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
645*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP4:%.*]] = trunc i32 %a0 to i8
646*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP5:%.*]] = shl i8 [[TMP4]], 5
647*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP49:%.*]] = shl i8 [[TMP4]], 6
648*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP50:%.*]] = and i8 [[TMP49]], 64
649*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP51:%.*]] = xor i8 [[TMP50]], [[TMP5]]
650*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP0:%.*]] = shl i8 [[TMP4]], 2
651*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP54:%.*]] = and i8 [[TMP0]], 16
652*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP551:%.*]] = or i8 [[TMP54]], [[TMP51]]
653*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[TMP551]]
654*9880d681SAndroid Build Coastguard Worker;
655*9880d681SAndroid Build Coastguard Workerentry:
656*9880d681SAndroid Build Coastguard Worker  %tmp4 = trunc i32 %a0 to i8
657*9880d681SAndroid Build Coastguard Worker  %tmp5 = shl i8 %tmp4, 5
658*9880d681SAndroid Build Coastguard Worker  %tmp48 = and i8 %tmp5, 32
659*9880d681SAndroid Build Coastguard Worker  %tmp49 = lshr i8 %tmp48, 5
660*9880d681SAndroid Build Coastguard Worker  %tmp50 = mul i8 %tmp49, 64
661*9880d681SAndroid Build Coastguard Worker  %tmp51 = xor i8 %tmp50, %tmp5
662*9880d681SAndroid Build Coastguard Worker  %tmp52 = and i8 %tmp51, -128
663*9880d681SAndroid Build Coastguard Worker  %tmp53 = lshr i8 %tmp52, 7
664*9880d681SAndroid Build Coastguard Worker  %tmp54 = mul i8 %tmp53, 16
665*9880d681SAndroid Build Coastguard Worker  %tmp55 = xor i8 %tmp54, %tmp51
666*9880d681SAndroid Build Coastguard Worker  ret i8 %tmp55
667*9880d681SAndroid Build Coastguard Worker}
668*9880d681SAndroid Build Coastguard Worker
669*9880d681SAndroid Build Coastguard Worker; PR9809
670*9880d681SAndroid Build Coastguard Workerdefine i32 @test40(i32 %a, i32 %b) nounwind {
671*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test40(
672*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = add i32 %b, 2
673*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DIV:%.*]] = lshr i32 %a, [[TMP1]]
674*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[DIV]]
675*9880d681SAndroid Build Coastguard Worker;
676*9880d681SAndroid Build Coastguard Worker  %shl1 = shl i32 1, %b
677*9880d681SAndroid Build Coastguard Worker  %shl2 = shl i32 %shl1, 2
678*9880d681SAndroid Build Coastguard Worker  %div = udiv i32 %a, %shl2
679*9880d681SAndroid Build Coastguard Worker  ret i32 %div
680*9880d681SAndroid Build Coastguard Worker}
681*9880d681SAndroid Build Coastguard Worker
682*9880d681SAndroid Build Coastguard Workerdefine i32 @test41(i32 %a, i32 %b) nounwind {
683*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41(
684*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shl i32 8, %b
685*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP1]]
686*9880d681SAndroid Build Coastguard Worker;
687*9880d681SAndroid Build Coastguard Worker  %1 = shl i32 1, %b
688*9880d681SAndroid Build Coastguard Worker  %2 = shl i32 %1, 3
689*9880d681SAndroid Build Coastguard Worker  ret i32 %2
690*9880d681SAndroid Build Coastguard Worker}
691*9880d681SAndroid Build Coastguard Worker
692*9880d681SAndroid Build Coastguard Workerdefine i32 @test42(i32 %a, i32 %b) nounwind {
693*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test42(
694*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DIV:%.*]] = lshr exact i32 4096, %b
695*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DIV2:%.*]] = udiv i32 %a, [[DIV]]
696*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[DIV2]]
697*9880d681SAndroid Build Coastguard Worker;
698*9880d681SAndroid Build Coastguard Worker  %div = lshr i32 4096, %b    ; must be exact otherwise we'd divide by zero
699*9880d681SAndroid Build Coastguard Worker  %div2 = udiv i32 %a, %div
700*9880d681SAndroid Build Coastguard Worker  ret i32 %div2
701*9880d681SAndroid Build Coastguard Worker}
702*9880d681SAndroid Build Coastguard Worker
703*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test42vec(<2 x i32> %a, <2 x i32> %b) {
704*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test42vec(
705*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DIV:%.*]] = lshr exact <2 x i32> <i32 4096, i32 4096>, %b
706*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DIV2:%.*]] = udiv <2 x i32> %a, [[DIV]]
707*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i32> [[DIV2]]
708*9880d681SAndroid Build Coastguard Worker;
709*9880d681SAndroid Build Coastguard Worker  %div = lshr <2 x i32> <i32 4096, i32 4096>, %b    ; must be exact otherwise we'd divide by zero
710*9880d681SAndroid Build Coastguard Worker  %div2 = udiv <2 x i32> %a, %div
711*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %div2
712*9880d681SAndroid Build Coastguard Worker}
713*9880d681SAndroid Build Coastguard Worker
714*9880d681SAndroid Build Coastguard Workerdefine i32 @test43(i32 %a, i32 %b) nounwind {
715*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test43(
716*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = add i32 %b, 12
717*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DIV2:%.*]] = lshr i32 %a, [[TMP1]]
718*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[DIV2]]
719*9880d681SAndroid Build Coastguard Worker;
720*9880d681SAndroid Build Coastguard Worker  %div = shl i32 4096, %b    ; must be exact otherwise we'd divide by zero
721*9880d681SAndroid Build Coastguard Worker  %div2 = udiv i32 %a, %div
722*9880d681SAndroid Build Coastguard Worker  ret i32 %div2
723*9880d681SAndroid Build Coastguard Worker}
724*9880d681SAndroid Build Coastguard Worker
725*9880d681SAndroid Build Coastguard Workerdefine i32 @test44(i32 %a) nounwind {
726*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test44(
727*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = shl i32 %a, 5
728*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Y]]
729*9880d681SAndroid Build Coastguard Worker;
730*9880d681SAndroid Build Coastguard Worker  %y = shl nuw i32 %a, 1
731*9880d681SAndroid Build Coastguard Worker  %z = shl i32 %y, 4
732*9880d681SAndroid Build Coastguard Worker  ret i32 %z
733*9880d681SAndroid Build Coastguard Worker}
734*9880d681SAndroid Build Coastguard Worker
735*9880d681SAndroid Build Coastguard Workerdefine i32 @test45(i32 %a) nounwind {
736*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test45(
737*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = lshr i32 %a, 5
738*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Y]]
739*9880d681SAndroid Build Coastguard Worker;
740*9880d681SAndroid Build Coastguard Worker  %y = lshr exact i32 %a, 1
741*9880d681SAndroid Build Coastguard Worker  %z = lshr i32 %y, 4
742*9880d681SAndroid Build Coastguard Worker  ret i32 %z
743*9880d681SAndroid Build Coastguard Worker}
744*9880d681SAndroid Build Coastguard Worker
745*9880d681SAndroid Build Coastguard Workerdefine i32 @test46(i32 %a) {
746*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test46(
747*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = ashr exact i32 %a, 2
748*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
749*9880d681SAndroid Build Coastguard Worker;
750*9880d681SAndroid Build Coastguard Worker  %y = ashr exact i32 %a, 3
751*9880d681SAndroid Build Coastguard Worker  %z = shl i32 %y, 1
752*9880d681SAndroid Build Coastguard Worker  ret i32 %z
753*9880d681SAndroid Build Coastguard Worker}
754*9880d681SAndroid Build Coastguard Worker
755*9880d681SAndroid Build Coastguard Workerdefine i32 @test47(i32 %a) {
756*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test47(
757*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = lshr exact i32 %a, 2
758*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
759*9880d681SAndroid Build Coastguard Worker;
760*9880d681SAndroid Build Coastguard Worker  %y = lshr exact i32 %a, 3
761*9880d681SAndroid Build Coastguard Worker  %z = shl i32 %y, 1
762*9880d681SAndroid Build Coastguard Worker  ret i32 %z
763*9880d681SAndroid Build Coastguard Worker}
764*9880d681SAndroid Build Coastguard Worker
765*9880d681SAndroid Build Coastguard Workerdefine i32 @test48(i32 %x) {
766*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test48(
767*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = shl i32 %x, 2
768*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[B]]
769*9880d681SAndroid Build Coastguard Worker;
770*9880d681SAndroid Build Coastguard Worker  %A = lshr exact i32 %x, 1
771*9880d681SAndroid Build Coastguard Worker  %B = shl i32 %A, 3
772*9880d681SAndroid Build Coastguard Worker  ret i32 %B
773*9880d681SAndroid Build Coastguard Worker}
774*9880d681SAndroid Build Coastguard Worker
775*9880d681SAndroid Build Coastguard Workerdefine i32 @test49(i32 %x) {
776*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test49(
777*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = shl i32 %x, 2
778*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[B]]
779*9880d681SAndroid Build Coastguard Worker;
780*9880d681SAndroid Build Coastguard Worker  %A = ashr exact i32 %x, 1
781*9880d681SAndroid Build Coastguard Worker  %B = shl i32 %A, 3
782*9880d681SAndroid Build Coastguard Worker  ret i32 %B
783*9880d681SAndroid Build Coastguard Worker}
784*9880d681SAndroid Build Coastguard Worker
785*9880d681SAndroid Build Coastguard Workerdefine i32 @test50(i32 %x) {
786*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test50(
787*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = ashr i32 %x, 2
788*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[B]]
789*9880d681SAndroid Build Coastguard Worker;
790*9880d681SAndroid Build Coastguard Worker  %A = shl nsw i32 %x, 1
791*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 %A, 3
792*9880d681SAndroid Build Coastguard Worker  ret i32 %B
793*9880d681SAndroid Build Coastguard Worker}
794*9880d681SAndroid Build Coastguard Worker
795*9880d681SAndroid Build Coastguard Workerdefine i32 @test51(i32 %x) {
796*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test51(
797*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = lshr i32 %x, 2
798*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[B]]
799*9880d681SAndroid Build Coastguard Worker;
800*9880d681SAndroid Build Coastguard Worker  %A = shl nuw i32 %x, 1
801*9880d681SAndroid Build Coastguard Worker  %B = lshr i32 %A, 3
802*9880d681SAndroid Build Coastguard Worker  ret i32 %B
803*9880d681SAndroid Build Coastguard Worker}
804*9880d681SAndroid Build Coastguard Worker
805*9880d681SAndroid Build Coastguard Workerdefine i32 @test52(i32 %x) {
806*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test52(
807*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = shl nsw i32 %x, 2
808*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[B]]
809*9880d681SAndroid Build Coastguard Worker;
810*9880d681SAndroid Build Coastguard Worker  %A = shl nsw i32 %x, 3
811*9880d681SAndroid Build Coastguard Worker  %B = ashr i32 %A, 1
812*9880d681SAndroid Build Coastguard Worker  ret i32 %B
813*9880d681SAndroid Build Coastguard Worker}
814*9880d681SAndroid Build Coastguard Worker
815*9880d681SAndroid Build Coastguard Workerdefine i32 @test53(i32 %x) {
816*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test53(
817*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = shl nuw i32 %x, 2
818*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[B]]
819*9880d681SAndroid Build Coastguard Worker;
820*9880d681SAndroid Build Coastguard Worker  %A = shl nuw i32 %x, 3
821*9880d681SAndroid Build Coastguard Worker  %B = lshr i32 %A, 1
822*9880d681SAndroid Build Coastguard Worker  ret i32 %B
823*9880d681SAndroid Build Coastguard Worker}
824*9880d681SAndroid Build Coastguard Worker
825*9880d681SAndroid Build Coastguard Workerdefine i32 @test54(i32 %x) {
826*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test54(
827*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shl i32 %x, 3
828*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND:%.*]] = and i32 [[TMP1]], 16
829*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[AND]]
830*9880d681SAndroid Build Coastguard Worker;
831*9880d681SAndroid Build Coastguard Worker  %shr2 = lshr i32 %x, 1
832*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %shr2, 4
833*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shl, 16
834*9880d681SAndroid Build Coastguard Worker  ret i32 %and
835*9880d681SAndroid Build Coastguard Worker}
836*9880d681SAndroid Build Coastguard Worker
837*9880d681SAndroid Build Coastguard Worker
838*9880d681SAndroid Build Coastguard Workerdefine i32 @test55(i32 %x) {
839*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test55(
840*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shl i32 %x, 3
841*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = or i32 [[TMP1]], 8
842*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[OR]]
843*9880d681SAndroid Build Coastguard Worker;
844*9880d681SAndroid Build Coastguard Worker  %shr2 = lshr i32 %x, 1
845*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %shr2, 4
846*9880d681SAndroid Build Coastguard Worker  %or = or i32 %shl, 8
847*9880d681SAndroid Build Coastguard Worker  ret i32 %or
848*9880d681SAndroid Build Coastguard Worker}
849*9880d681SAndroid Build Coastguard Worker
850*9880d681SAndroid Build Coastguard Workerdefine i32 @test56(i32 %x) {
851*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test56(
852*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHR2:%.*]] = lshr i32 %x, 1
853*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[SHR2]], 4
854*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], 7
855*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[OR]]
856*9880d681SAndroid Build Coastguard Worker;
857*9880d681SAndroid Build Coastguard Worker  %shr2 = lshr i32 %x, 1
858*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %shr2, 4
859*9880d681SAndroid Build Coastguard Worker  %or = or i32 %shl, 7
860*9880d681SAndroid Build Coastguard Worker  ret i32 %or
861*9880d681SAndroid Build Coastguard Worker}
862*9880d681SAndroid Build Coastguard Worker
863*9880d681SAndroid Build Coastguard Worker
864*9880d681SAndroid Build Coastguard Workerdefine i32 @test57(i32 %x) {
865*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test57(
866*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHR1:%.*]] = lshr i32 %x, 1
867*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[SHR1]], 4
868*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], 7
869*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[OR]]
870*9880d681SAndroid Build Coastguard Worker;
871*9880d681SAndroid Build Coastguard Worker  %shr = ashr i32 %x, 1
872*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %shr, 4
873*9880d681SAndroid Build Coastguard Worker  %or = or i32 %shl, 7
874*9880d681SAndroid Build Coastguard Worker  ret i32 %or
875*9880d681SAndroid Build Coastguard Worker}
876*9880d681SAndroid Build Coastguard Worker
877*9880d681SAndroid Build Coastguard Worker
878*9880d681SAndroid Build Coastguard Workerdefine i32 @test58(i32 %x) {
879*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test58(
880*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = ashr i32 %x, 3
881*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = or i32 [[TMP1]], 1
882*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[OR]]
883*9880d681SAndroid Build Coastguard Worker;
884*9880d681SAndroid Build Coastguard Worker  %shr = ashr i32 %x, 4
885*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %shr, 1
886*9880d681SAndroid Build Coastguard Worker  %or = or i32 %shl, 1
887*9880d681SAndroid Build Coastguard Worker  ret i32 %or
888*9880d681SAndroid Build Coastguard Worker}
889*9880d681SAndroid Build Coastguard Worker
890*9880d681SAndroid Build Coastguard Worker
891*9880d681SAndroid Build Coastguard Workerdefine i32 @test59(i32 %x) {
892*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test59(
893*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHR:%.*]] = ashr i32 %x, 4
894*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHL:%.*]] = shl nsw i32 [[SHR]], 1
895*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], 2
896*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[OR]]
897*9880d681SAndroid Build Coastguard Worker;
898*9880d681SAndroid Build Coastguard Worker  %shr = ashr i32 %x, 4
899*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %shr, 1
900*9880d681SAndroid Build Coastguard Worker  %or = or i32 %shl, 2
901*9880d681SAndroid Build Coastguard Worker  ret i32 %or
902*9880d681SAndroid Build Coastguard Worker}
903*9880d681SAndroid Build Coastguard Worker
904*9880d681SAndroid Build Coastguard Worker; propagate "exact" trait
905*9880d681SAndroid Build Coastguard Workerdefine i32 @test60(i32 %x) {
906*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60(
907*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHL:%.*]] = ashr exact i32 %x, 3
908*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], 1
909*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[OR]]
910*9880d681SAndroid Build Coastguard Worker;
911*9880d681SAndroid Build Coastguard Worker  %shr = ashr exact i32 %x, 4
912*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %shr, 1
913*9880d681SAndroid Build Coastguard Worker  %or = or i32 %shl, 1
914*9880d681SAndroid Build Coastguard Worker  ret i32 %or
915*9880d681SAndroid Build Coastguard Worker}
916*9880d681SAndroid Build Coastguard Worker
917*9880d681SAndroid Build Coastguard Worker; PR17026
918*9880d681SAndroid Build Coastguard Workerdefine void @test61(i128 %arg) {
919*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test61(
920*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  bb:
921*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 undef, label %bb1, label %bb12
922*9880d681SAndroid Build Coastguard Worker; CHECK:       bb1:
923*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br label %bb2
924*9880d681SAndroid Build Coastguard Worker; CHECK:       bb2:
925*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 undef, label %bb3, label %bb7
926*9880d681SAndroid Build Coastguard Worker; CHECK:       bb3:
927*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br label %bb8
928*9880d681SAndroid Build Coastguard Worker; CHECK:       bb7:
929*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 undef, label %bb8, label %bb2
930*9880d681SAndroid Build Coastguard Worker; CHECK:       bb8:
931*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 undef, label %bb11, label %bb12
932*9880d681SAndroid Build Coastguard Worker; CHECK:       bb11:
933*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    br i1 undef, label %bb1, label %bb12
934*9880d681SAndroid Build Coastguard Worker; CHECK:       bb12:
935*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
936*9880d681SAndroid Build Coastguard Worker;
937*9880d681SAndroid Build Coastguard Workerbb:
938*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %bb1, label %bb12
939*9880d681SAndroid Build Coastguard Worker
940*9880d681SAndroid Build Coastguard Workerbb1:                                              ; preds = %bb11, %bb
941*9880d681SAndroid Build Coastguard Worker  br label %bb2
942*9880d681SAndroid Build Coastguard Worker
943*9880d681SAndroid Build Coastguard Workerbb2:                                              ; preds = %bb7, %bb1
944*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %bb3, label %bb7
945*9880d681SAndroid Build Coastguard Worker
946*9880d681SAndroid Build Coastguard Workerbb3:                                              ; preds = %bb2
947*9880d681SAndroid Build Coastguard Worker  %tmp = lshr i128 %arg, 36893488147419103232
948*9880d681SAndroid Build Coastguard Worker  %tmp4 = shl i128 %tmp, 0
949*9880d681SAndroid Build Coastguard Worker  %tmp5 = or i128 %tmp4, undef
950*9880d681SAndroid Build Coastguard Worker  %tmp6 = trunc i128 %tmp5 to i16
951*9880d681SAndroid Build Coastguard Worker  br label %bb8
952*9880d681SAndroid Build Coastguard Worker
953*9880d681SAndroid Build Coastguard Workerbb7:                                              ; preds = %bb2
954*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %bb8, label %bb2
955*9880d681SAndroid Build Coastguard Worker
956*9880d681SAndroid Build Coastguard Workerbb8:                                              ; preds = %bb7, %bb3
957*9880d681SAndroid Build Coastguard Worker  %tmp9 = phi i16 [ %tmp6, %bb3 ], [ undef, %bb7 ]
958*9880d681SAndroid Build Coastguard Worker  %tmp10 = icmp eq i16 %tmp9, 0
959*9880d681SAndroid Build Coastguard Worker  br i1 %tmp10, label %bb11, label %bb12
960*9880d681SAndroid Build Coastguard Worker
961*9880d681SAndroid Build Coastguard Workerbb11:                                             ; preds = %bb8
962*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %bb1, label %bb12
963*9880d681SAndroid Build Coastguard Worker
964*9880d681SAndroid Build Coastguard Workerbb12:                                             ; preds = %bb11, %bb8, %bb
965*9880d681SAndroid Build Coastguard Worker  ret void
966*9880d681SAndroid Build Coastguard Worker}
967*9880d681SAndroid Build Coastguard Worker
968*9880d681SAndroid Build Coastguard Workerdefine i32 @test62(i32 %a) {
969*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62(
970*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 undef
971*9880d681SAndroid Build Coastguard Worker;
972*9880d681SAndroid Build Coastguard Worker  %b = ashr i32 %a, 32  ; shift all bits out
973*9880d681SAndroid Build Coastguard Worker  ret i32 %b
974*9880d681SAndroid Build Coastguard Worker}
975*9880d681SAndroid Build Coastguard Worker
976*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test62_splat_vector(<4 x i32> %a) {
977*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62_splat_vector(
978*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> undef
979*9880d681SAndroid Build Coastguard Worker;
980*9880d681SAndroid Build Coastguard Worker  %b = ashr <4 x i32> %a, <i32 32, i32 32, i32 32, i32 32>  ; shift all bits out
981*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
982*9880d681SAndroid Build Coastguard Worker}
983*9880d681SAndroid Build Coastguard Worker
984*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test62_non_splat_vector(<4 x i32> %a) {
985*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62_non_splat_vector(
986*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = ashr <4 x i32> %a, <i32 32, i32 0, i32 1, i32 2>
987*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> [[B]]
988*9880d681SAndroid Build Coastguard Worker;
989*9880d681SAndroid Build Coastguard Worker  %b = ashr <4 x i32> %a, <i32 32, i32 0, i32 1, i32 2>  ; shift all bits out
990*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
991*9880d681SAndroid Build Coastguard Worker}
992*9880d681SAndroid Build Coastguard Worker
993*9880d681SAndroid Build Coastguard Workerdefine <2 x i65> @test_63(<2 x i64> %t) {
994*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_63(
995*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = zext <2 x i64> %t to <2 x i65>
996*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SEXT:%.*]] = shl <2 x i65> [[A]], <i65 33, i65 33>
997*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = ashr <2 x i65> [[SEXT]], <i65 33, i65 33>
998*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i65> [[B]]
999*9880d681SAndroid Build Coastguard Worker;
1000*9880d681SAndroid Build Coastguard Worker  %a = zext <2 x i64> %t to <2 x i65>
1001*9880d681SAndroid Build Coastguard Worker  %sext = shl <2 x i65> %a, <i65 33, i65 33>
1002*9880d681SAndroid Build Coastguard Worker  %b = ashr <2 x i65> %sext, <i65 33, i65 33>
1003*9880d681SAndroid Build Coastguard Worker  ret <2 x i65> %b
1004*9880d681SAndroid Build Coastguard Worker}
1005