xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/cast.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; Tests to make sure elimination of casts is working correctly
3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
4*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker@inbuf = external global [32832 x i8]           ; <[32832 x i8]*> [#uses=1]
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A) {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 %A
11*9880d681SAndroid Build Coastguard Worker;
12*9880d681SAndroid Build Coastguard Worker  %c1 = bitcast i32 %A to i32             ; <i32> [#uses=1]
13*9880d681SAndroid Build Coastguard Worker  %c2 = bitcast i32 %c1 to i32            ; <i32> [#uses=1]
14*9880d681SAndroid Build Coastguard Worker  ret i32 %c2
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine i64 @test2(i8 %A) {
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RET:%.*]] = zext i8 %A to i64
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[RET]]
21*9880d681SAndroid Build Coastguard Worker;
22*9880d681SAndroid Build Coastguard Worker  %c1 = zext i8 %A to i16         ; <i16> [#uses=1]
23*9880d681SAndroid Build Coastguard Worker  %c2 = zext i16 %c1 to i32               ; <i32> [#uses=1]
24*9880d681SAndroid Build Coastguard Worker  %Ret = zext i32 %c2 to i64              ; <i64> [#uses=1]
25*9880d681SAndroid Build Coastguard Worker  ret i64 %Ret
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; This function should just use bitwise AND
29*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i64 %A) {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C2:%.*]] = and i64 %A, 255
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[C2]]
33*9880d681SAndroid Build Coastguard Worker;
34*9880d681SAndroid Build Coastguard Worker  %c1 = trunc i64 %A to i8                ; <i8> [#uses=1]
35*9880d681SAndroid Build Coastguard Worker  %c2 = zext i8 %c1 to i64                ; <i64> [#uses=1]
36*9880d681SAndroid Build Coastguard Worker  ret i64 %c2
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %A, i32 %B) {
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 %A, %B
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RESULT:%.*]] = zext i1 [[COND]] to i32
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[RESULT]]
44*9880d681SAndroid Build Coastguard Worker;
45*9880d681SAndroid Build Coastguard Worker  %COND = icmp slt i32 %A, %B             ; <i1> [#uses=1]
46*9880d681SAndroid Build Coastguard Worker  ; Booleans are unsigned integrals
47*9880d681SAndroid Build Coastguard Worker  %c = zext i1 %COND to i8                ; <i8> [#uses=1]
48*9880d681SAndroid Build Coastguard Worker  ; for the cast elim purpose
49*9880d681SAndroid Build Coastguard Worker  %result = zext i8 %c to i32             ; <i32> [#uses=1]
50*9880d681SAndroid Build Coastguard Worker  ret i32 %result
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i1 %B) {
54*9880d681SAndroid Build Coastguard Worker        ; This cast should get folded into
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RESULT:%.*]] = zext i1 %B to i32
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[RESULT]]
58*9880d681SAndroid Build Coastguard Worker;
59*9880d681SAndroid Build Coastguard Worker  %c = zext i1 %B to i8           ; <i8> [#uses=1]
60*9880d681SAndroid Build Coastguard Worker  ; this cast
61*9880d681SAndroid Build Coastguard Worker  %result = zext i8 %c to i32             ; <i32> [#uses=1]
62*9880d681SAndroid Build Coastguard Worker  ret i32 %result
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i64 %A) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C1:%.*]] = trunc i64 %A to i32
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[C1]]
69*9880d681SAndroid Build Coastguard Worker;
70*9880d681SAndroid Build Coastguard Worker  %c1 = trunc i64 %A to i32               ; <i32> [#uses=1]
71*9880d681SAndroid Build Coastguard Worker  %res = bitcast i32 %c1 to i32           ; <i32> [#uses=1]
72*9880d681SAndroid Build Coastguard Worker  ret i32 %res
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdefine i64 @test7(i1 %A) {
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[RES:%.*]] = zext i1 %A to i64
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[RES]]
79*9880d681SAndroid Build Coastguard Worker;
80*9880d681SAndroid Build Coastguard Worker  %c1 = zext i1 %A to i32         ; <i32> [#uses=1]
81*9880d681SAndroid Build Coastguard Worker  %res = sext i32 %c1 to i64              ; <i64> [#uses=1]
82*9880d681SAndroid Build Coastguard Worker  ret i64 %res
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine i64 @test8(i8 %A) {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C1:%.*]] = sext i8 %A to i64
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[C1]]
89*9880d681SAndroid Build Coastguard Worker;
90*9880d681SAndroid Build Coastguard Worker  %c1 = sext i8 %A to i64         ; <i64> [#uses=1]
91*9880d681SAndroid Build Coastguard Worker  %res = bitcast i64 %c1 to i64           ; <i64> [#uses=1]
92*9880d681SAndroid Build Coastguard Worker  ret i64 %res
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine i16 @test9(i16 %A) {
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 %A
98*9880d681SAndroid Build Coastguard Worker;
99*9880d681SAndroid Build Coastguard Worker  %c1 = sext i16 %A to i32                ; <i32> [#uses=1]
100*9880d681SAndroid Build Coastguard Worker  %c2 = trunc i32 %c1 to i16              ; <i16> [#uses=1]
101*9880d681SAndroid Build Coastguard Worker  ret i16 %c2
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerdefine i16 @test10(i16 %A) {
105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 %A
107*9880d681SAndroid Build Coastguard Worker;
108*9880d681SAndroid Build Coastguard Worker  %c1 = sext i16 %A to i32                ; <i32> [#uses=1]
109*9880d681SAndroid Build Coastguard Worker  %c2 = trunc i32 %c1 to i16              ; <i16> [#uses=1]
110*9880d681SAndroid Build Coastguard Worker  ret i16 %c2
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdeclare void @varargs(i32, ...)
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine void @test11(i32* %P) {
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    call void (i32, ...) @varargs(i32 5, i32* %P)
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
119*9880d681SAndroid Build Coastguard Worker;
120*9880d681SAndroid Build Coastguard Worker  %c = bitcast i32* %P to i16*            ; <i16*> [#uses=1]
121*9880d681SAndroid Build Coastguard Worker  call void (i32, ...) @varargs( i32 5, i16* %c )
122*9880d681SAndroid Build Coastguard Worker  ret void
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...)
126*9880d681SAndroid Build Coastguard Workerdefine void @test_invoke_vararg_cast(i32* %a, i32* %b) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_invoke_vararg_cast(
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    invoke void (i32, ...) @varargs(i32 1, i32* %b, i32* %a)
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    to label %invoke.cont unwind label %lpad
131*9880d681SAndroid Build Coastguard Worker; CHECK:       invoke.cont:
132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
133*9880d681SAndroid Build Coastguard Worker; CHECK:       lpad:
134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP0:%.*]] = landingpad { i8*, i32
135*9880d681SAndroid Build Coastguard Worker;
136*9880d681SAndroid Build Coastguard Workerentry:
137*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i32* %b to i8*
138*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i32* %a to i64*
139*9880d681SAndroid Build Coastguard Worker  invoke void (i32, ...) @varargs(i32 1, i8* %0, i64* %1)
140*9880d681SAndroid Build Coastguard Worker  to label %invoke.cont unwind label %lpad
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Workerinvoke.cont:                                      ; preds = %entry
143*9880d681SAndroid Build Coastguard Worker  ret void
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerlpad:                                             ; preds = %entry
146*9880d681SAndroid Build Coastguard Worker  %2 = landingpad { i8*, i32 }
147*9880d681SAndroid Build Coastguard Worker  cleanup
148*9880d681SAndroid Build Coastguard Worker  ret void
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdefine i8* @test13(i64 %A) {
152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13(
153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = getelementptr [32832 x i8], [32832 x i8]* @inbuf, i64 0, i64 %A
154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8* [[C]]
155*9880d681SAndroid Build Coastguard Worker;
156*9880d681SAndroid Build Coastguard Worker  %c = getelementptr [0 x i8], [0 x i8]* bitcast ([32832 x i8]* @inbuf to [0 x i8]*), i64 0, i64 %A             ; <i8*> [#uses=1]
157*9880d681SAndroid Build Coastguard Worker  ret i8* %c
158*9880d681SAndroid Build Coastguard Worker}
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerdefine i1 @test14(i8 %A) {
161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14(
162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[X:%.*]] = icmp sgt i8 %A, -1
163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[X]]
164*9880d681SAndroid Build Coastguard Worker;
165*9880d681SAndroid Build Coastguard Worker  %c = bitcast i8 %A to i8                ; <i8> [#uses=1]
166*9880d681SAndroid Build Coastguard Worker  %X = icmp ult i8 %c, -128               ; <i1> [#uses=1]
167*9880d681SAndroid Build Coastguard Worker  ret i1 %X
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker; This just won't occur when there's no difference between ubyte and sbyte
172*9880d681SAndroid Build Coastguard Worker;bool %test15(ubyte %A) {
173*9880d681SAndroid Build Coastguard Worker;        %c = cast ubyte %A to sbyte
174*9880d681SAndroid Build Coastguard Worker;        %X = setlt sbyte %c, 0   ; setgt %A, 127
175*9880d681SAndroid Build Coastguard Worker;        ret bool %X
176*9880d681SAndroid Build Coastguard Worker;}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerdefine i1 @test16(i32* %P) {
179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16(
180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = icmp ne i32* %P, null
181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[C]]
182*9880d681SAndroid Build Coastguard Worker;
183*9880d681SAndroid Build Coastguard Worker  %c = icmp ne i32* %P, null              ; <i1> [#uses=1]
184*9880d681SAndroid Build Coastguard Worker  ret i1 %c
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Workerdefine i16 @test17(i1 %tmp3) {
188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17(
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T86:%.*]] = zext i1 %tmp3 to i16
190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[T86]]
191*9880d681SAndroid Build Coastguard Worker;
192*9880d681SAndroid Build Coastguard Worker  %c = zext i1 %tmp3 to i32               ; <i32> [#uses=1]
193*9880d681SAndroid Build Coastguard Worker  %t86 = trunc i32 %c to i16              ; <i16> [#uses=1]
194*9880d681SAndroid Build Coastguard Worker  ret i16 %t86
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdefine i16 @test18(i8 %tmp3) {
198*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18(
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T86:%.*]] = sext i8 %tmp3 to i16
200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[T86]]
201*9880d681SAndroid Build Coastguard Worker;
202*9880d681SAndroid Build Coastguard Worker  %c = sext i8 %tmp3 to i32               ; <i32> [#uses=1]
203*9880d681SAndroid Build Coastguard Worker  %t86 = trunc i32 %c to i16              ; <i16> [#uses=1]
204*9880d681SAndroid Build Coastguard Worker  ret i16 %t86
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdefine i1 @test19(i32 %X) {
208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19(
209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = icmp slt i32 %X, 12345
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[Z]]
211*9880d681SAndroid Build Coastguard Worker;
212*9880d681SAndroid Build Coastguard Worker  %c = sext i32 %X to i64
213*9880d681SAndroid Build Coastguard Worker  %Z = icmp slt i64 %c, 12345
214*9880d681SAndroid Build Coastguard Worker  ret i1 %Z
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test19vec(<2 x i32> %X) {
218*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19vec(
219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = icmp slt <2 x i32> %X, <i32 12345, i32 2147483647>
220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i1> [[Z]]
221*9880d681SAndroid Build Coastguard Worker;
222*9880d681SAndroid Build Coastguard Worker  %c = sext <2 x i32> %X to <2 x i64>
223*9880d681SAndroid Build Coastguard Worker  %Z = icmp slt <2 x i64> %c, <i64 12345, i64 2147483647>
224*9880d681SAndroid Build Coastguard Worker  ret <2 x i1> %Z
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerdefine <3 x i1> @test19vec2(<3 x i1> %X) {
228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19vec2(
229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMPEQ:%.*]] = xor <3 x i1> %X, <i1 true, i1 true, i1 true>
230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <3 x i1> [[CMPEQ]]
231*9880d681SAndroid Build Coastguard Worker;
232*9880d681SAndroid Build Coastguard Worker  %sext = sext <3 x i1> %X to <3 x i32>
233*9880d681SAndroid Build Coastguard Worker  %cmpeq = icmp eq <3 x i32> %sext, zeroinitializer
234*9880d681SAndroid Build Coastguard Worker  ret <3 x i1> %cmpeq
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerdefine i1 @test20(i1 %B) {
238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20(
239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
240*9880d681SAndroid Build Coastguard Worker;
241*9880d681SAndroid Build Coastguard Worker  %c = zext i1 %B to i32          ; <i32> [#uses=1]
242*9880d681SAndroid Build Coastguard Worker  %D = icmp slt i32 %c, -1                ; <i1> [#uses=1]
243*9880d681SAndroid Build Coastguard Worker  ;; false
244*9880d681SAndroid Build Coastguard Worker  ret i1 %D
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Workerdefine i32 @test21(i32 %X) {
248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21(
249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C21:%.*]] = and i32 %X, 255
250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[C21]]
251*9880d681SAndroid Build Coastguard Worker;
252*9880d681SAndroid Build Coastguard Worker  %c1 = trunc i32 %X to i8                ; <i8> [#uses=1]
253*9880d681SAndroid Build Coastguard Worker  ;; sext -> zext -> and -> nop
254*9880d681SAndroid Build Coastguard Worker  %c2 = sext i8 %c1 to i32                ; <i32> [#uses=1]
255*9880d681SAndroid Build Coastguard Worker  %RV = and i32 %c2, 255          ; <i32> [#uses=1]
256*9880d681SAndroid Build Coastguard Worker  ret i32 %RV
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdefine i32 @test22(i32 %X) {
260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22(
261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SEXT:%.*]] = shl i32 %X, 24
262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[SEXT]]
263*9880d681SAndroid Build Coastguard Worker;
264*9880d681SAndroid Build Coastguard Worker  %c1 = trunc i32 %X to i8                ; <i8> [#uses=1]
265*9880d681SAndroid Build Coastguard Worker  ;; sext -> zext -> and -> nop
266*9880d681SAndroid Build Coastguard Worker  %c2 = sext i8 %c1 to i32                ; <i32> [#uses=1]
267*9880d681SAndroid Build Coastguard Worker  %RV = shl i32 %c2, 24           ; <i32> [#uses=1]
268*9880d681SAndroid Build Coastguard Worker  ret i32 %RV
269*9880d681SAndroid Build Coastguard Worker}
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Workerdefine i32 @test23(i32 %X) {
272*9880d681SAndroid Build Coastguard Worker        ;; Turn into an AND even though X
273*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23(
274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C2:%.*]] = and i32 %X, 65535
275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[C2]]
276*9880d681SAndroid Build Coastguard Worker;
277*9880d681SAndroid Build Coastguard Worker  %c1 = trunc i32 %X to i16               ; <i16> [#uses=1]
278*9880d681SAndroid Build Coastguard Worker  ;; and Z are signed.
279*9880d681SAndroid Build Coastguard Worker  %c2 = zext i16 %c1 to i32               ; <i32> [#uses=1]
280*9880d681SAndroid Build Coastguard Worker  ret i32 %c2
281*9880d681SAndroid Build Coastguard Worker}
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Workerdefine i1 @test24(i1 %C) {
284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24(
285*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
286*9880d681SAndroid Build Coastguard Worker;
287*9880d681SAndroid Build Coastguard Worker  %X = select i1 %C, i32 14, i32 1234             ; <i32> [#uses=1]
288*9880d681SAndroid Build Coastguard Worker  ;; Fold cast into select
289*9880d681SAndroid Build Coastguard Worker  %c = icmp ne i32 %X, 0          ; <i1> [#uses=1]
290*9880d681SAndroid Build Coastguard Worker  ret i1 %c
291*9880d681SAndroid Build Coastguard Worker}
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Workerdefine i32 @test26(float %F) {
294*9880d681SAndroid Build Coastguard Worker        ;; no need to cast from float->double.
295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26(
296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = fptosi float %F to i32
297*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[D]]
298*9880d681SAndroid Build Coastguard Worker;
299*9880d681SAndroid Build Coastguard Worker  %c = fpext float %F to double           ; <double> [#uses=1]
300*9880d681SAndroid Build Coastguard Worker  %D = fptosi double %c to i32            ; <i32> [#uses=1]
301*9880d681SAndroid Build Coastguard Worker  ret i32 %D
302*9880d681SAndroid Build Coastguard Worker}
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Workerdefine [4 x float]* @test27([9 x [4 x float]]* %A) {
305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27(
306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = getelementptr inbounds [9 x [4 x float]], [9 x [4 x float]]* %A, i64 0, i64 0
307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret [4 x float]* [[C]]
308*9880d681SAndroid Build Coastguard Worker;
309*9880d681SAndroid Build Coastguard Worker  %c = bitcast [9 x [4 x float]]* %A to [4 x float]*              ; <[4 x float]*> [#uses=1]
310*9880d681SAndroid Build Coastguard Worker  ret [4 x float]* %c
311*9880d681SAndroid Build Coastguard Worker}
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Workerdefine float* @test28([4 x float]* %A) {
314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28(
315*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = getelementptr inbounds [4 x float], [4 x float]* %A, i64 0, i64 0
316*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret float* [[C]]
317*9880d681SAndroid Build Coastguard Worker;
318*9880d681SAndroid Build Coastguard Worker  %c = bitcast [4 x float]* %A to float*          ; <float*> [#uses=1]
319*9880d681SAndroid Build Coastguard Worker  ret float* %c
320*9880d681SAndroid Build Coastguard Worker}
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Workerdefine i32 @test29(i32 %c1, i32 %c2) {
323*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29(
324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = or i32 %c2, %c1
325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP10:%.*]] = and i32 [[TMP2]], 255
326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP10]]
327*9880d681SAndroid Build Coastguard Worker;
328*9880d681SAndroid Build Coastguard Worker  %tmp1 = trunc i32 %c1 to i8             ; <i8> [#uses=1]
329*9880d681SAndroid Build Coastguard Worker  %tmp4.mask = trunc i32 %c2 to i8                ; <i8> [#uses=1]
330*9880d681SAndroid Build Coastguard Worker  %tmp = or i8 %tmp4.mask, %tmp1          ; <i8> [#uses=1]
331*9880d681SAndroid Build Coastguard Worker  %tmp10 = zext i8 %tmp to i32            ; <i32> [#uses=1]
332*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp10
333*9880d681SAndroid Build Coastguard Worker}
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Workerdefine i32 @test30(i32 %c1) {
336*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30(
337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C3:%.*]] = and i32 %c1, 255
338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C4:%.*]] = xor i32 [[C3]], 1
339*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[C4]]
340*9880d681SAndroid Build Coastguard Worker;
341*9880d681SAndroid Build Coastguard Worker  %c2 = trunc i32 %c1 to i8               ; <i8> [#uses=1]
342*9880d681SAndroid Build Coastguard Worker  %c3 = xor i8 %c2, 1             ; <i8> [#uses=1]
343*9880d681SAndroid Build Coastguard Worker  %c4 = zext i8 %c3 to i32                ; <i32> [#uses=1]
344*9880d681SAndroid Build Coastguard Worker  ret i32 %c4
345*9880d681SAndroid Build Coastguard Worker}
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Workerdefine i1 @test31(i64 %A) {
348*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31(
349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = and i64 %A, 42
350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = icmp eq i64 [[C]], 10
351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[D]]
352*9880d681SAndroid Build Coastguard Worker;
353*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %A to i32                ; <i32> [#uses=1]
354*9880d681SAndroid Build Coastguard Worker  %C = and i32 %B, 42             ; <i32> [#uses=1]
355*9880d681SAndroid Build Coastguard Worker  %D = icmp eq i32 %C, 10         ; <i1> [#uses=1]
356*9880d681SAndroid Build Coastguard Worker  ret i1 %D
357*9880d681SAndroid Build Coastguard Worker}
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Workerdefine i32 @test33(i32 %c1) {
360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33(
361*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 %c1
362*9880d681SAndroid Build Coastguard Worker;
363*9880d681SAndroid Build Coastguard Worker  %x = bitcast i32 %c1 to float           ; <float> [#uses=1]
364*9880d681SAndroid Build Coastguard Worker  %y = bitcast float %x to i32            ; <i32> [#uses=1]
365*9880d681SAndroid Build Coastguard Worker  ret i32 %y
366*9880d681SAndroid Build Coastguard Worker}
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Workerdefine i16 @test34(i16 %a) {
369*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test34(
370*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP21:%.*]] = lshr i16 %a, 8
371*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[TMP21]]
372*9880d681SAndroid Build Coastguard Worker;
373*9880d681SAndroid Build Coastguard Worker  %c1 = zext i16 %a to i32                ; <i32> [#uses=1]
374*9880d681SAndroid Build Coastguard Worker  %tmp21 = lshr i32 %c1, 8                ; <i32> [#uses=1]
375*9880d681SAndroid Build Coastguard Worker  %c2 = trunc i32 %tmp21 to i16           ; <i16> [#uses=1]
376*9880d681SAndroid Build Coastguard Worker  ret i16 %c2
377*9880d681SAndroid Build Coastguard Worker}
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Workerdefine i16 @test35(i16 %a) {
380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test35(
381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = lshr i16 %a, 8
382*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[TMP2]]
383*9880d681SAndroid Build Coastguard Worker;
384*9880d681SAndroid Build Coastguard Worker  %c1 = bitcast i16 %a to i16             ; <i16> [#uses=1]
385*9880d681SAndroid Build Coastguard Worker  %tmp2 = lshr i16 %c1, 8         ; <i16> [#uses=1]
386*9880d681SAndroid Build Coastguard Worker  %c2 = bitcast i16 %tmp2 to i16          ; <i16> [#uses=1]
387*9880d681SAndroid Build Coastguard Worker  ret i16 %c2
388*9880d681SAndroid Build Coastguard Worker}
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker; icmp sgt i32 %a, -1
391*9880d681SAndroid Build Coastguard Worker; rdar://6480391
392*9880d681SAndroid Build Coastguard Workerdefine i1 @test36(i32 %a) {
393*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test36(
394*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = icmp sgt i32 %a, -1
395*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[D]]
396*9880d681SAndroid Build Coastguard Worker;
397*9880d681SAndroid Build Coastguard Worker  %b = lshr i32 %a, 31
398*9880d681SAndroid Build Coastguard Worker  %c = trunc i32 %b to i8
399*9880d681SAndroid Build Coastguard Worker  %d = icmp eq i8 %c, 0
400*9880d681SAndroid Build Coastguard Worker  ret i1 %d
401*9880d681SAndroid Build Coastguard Worker}
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker; ret i1 false
404*9880d681SAndroid Build Coastguard Workerdefine i1 @test37(i32 %a) {
405*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test37(
406*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
407*9880d681SAndroid Build Coastguard Worker;
408*9880d681SAndroid Build Coastguard Worker  %b = lshr i32 %a, 31
409*9880d681SAndroid Build Coastguard Worker  %c = or i32 %b, 512
410*9880d681SAndroid Build Coastguard Worker  %d = trunc i32 %c to i8
411*9880d681SAndroid Build Coastguard Worker  %e = icmp eq i8 %d, 11
412*9880d681SAndroid Build Coastguard Worker  ret i1 %e
413*9880d681SAndroid Build Coastguard Worker}
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Workerdefine i64 @test38(i32 %a) {
416*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test38(
417*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i32 %a, -2
418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = zext i1 [[TMP1]] to i64
419*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[TMP2]]
420*9880d681SAndroid Build Coastguard Worker;
421*9880d681SAndroid Build Coastguard Worker  %1 = icmp eq i32 %a, -2
422*9880d681SAndroid Build Coastguard Worker  %2 = zext i1 %1 to i8
423*9880d681SAndroid Build Coastguard Worker  %3 = xor i8 %2, 1
424*9880d681SAndroid Build Coastguard Worker  %4 = zext i8 %3 to i64
425*9880d681SAndroid Build Coastguard Worker  ret i64 %4
426*9880d681SAndroid Build Coastguard Worker}
427*9880d681SAndroid Build Coastguard Worker
428*9880d681SAndroid Build Coastguard Workerdefine i16 @test39(i16 %a) {
429*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test39(
430*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_UPGRD_32:%.*]] = call i16 @llvm.bswap.i16(i16 %a)
431*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[TMP_UPGRD_32]]
432*9880d681SAndroid Build Coastguard Worker;
433*9880d681SAndroid Build Coastguard Worker  %tmp = zext i16 %a to i32
434*9880d681SAndroid Build Coastguard Worker  %tmp21 = lshr i32 %tmp, 8
435*9880d681SAndroid Build Coastguard Worker  %tmp5 = shl i32 %tmp, 8
436*9880d681SAndroid Build Coastguard Worker  %tmp.upgrd.32 = or i32 %tmp21, %tmp5
437*9880d681SAndroid Build Coastguard Worker  %tmp.upgrd.3 = trunc i32 %tmp.upgrd.32 to i16
438*9880d681SAndroid Build Coastguard Worker  ret i16 %tmp.upgrd.3
439*9880d681SAndroid Build Coastguard Worker}
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Workerdefine i16 @test40(i16 %a) {
442*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test40(
443*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP21:%.*]] = lshr i16 %a, 9
444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP5:%.*]] = shl i16 %a, 8
445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP_UPGRD_32:%.*]] = or i16 [[TMP21]], [[TMP5]]
446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[TMP_UPGRD_32]]
447*9880d681SAndroid Build Coastguard Worker;
448*9880d681SAndroid Build Coastguard Worker  %tmp = zext i16 %a to i32
449*9880d681SAndroid Build Coastguard Worker  %tmp21 = lshr i32 %tmp, 9
450*9880d681SAndroid Build Coastguard Worker  %tmp5 = shl i32 %tmp, 8
451*9880d681SAndroid Build Coastguard Worker  %tmp.upgrd.32 = or i32 %tmp21, %tmp5
452*9880d681SAndroid Build Coastguard Worker  %tmp.upgrd.3 = trunc i32 %tmp.upgrd.32 to i16
453*9880d681SAndroid Build Coastguard Worker  ret i16 %tmp.upgrd.3
454*9880d681SAndroid Build Coastguard Worker}
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Worker; PR1263
457*9880d681SAndroid Build Coastguard Workerdefine i32* @test41(i32* %tmp1) {
458*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41(
459*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32* %tmp1
460*9880d681SAndroid Build Coastguard Worker;
461*9880d681SAndroid Build Coastguard Worker  %tmp64 = bitcast i32* %tmp1 to { i32 }*
462*9880d681SAndroid Build Coastguard Worker  %tmp65 = getelementptr { i32 }, { i32 }* %tmp64, i32 0, i32 0
463*9880d681SAndroid Build Coastguard Worker  ret i32* %tmp65
464*9880d681SAndroid Build Coastguard Worker}
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Workerdefine i32 addrspace(1)* @test41_addrspacecast_smaller(i32* %tmp1) {
467*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41_addrspacecast_smaller(
468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP65:%.*]] = addrspacecast i32* %tmp1 to i32 addrspace(1)*
469*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 addrspace(1)* [[TMP65]]
470*9880d681SAndroid Build Coastguard Worker;
471*9880d681SAndroid Build Coastguard Worker  %tmp64 = addrspacecast i32* %tmp1 to { i32 } addrspace(1)*
472*9880d681SAndroid Build Coastguard Worker  %tmp65 = getelementptr { i32 }, { i32 } addrspace(1)* %tmp64, i32 0, i32 0
473*9880d681SAndroid Build Coastguard Worker  ret i32 addrspace(1)* %tmp65
474*9880d681SAndroid Build Coastguard Worker}
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Workerdefine i32* @test41_addrspacecast_larger(i32 addrspace(1)* %tmp1) {
477*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41_addrspacecast_larger(
478*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP65:%.*]] = addrspacecast i32 addrspace(1)* %tmp1 to i32*
479*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32* [[TMP65]]
480*9880d681SAndroid Build Coastguard Worker;
481*9880d681SAndroid Build Coastguard Worker  %tmp64 = addrspacecast i32 addrspace(1)* %tmp1 to { i32 }*
482*9880d681SAndroid Build Coastguard Worker  %tmp65 = getelementptr { i32 }, { i32 }* %tmp64, i32 0, i32 0
483*9880d681SAndroid Build Coastguard Worker  ret i32* %tmp65
484*9880d681SAndroid Build Coastguard Worker}
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Workerdefine i32 @test42(i32 %X) {
487*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test42(
488*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = and i32 %X, 255
489*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
490*9880d681SAndroid Build Coastguard Worker;
491*9880d681SAndroid Build Coastguard Worker  %Y = trunc i32 %X to i8         ; <i8> [#uses=1]
492*9880d681SAndroid Build Coastguard Worker  %Z = zext i8 %Y to i32          ; <i32> [#uses=1]
493*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
494*9880d681SAndroid Build Coastguard Worker}
495*9880d681SAndroid Build Coastguard Worker
496*9880d681SAndroid Build Coastguard Worker; rdar://6598839
497*9880d681SAndroid Build Coastguard Workerdefine zeroext i64 @test43(i8 zeroext %on_off) nounwind readonly {
498*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test43(
499*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = zext i8 %on_off to i64
500*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = add nsw i64 [[A]], -1
501*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[B]]
502*9880d681SAndroid Build Coastguard Worker;
503*9880d681SAndroid Build Coastguard Worker  %A = zext i8 %on_off to i32
504*9880d681SAndroid Build Coastguard Worker  %B = add i32 %A, -1
505*9880d681SAndroid Build Coastguard Worker  %C = sext i32 %B to i64
506*9880d681SAndroid Build Coastguard Worker  ret i64 %C  ;; Should be (add (zext i8 -> i64), -1)
507*9880d681SAndroid Build Coastguard Worker}
508*9880d681SAndroid Build Coastguard Worker
509*9880d681SAndroid Build Coastguard Workerdefine i64 @test44(i8 %T) {
510*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test44(
511*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = zext i8 %T to i64
512*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = or i64 [[A]], 1234
513*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[B]]
514*9880d681SAndroid Build Coastguard Worker;
515*9880d681SAndroid Build Coastguard Worker  %A = zext i8 %T to i16
516*9880d681SAndroid Build Coastguard Worker  %B = or i16 %A, 1234
517*9880d681SAndroid Build Coastguard Worker  %C = zext i16 %B to i64
518*9880d681SAndroid Build Coastguard Worker  ret i64 %C
519*9880d681SAndroid Build Coastguard Worker}
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Workerdefine i64 @test45(i8 %A, i64 %Q) {
522*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test45(
523*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = sext i8 %A to i64
524*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = or i64 [[B]], %Q
525*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = and i64 [[C]], 4294967295
526*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[E]]
527*9880d681SAndroid Build Coastguard Worker;
528*9880d681SAndroid Build Coastguard Worker  %D = trunc i64 %Q to i32  ;; should be removed
529*9880d681SAndroid Build Coastguard Worker  %B = sext i8 %A to i32
530*9880d681SAndroid Build Coastguard Worker  %C = or i32 %B, %D
531*9880d681SAndroid Build Coastguard Worker  %E = zext i32 %C to i64
532*9880d681SAndroid Build Coastguard Worker  ret i64 %E
533*9880d681SAndroid Build Coastguard Worker}
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker
536*9880d681SAndroid Build Coastguard Workerdefine i64 @test46(i64 %A) {
537*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test46(
538*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = shl i64 %A, 8
539*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = and i64 [[C]], 10752
540*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[D]]
541*9880d681SAndroid Build Coastguard Worker;
542*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %A to i32
543*9880d681SAndroid Build Coastguard Worker  %C = and i32 %B, 42
544*9880d681SAndroid Build Coastguard Worker  %D = shl i32 %C, 8
545*9880d681SAndroid Build Coastguard Worker  %E = zext i32 %D to i64
546*9880d681SAndroid Build Coastguard Worker  ret i64 %E
547*9880d681SAndroid Build Coastguard Worker}
548*9880d681SAndroid Build Coastguard Worker
549*9880d681SAndroid Build Coastguard Workerdefine i64 @test47(i8 %A) {
550*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test47(
551*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = sext i8 %A to i64
552*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = and i64 [[B]], 4294967253
553*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = or i64 [[C]], 42
554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[E]]
555*9880d681SAndroid Build Coastguard Worker;
556*9880d681SAndroid Build Coastguard Worker  %B = sext i8 %A to i32
557*9880d681SAndroid Build Coastguard Worker  %C = or i32 %B, 42
558*9880d681SAndroid Build Coastguard Worker  %E = zext i32 %C to i64
559*9880d681SAndroid Build Coastguard Worker  ret i64 %E
560*9880d681SAndroid Build Coastguard Worker}
561*9880d681SAndroid Build Coastguard Worker
562*9880d681SAndroid Build Coastguard Workerdefine i64 @test48(i8 %A1, i8 %a2) {
563*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test48(
564*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z2:%.*]] = zext i8 %A1 to i32
565*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = shl nuw nsw i32 [[Z2]], 8
566*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = or i32 [[C]], [[Z2]]
567*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = zext i32 [[D]] to i64
568*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[E]]
569*9880d681SAndroid Build Coastguard Worker;
570*9880d681SAndroid Build Coastguard Worker  %Z1 = zext i8 %a2 to i32
571*9880d681SAndroid Build Coastguard Worker  %Z2 = zext i8 %A1 to i32
572*9880d681SAndroid Build Coastguard Worker  %C = shl i32 %Z2, 8
573*9880d681SAndroid Build Coastguard Worker  %D = or i32 %C, %Z2
574*9880d681SAndroid Build Coastguard Worker  %E = zext i32 %D to i64
575*9880d681SAndroid Build Coastguard Worker  ret i64 %E
576*9880d681SAndroid Build Coastguard Worker}
577*9880d681SAndroid Build Coastguard Worker
578*9880d681SAndroid Build Coastguard Workerdefine i64 @test49(i64 %A) {
579*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test49(
580*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = shl i64 %A, 32
581*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SEXT:%.*]] = ashr exact i64 [[C]], 32
582*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = or i64 [[SEXT]], 1
583*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[D]]
584*9880d681SAndroid Build Coastguard Worker;
585*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %A to i32
586*9880d681SAndroid Build Coastguard Worker  %C = or i32 %B, 1
587*9880d681SAndroid Build Coastguard Worker  %D = sext i32 %C to i64
588*9880d681SAndroid Build Coastguard Worker  ret i64 %D
589*9880d681SAndroid Build Coastguard Worker}
590*9880d681SAndroid Build Coastguard Worker
591*9880d681SAndroid Build Coastguard Workerdefine i64 @test50(i64 %A) {
592*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test50(
593*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = lshr i64 %A, 2
594*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = shl i64 [[A]], 32
595*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SEXT:%.*]] = add i64 [[D]], -4294967296
596*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = ashr exact i64 [[SEXT]], 32
597*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[E]]
598*9880d681SAndroid Build Coastguard Worker;
599*9880d681SAndroid Build Coastguard Worker  %a = lshr i64 %A, 2
600*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %a to i32
601*9880d681SAndroid Build Coastguard Worker  %D = add i32 %B, -1
602*9880d681SAndroid Build Coastguard Worker  %E = sext i32 %D to i64
603*9880d681SAndroid Build Coastguard Worker  ret i64 %E
604*9880d681SAndroid Build Coastguard Worker; lshr+shl will be handled by DAGCombine.
605*9880d681SAndroid Build Coastguard Worker}
606*9880d681SAndroid Build Coastguard Worker
607*9880d681SAndroid Build Coastguard Workerdefine i64 @test51(i64 %A, i1 %cond) {
608*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test51(
609*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = and i64 %A, 4294967294
610*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = or i64 %A, 1
611*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = select i1 %cond, i64 [[C]], i64 [[D]]
612*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SEXT:%.*]] = shl i64 [[E]], 32
613*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[F:%.*]] = ashr exact i64 [[SEXT]], 32
614*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[F]]
615*9880d681SAndroid Build Coastguard Worker;
616*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %A to i32
617*9880d681SAndroid Build Coastguard Worker  %C = and i32 %B, -2
618*9880d681SAndroid Build Coastguard Worker  %D = or i32 %B, 1
619*9880d681SAndroid Build Coastguard Worker  %E = select i1 %cond, i32 %C, i32 %D
620*9880d681SAndroid Build Coastguard Worker  %F = sext i32 %E to i64
621*9880d681SAndroid Build Coastguard Worker  ret i64 %F
622*9880d681SAndroid Build Coastguard Worker}
623*9880d681SAndroid Build Coastguard Worker
624*9880d681SAndroid Build Coastguard Workerdefine i32 @test52(i64 %A) {
625*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test52(
626*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = trunc i64 %A to i32
627*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = and i32 [[B]], 7224
628*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = or i32 [[C]], 32962
629*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[D]]
630*9880d681SAndroid Build Coastguard Worker;
631*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %A to i16
632*9880d681SAndroid Build Coastguard Worker  %C = or i16 %B, -32574
633*9880d681SAndroid Build Coastguard Worker  %D = and i16 %C, -25350
634*9880d681SAndroid Build Coastguard Worker  %E = zext i16 %D to i32
635*9880d681SAndroid Build Coastguard Worker  ret i32 %E
636*9880d681SAndroid Build Coastguard Worker}
637*9880d681SAndroid Build Coastguard Worker
638*9880d681SAndroid Build Coastguard Workerdefine i64 @test53(i32 %A) {
639*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test53(
640*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = zext i32 %A to i64
641*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = and i64 [[B]], 7224
642*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = or i64 [[C]], 32962
643*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[D]]
644*9880d681SAndroid Build Coastguard Worker;
645*9880d681SAndroid Build Coastguard Worker  %B = trunc i32 %A to i16
646*9880d681SAndroid Build Coastguard Worker  %C = or i16 %B, -32574
647*9880d681SAndroid Build Coastguard Worker  %D = and i16 %C, -25350
648*9880d681SAndroid Build Coastguard Worker  %E = zext i16 %D to i64
649*9880d681SAndroid Build Coastguard Worker  ret i64 %E
650*9880d681SAndroid Build Coastguard Worker}
651*9880d681SAndroid Build Coastguard Worker
652*9880d681SAndroid Build Coastguard Workerdefine i32 @test54(i64 %A) {
653*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test54(
654*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = trunc i64 %A to i32
655*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = and i32 [[B]], 7224
656*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = or i32 [[C]], -32574
657*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[D]]
658*9880d681SAndroid Build Coastguard Worker;
659*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %A to i16
660*9880d681SAndroid Build Coastguard Worker  %C = or i16 %B, -32574
661*9880d681SAndroid Build Coastguard Worker  %D = and i16 %C, -25350
662*9880d681SAndroid Build Coastguard Worker  %E = sext i16 %D to i32
663*9880d681SAndroid Build Coastguard Worker  ret i32 %E
664*9880d681SAndroid Build Coastguard Worker}
665*9880d681SAndroid Build Coastguard Worker
666*9880d681SAndroid Build Coastguard Workerdefine i64 @test55(i32 %A) {
667*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test55(
668*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = zext i32 %A to i64
669*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = and i64 [[B]], 7224
670*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = or i64 [[C]], -32574
671*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[D]]
672*9880d681SAndroid Build Coastguard Worker;
673*9880d681SAndroid Build Coastguard Worker  %B = trunc i32 %A to i16
674*9880d681SAndroid Build Coastguard Worker  %C = or i16 %B, -32574
675*9880d681SAndroid Build Coastguard Worker  %D = and i16 %C, -25350
676*9880d681SAndroid Build Coastguard Worker  %E = sext i16 %D to i64
677*9880d681SAndroid Build Coastguard Worker  ret i64 %E
678*9880d681SAndroid Build Coastguard Worker}
679*9880d681SAndroid Build Coastguard Worker
680*9880d681SAndroid Build Coastguard Workerdefine i64 @test56(i16 %A) nounwind {
681*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test56(
682*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP353:%.*]] = sext i16 %A to i64
683*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP354:%.*]] = lshr i64 [[TMP353]], 5
684*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP355:%.*]] = and i64 [[TMP354]], 134217727
685*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[TMP355]]
686*9880d681SAndroid Build Coastguard Worker;
687*9880d681SAndroid Build Coastguard Worker  %tmp353 = sext i16 %A to i32
688*9880d681SAndroid Build Coastguard Worker  %tmp354 = lshr i32 %tmp353, 5
689*9880d681SAndroid Build Coastguard Worker  %tmp355 = zext i32 %tmp354 to i64
690*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp355
691*9880d681SAndroid Build Coastguard Worker}
692*9880d681SAndroid Build Coastguard Worker
693*9880d681SAndroid Build Coastguard Workerdefine i64 @test57(i64 %A) nounwind {
694*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test57(
695*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = lshr i64 %A, 8
696*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = and i64 [[C]], 16777215
697*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[E]]
698*9880d681SAndroid Build Coastguard Worker;
699*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %A to i32
700*9880d681SAndroid Build Coastguard Worker  %C = lshr i32 %B, 8
701*9880d681SAndroid Build Coastguard Worker  %E = zext i32 %C to i64
702*9880d681SAndroid Build Coastguard Worker  ret i64 %E
703*9880d681SAndroid Build Coastguard Worker}
704*9880d681SAndroid Build Coastguard Worker
705*9880d681SAndroid Build Coastguard Workerdefine i64 @test58(i64 %A) nounwind {
706*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test58(
707*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = lshr i64 %A, 8
708*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = and i64 [[C]], 16777087
709*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = or i64 [[D]], 128
710*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[E]]
711*9880d681SAndroid Build Coastguard Worker;
712*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %A to i32
713*9880d681SAndroid Build Coastguard Worker  %C = lshr i32 %B, 8
714*9880d681SAndroid Build Coastguard Worker  %D = or i32 %C, 128
715*9880d681SAndroid Build Coastguard Worker  %E = zext i32 %D to i64
716*9880d681SAndroid Build Coastguard Worker  ret i64 %E
717*9880d681SAndroid Build Coastguard Worker
718*9880d681SAndroid Build Coastguard Worker}
719*9880d681SAndroid Build Coastguard Worker
720*9880d681SAndroid Build Coastguard Workerdefine i64 @test59(i8 %A, i8 %B) nounwind {
721*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test59(
722*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = zext i8 %A to i64
723*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = shl nuw nsw i64 [[C]], 4
724*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = and i64 [[D]], 48
725*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[F:%.*]] = zext i8 %B to i64
726*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[G:%.*]] = lshr i64 [[F]], 4
727*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[H:%.*]] = or i64 [[G]], [[E]]
728*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[H]]
729*9880d681SAndroid Build Coastguard Worker;
730*9880d681SAndroid Build Coastguard Worker  %C = zext i8 %A to i32
731*9880d681SAndroid Build Coastguard Worker  %D = shl i32 %C, 4
732*9880d681SAndroid Build Coastguard Worker  %E = and i32 %D, 48
733*9880d681SAndroid Build Coastguard Worker  %F = zext i8 %B to i32
734*9880d681SAndroid Build Coastguard Worker  %G = lshr i32 %F, 4
735*9880d681SAndroid Build Coastguard Worker  %H = or i32 %G, %E
736*9880d681SAndroid Build Coastguard Worker  %I = zext i32 %H to i64
737*9880d681SAndroid Build Coastguard Worker  ret i64 %I
738*9880d681SAndroid Build Coastguard Worker}
739*9880d681SAndroid Build Coastguard Worker
740*9880d681SAndroid Build Coastguard Workerdefine <3 x i32> @test60(<4 x i32> %call4) nounwind {
741*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60(
742*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP10:%.*]] = shufflevector <4 x i32> %call4, <4 x i32> undef, <3 x i32> <i32 0, i32 1, i32 2>
743*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <3 x i32> [[TMP10]]
744*9880d681SAndroid Build Coastguard Worker;
745*9880d681SAndroid Build Coastguard Worker  %tmp11 = bitcast <4 x i32> %call4 to i128
746*9880d681SAndroid Build Coastguard Worker  %tmp9 = trunc i128 %tmp11 to i96
747*9880d681SAndroid Build Coastguard Worker  %tmp10 = bitcast i96 %tmp9 to <3 x i32>
748*9880d681SAndroid Build Coastguard Worker  ret <3 x i32> %tmp10
749*9880d681SAndroid Build Coastguard Worker
750*9880d681SAndroid Build Coastguard Worker}
751*9880d681SAndroid Build Coastguard Worker
752*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test61(<3 x i32> %call4) nounwind {
753*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test61(
754*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP10:%.*]] = shufflevector <3 x i32> %call4, <3 x i32> <i32 0, i32 undef, i32 undef>, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
755*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> [[TMP10]]
756*9880d681SAndroid Build Coastguard Worker;
757*9880d681SAndroid Build Coastguard Worker  %tmp11 = bitcast <3 x i32> %call4 to i96
758*9880d681SAndroid Build Coastguard Worker  %tmp9 = zext i96 %tmp11 to i128
759*9880d681SAndroid Build Coastguard Worker  %tmp10 = bitcast i128 %tmp9 to <4 x i32>
760*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %tmp10
761*9880d681SAndroid Build Coastguard Worker}
762*9880d681SAndroid Build Coastguard Worker
763*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test62(<3 x float> %call4) nounwind {
764*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62(
765*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <3 x float> %call4 to <3 x i32>
766*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP10:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> <i32 0, i32 undef, i32 undef>, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
767*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x i32> [[TMP10]]
768*9880d681SAndroid Build Coastguard Worker;
769*9880d681SAndroid Build Coastguard Worker  %tmp11 = bitcast <3 x float> %call4 to i96
770*9880d681SAndroid Build Coastguard Worker  %tmp9 = zext i96 %tmp11 to i128
771*9880d681SAndroid Build Coastguard Worker  %tmp10 = bitcast i128 %tmp9 to <4 x i32>
772*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %tmp10
773*9880d681SAndroid Build Coastguard Worker}
774*9880d681SAndroid Build Coastguard Worker
775*9880d681SAndroid Build Coastguard Worker; PR7311 - Don't create invalid IR on scalar->vector cast.
776*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test63(i64 %tmp8) nounwind {
777*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test63(
778*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
779*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = bitcast i64 %tmp8 to <2 x i32>
780*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[VCVT_I:%.*]] = uitofp <2 x i32> [[A]] to <2 x float>
781*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x float> [[VCVT_I]]
782*9880d681SAndroid Build Coastguard Worker;
783*9880d681SAndroid Build Coastguard Workerentry:
784*9880d681SAndroid Build Coastguard Worker  %a = bitcast i64 %tmp8 to <2 x i32>
785*9880d681SAndroid Build Coastguard Worker  %vcvt.i = uitofp <2 x i32> %a to <2 x float>
786*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %vcvt.i
787*9880d681SAndroid Build Coastguard Worker}
788*9880d681SAndroid Build Coastguard Worker
789*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test64(<4 x float> %c) nounwind {
790*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test64(
791*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x float> %c
792*9880d681SAndroid Build Coastguard Worker;
793*9880d681SAndroid Build Coastguard Worker  %t0 = bitcast <4 x float> %c to <4 x i32>
794*9880d681SAndroid Build Coastguard Worker  %t1 = bitcast <4 x i32> %t0 to <4 x float>
795*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t1
796*9880d681SAndroid Build Coastguard Worker}
797*9880d681SAndroid Build Coastguard Worker
798*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test65(<4 x float> %c) nounwind {
799*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test65(
800*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <4 x float> %c
801*9880d681SAndroid Build Coastguard Worker;
802*9880d681SAndroid Build Coastguard Worker  %t0 = bitcast <4 x float> %c to <2 x double>
803*9880d681SAndroid Build Coastguard Worker  %t1 = bitcast <2 x double> %t0 to <4 x float>
804*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t1
805*9880d681SAndroid Build Coastguard Worker}
806*9880d681SAndroid Build Coastguard Worker
807*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test66(<2 x float> %c) nounwind {
808*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test66(
809*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x float> %c
810*9880d681SAndroid Build Coastguard Worker;
811*9880d681SAndroid Build Coastguard Worker  %t0 = bitcast <2 x float> %c to double
812*9880d681SAndroid Build Coastguard Worker  %t1 = bitcast double %t0 to <2 x float>
813*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %t1
814*9880d681SAndroid Build Coastguard Worker}
815*9880d681SAndroid Build Coastguard Worker
816*9880d681SAndroid Build Coastguard Workerdefine float @test2c() {
817*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2c(
818*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret float -1.000000e+00
819*9880d681SAndroid Build Coastguard Worker;
820*9880d681SAndroid Build Coastguard Worker  ret float extractelement (<2 x float> bitcast (double bitcast (<2 x float> <float -1.000000e+00, float -1.000000e+00> to double) to <2 x float>), i32 0)
821*9880d681SAndroid Build Coastguard Worker}
822*9880d681SAndroid Build Coastguard Worker
823*9880d681SAndroid Build Coastguard Workerdefine i64 @test_mmx(<2 x i32> %c) nounwind {
824*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_mmx(
825*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = bitcast <2 x i32> %c to i64
826*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[C]]
827*9880d681SAndroid Build Coastguard Worker;
828*9880d681SAndroid Build Coastguard Worker  %A = bitcast <2 x i32> %c to x86_mmx
829*9880d681SAndroid Build Coastguard Worker  %B = bitcast x86_mmx %A to <2 x i32>
830*9880d681SAndroid Build Coastguard Worker  %C = bitcast <2 x i32> %B to i64
831*9880d681SAndroid Build Coastguard Worker  ret i64 %C
832*9880d681SAndroid Build Coastguard Worker}
833*9880d681SAndroid Build Coastguard Worker
834*9880d681SAndroid Build Coastguard Workerdefine i64 @test_mmx_const(<2 x i32> %c) nounwind {
835*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_mmx_const(
836*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 0
837*9880d681SAndroid Build Coastguard Worker;
838*9880d681SAndroid Build Coastguard Worker  %A = bitcast <2 x i32> zeroinitializer to x86_mmx
839*9880d681SAndroid Build Coastguard Worker  %B = bitcast x86_mmx %A to <2 x i32>
840*9880d681SAndroid Build Coastguard Worker  %C = bitcast <2 x i32> %B to i64
841*9880d681SAndroid Build Coastguard Worker  ret i64 %C
842*9880d681SAndroid Build Coastguard Worker}
843*9880d681SAndroid Build Coastguard Worker
844*9880d681SAndroid Build Coastguard Worker; PR12514
845*9880d681SAndroid Build Coastguard Workerdefine i1 @test67(i1 %a, i32 %b) {
846*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test67(
847*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
848*9880d681SAndroid Build Coastguard Worker;
849*9880d681SAndroid Build Coastguard Worker  %tmp2 = zext i1 %a to i32
850*9880d681SAndroid Build Coastguard Worker  %conv6 = xor i32 %tmp2, 1
851*9880d681SAndroid Build Coastguard Worker  %and = and i32 %b, %conv6
852*9880d681SAndroid Build Coastguard Worker  %sext = shl nuw nsw i32 %and, 24
853*9880d681SAndroid Build Coastguard Worker  %neg.i = xor i32 %sext, -16777216
854*9880d681SAndroid Build Coastguard Worker  %conv.i.i = ashr exact i32 %neg.i, 24
855*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %conv.i.i to i8
856*9880d681SAndroid Build Coastguard Worker  %tobool.i = icmp eq i8 %trunc, 0
857*9880d681SAndroid Build Coastguard Worker  ret i1 %tobool.i
858*9880d681SAndroid Build Coastguard Worker}
859*9880d681SAndroid Build Coastguard Worker
860*9880d681SAndroid Build Coastguard Worker%s = type { i32, i32, i16 }
861*9880d681SAndroid Build Coastguard Worker
862*9880d681SAndroid Build Coastguard Workerdefine %s @test68(%s *%p, i64 %i) {
863*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68(
864*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr %s, %s* %p, i64 %i
865*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load %s, %s* [[PP1]], align 4
866*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret %s [[L]]
867*9880d681SAndroid Build Coastguard Worker;
868*9880d681SAndroid Build Coastguard Worker  %o = mul i64 %i, 12
869*9880d681SAndroid Build Coastguard Worker  %q = bitcast %s* %p to i8*
870*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8* %q, i64 %o
871*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to %s*
872*9880d681SAndroid Build Coastguard Worker  %l = load %s, %s* %r
873*9880d681SAndroid Build Coastguard Worker  ret %s %l
874*9880d681SAndroid Build Coastguard Worker}
875*9880d681SAndroid Build Coastguard Worker
876*9880d681SAndroid Build Coastguard Worker; addrspacecasts should be eliminated.
877*9880d681SAndroid Build Coastguard Workerdefine %s @test68_addrspacecast(%s* %p, i64 %i) {
878*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68_addrspacecast(
879*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr %s, %s* %p, i64 %i
880*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load %s, %s* [[PP1]], align 4
881*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret %s [[L]]
882*9880d681SAndroid Build Coastguard Worker;
883*9880d681SAndroid Build Coastguard Worker  %o = mul i64 %i, 12
884*9880d681SAndroid Build Coastguard Worker  %q = addrspacecast %s* %p to i8 addrspace(2)*
885*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8 addrspace(2)* %q, i64 %o
886*9880d681SAndroid Build Coastguard Worker  %r = addrspacecast i8 addrspace(2)* %pp to %s*
887*9880d681SAndroid Build Coastguard Worker  %l = load %s, %s* %r
888*9880d681SAndroid Build Coastguard Worker  ret %s %l
889*9880d681SAndroid Build Coastguard Worker}
890*9880d681SAndroid Build Coastguard Worker
891*9880d681SAndroid Build Coastguard Workerdefine %s @test68_addrspacecast_2(%s* %p, i64 %i) {
892*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68_addrspacecast_2(
893*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr %s, %s* %p, i64 %i
894*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[R:%.*]] = addrspacecast %s* [[PP1]] to %s addrspace(1)*
895*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load %s, %s addrspace(1)* [[R]], align 4
896*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret %s [[L]]
897*9880d681SAndroid Build Coastguard Worker;
898*9880d681SAndroid Build Coastguard Worker  %o = mul i64 %i, 12
899*9880d681SAndroid Build Coastguard Worker  %q = addrspacecast %s* %p to i8 addrspace(2)*
900*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8 addrspace(2)* %q, i64 %o
901*9880d681SAndroid Build Coastguard Worker  %r = addrspacecast i8 addrspace(2)* %pp to %s addrspace(1)*
902*9880d681SAndroid Build Coastguard Worker  %l = load %s, %s addrspace(1)* %r
903*9880d681SAndroid Build Coastguard Worker  ret %s %l
904*9880d681SAndroid Build Coastguard Worker}
905*9880d681SAndroid Build Coastguard Worker
906*9880d681SAndroid Build Coastguard Workerdefine %s @test68_as1(%s addrspace(1)* %p, i32 %i) {
907*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68_as1(
908*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr %s, %s addrspace(1)* %p, i32 %i
909*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load %s, %s addrspace(1)* [[PP1]], align 4
910*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret %s [[L]]
911*9880d681SAndroid Build Coastguard Worker;
912*9880d681SAndroid Build Coastguard Worker  %o = mul i32 %i, 12
913*9880d681SAndroid Build Coastguard Worker  %q = bitcast %s addrspace(1)* %p to i8 addrspace(1)*
914*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8 addrspace(1)* %q, i32 %o
915*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8 addrspace(1)* %pp to %s addrspace(1)*
916*9880d681SAndroid Build Coastguard Worker  %l = load %s, %s addrspace(1)* %r
917*9880d681SAndroid Build Coastguard Worker  ret %s %l
918*9880d681SAndroid Build Coastguard Worker}
919*9880d681SAndroid Build Coastguard Worker
920*9880d681SAndroid Build Coastguard Workerdefine double @test69(double *%p, i64 %i) {
921*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test69(
922*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr inbounds double, double* %p, i64 %i
923*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double* [[PP1]], align 8
924*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
925*9880d681SAndroid Build Coastguard Worker;
926*9880d681SAndroid Build Coastguard Worker  %o = shl nsw i64 %i, 3
927*9880d681SAndroid Build Coastguard Worker  %q = bitcast double* %p to i8*
928*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8* %q, i64 %o
929*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to double*
930*9880d681SAndroid Build Coastguard Worker  %l = load double, double* %r
931*9880d681SAndroid Build Coastguard Worker  ret double %l
932*9880d681SAndroid Build Coastguard Worker}
933*9880d681SAndroid Build Coastguard Worker
934*9880d681SAndroid Build Coastguard Workerdefine %s @test70(%s *%p, i64 %i) {
935*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test70(
936*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[O:%.*]] = mul nsw i64 %i, 3
937*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr inbounds %s, %s* %p, i64 [[O]]
938*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load %s, %s* [[PP1]], align 4
939*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret %s [[L]]
940*9880d681SAndroid Build Coastguard Worker;
941*9880d681SAndroid Build Coastguard Worker  %o = mul nsw i64 %i, 36
942*9880d681SAndroid Build Coastguard Worker  %q = bitcast %s* %p to i8*
943*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8* %q, i64 %o
944*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to %s*
945*9880d681SAndroid Build Coastguard Worker  %l = load %s, %s* %r
946*9880d681SAndroid Build Coastguard Worker  ret %s %l
947*9880d681SAndroid Build Coastguard Worker}
948*9880d681SAndroid Build Coastguard Worker
949*9880d681SAndroid Build Coastguard Workerdefine double @test71(double *%p, i64 %i) {
950*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test71(
951*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[O:%.*]] = shl i64 %i, 2
952*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr double, double* %p, i64 [[O]]
953*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double* [[PP1]], align 8
954*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
955*9880d681SAndroid Build Coastguard Worker;
956*9880d681SAndroid Build Coastguard Worker  %o = shl i64 %i, 5
957*9880d681SAndroid Build Coastguard Worker  %q = bitcast double* %p to i8*
958*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr i8, i8* %q, i64 %o
959*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to double*
960*9880d681SAndroid Build Coastguard Worker  %l = load double, double* %r
961*9880d681SAndroid Build Coastguard Worker  ret double %l
962*9880d681SAndroid Build Coastguard Worker}
963*9880d681SAndroid Build Coastguard Worker
964*9880d681SAndroid Build Coastguard Workerdefine double @test72(double *%p, i32 %i) {
965*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test72(
966*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[O:%.*]] = sext i32 %i to i64
967*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr inbounds double, double* %p, i64 [[O]]
968*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double* [[PP1]], align 8
969*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
970*9880d681SAndroid Build Coastguard Worker;
971*9880d681SAndroid Build Coastguard Worker  %so = shl nsw i32 %i, 3
972*9880d681SAndroid Build Coastguard Worker  %o = sext i32 %so to i64
973*9880d681SAndroid Build Coastguard Worker  %q = bitcast double* %p to i8*
974*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8* %q, i64 %o
975*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to double*
976*9880d681SAndroid Build Coastguard Worker  %l = load double, double* %r
977*9880d681SAndroid Build Coastguard Worker  ret double %l
978*9880d681SAndroid Build Coastguard Worker}
979*9880d681SAndroid Build Coastguard Worker
980*9880d681SAndroid Build Coastguard Workerdefine double @test73(double *%p, i128 %i) {
981*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test73(
982*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[O:%.*]] = trunc i128 %i to i64
983*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr double, double* %p, i64 [[O]]
984*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double* [[PP1]], align 8
985*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
986*9880d681SAndroid Build Coastguard Worker;
987*9880d681SAndroid Build Coastguard Worker  %lo = shl nsw i128 %i, 3
988*9880d681SAndroid Build Coastguard Worker  %o = trunc i128 %lo to i64
989*9880d681SAndroid Build Coastguard Worker  %q = bitcast double* %p to i8*
990*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8* %q, i64 %o
991*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to double*
992*9880d681SAndroid Build Coastguard Worker  %l = load double, double* %r
993*9880d681SAndroid Build Coastguard Worker  ret double %l
994*9880d681SAndroid Build Coastguard Worker}
995*9880d681SAndroid Build Coastguard Worker
996*9880d681SAndroid Build Coastguard Workerdefine double @test74(double *%p, i64 %i) {
997*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test74(
998*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr inbounds double, double* %p, i64 %i
999*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double* [[PP1]], align 8
1000*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
1001*9880d681SAndroid Build Coastguard Worker;
1002*9880d681SAndroid Build Coastguard Worker  %q = bitcast double* %p to i64*
1003*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i64, i64* %q, i64 %i
1004*9880d681SAndroid Build Coastguard Worker  %r = bitcast i64* %pp to double*
1005*9880d681SAndroid Build Coastguard Worker  %l = load double, double* %r
1006*9880d681SAndroid Build Coastguard Worker  ret double %l
1007*9880d681SAndroid Build Coastguard Worker}
1008*9880d681SAndroid Build Coastguard Worker
1009*9880d681SAndroid Build Coastguard Workerdefine i32* @test75(i32* %p, i32 %x) {
1010*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test75(
1011*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = shl i32 %x, 3
1012*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = sext i32 [[Y]] to i64
1013*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Q:%.*]] = bitcast i32* %p to i8*
1014*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[R:%.*]] = getelementptr i8, i8* [[Q]], i64 [[Z]]
1015*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[S:%.*]] = bitcast i8* [[R]] to i32*
1016*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32* [[S]]
1017*9880d681SAndroid Build Coastguard Worker;
1018*9880d681SAndroid Build Coastguard Worker  %y = shl i32 %x, 3
1019*9880d681SAndroid Build Coastguard Worker  %z = sext i32 %y to i64
1020*9880d681SAndroid Build Coastguard Worker  %q = bitcast i32* %p to i8*
1021*9880d681SAndroid Build Coastguard Worker  %r = getelementptr i8, i8* %q, i64 %z
1022*9880d681SAndroid Build Coastguard Worker  %s = bitcast i8* %r to i32*
1023*9880d681SAndroid Build Coastguard Worker  ret i32* %s
1024*9880d681SAndroid Build Coastguard Worker}
1025*9880d681SAndroid Build Coastguard Worker
1026*9880d681SAndroid Build Coastguard Workerdefine %s @test76(%s *%p, i64 %i, i64 %j) {
1027*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test76(
1028*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[O2:%.*]] = mul i64 %i, %j
1029*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr %s, %s* %p, i64 [[O2]]
1030*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load %s, %s* [[PP1]], align 4
1031*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret %s [[L]]
1032*9880d681SAndroid Build Coastguard Worker;
1033*9880d681SAndroid Build Coastguard Worker  %o = mul i64 %i, 12
1034*9880d681SAndroid Build Coastguard Worker  %o2 = mul nsw i64 %o, %j
1035*9880d681SAndroid Build Coastguard Worker  %q = bitcast %s* %p to i8*
1036*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8* %q, i64 %o2
1037*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to %s*
1038*9880d681SAndroid Build Coastguard Worker  %l = load %s, %s* %r
1039*9880d681SAndroid Build Coastguard Worker  ret %s %l
1040*9880d681SAndroid Build Coastguard Worker}
1041*9880d681SAndroid Build Coastguard Worker
1042*9880d681SAndroid Build Coastguard Workerdefine %s @test77(%s *%p, i64 %i, i64 %j) {
1043*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test77(
1044*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[O:%.*]] = mul nsw i64 %i, 3
1045*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[O2:%.*]] = mul nsw i64 [[O]], %j
1046*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr inbounds %s, %s* %p, i64 [[O2]]
1047*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load %s, %s* [[PP1]], align 4
1048*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret %s [[L]]
1049*9880d681SAndroid Build Coastguard Worker;
1050*9880d681SAndroid Build Coastguard Worker  %o = mul nsw i64 %i, 36
1051*9880d681SAndroid Build Coastguard Worker  %o2 = mul nsw i64 %o, %j
1052*9880d681SAndroid Build Coastguard Worker  %q = bitcast %s* %p to i8*
1053*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8* %q, i64 %o2
1054*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to %s*
1055*9880d681SAndroid Build Coastguard Worker  %l = load %s, %s* %r
1056*9880d681SAndroid Build Coastguard Worker  ret %s %l
1057*9880d681SAndroid Build Coastguard Worker}
1058*9880d681SAndroid Build Coastguard Worker
1059*9880d681SAndroid Build Coastguard Workerdefine %s @test78(%s *%p, i64 %i, i64 %j, i32 %k, i32 %l, i128 %m, i128 %n) {
1060*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test78(
1061*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = mul nsw i32 %k, 3
1062*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = mul nsw i32 [[A]], %l
1063*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = sext i32 [[B]] to i128
1064*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[D:%.*]] = mul nsw i128 [[C]], %m
1065*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = mul i128 [[D]], %n
1066*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[F:%.*]] = trunc i128 [[E]] to i64
1067*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[G:%.*]] = mul i64 [[F]], %i
1068*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[H:%.*]] = mul i64 [[G]], %j
1069*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr %s, %s* %p, i64 [[H]]
1070*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[LOAD:%.*]] = load %s, %s* [[PP1]], align 4
1071*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret %s [[LOAD]]
1072*9880d681SAndroid Build Coastguard Worker;
1073*9880d681SAndroid Build Coastguard Worker  %a = mul nsw i32 %k, 36
1074*9880d681SAndroid Build Coastguard Worker  %b = mul nsw i32 %a, %l
1075*9880d681SAndroid Build Coastguard Worker  %c = sext i32 %b to i128
1076*9880d681SAndroid Build Coastguard Worker  %d = mul nsw i128 %c, %m
1077*9880d681SAndroid Build Coastguard Worker  %e = mul i128 %d, %n
1078*9880d681SAndroid Build Coastguard Worker  %f = trunc i128 %e to i64
1079*9880d681SAndroid Build Coastguard Worker  %g = mul nsw i64 %f, %i
1080*9880d681SAndroid Build Coastguard Worker  %h = mul nsw i64 %g, %j
1081*9880d681SAndroid Build Coastguard Worker  %q = bitcast %s* %p to i8*
1082*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8* %q, i64 %h
1083*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to %s*
1084*9880d681SAndroid Build Coastguard Worker  %load = load %s, %s* %r
1085*9880d681SAndroid Build Coastguard Worker  ret %s %load
1086*9880d681SAndroid Build Coastguard Worker}
1087*9880d681SAndroid Build Coastguard Worker
1088*9880d681SAndroid Build Coastguard Workerdefine %s @test79(%s *%p, i64 %i, i32 %j) {
1089*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test79(
1090*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = mul nsw i64 %i, 36
1091*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = trunc i64 [[A]] to i32
1092*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[C:%.*]] = mul i32 [[B]], %j
1093*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Q:%.*]] = bitcast %s* %p to i8*
1094*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = sext i32 [[C]] to i64
1095*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP:%.*]] = getelementptr inbounds i8, i8* [[Q]], i64 [[TMP1]]
1096*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[R:%.*]] = bitcast i8* [[PP]] to %s*
1097*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load %s, %s* [[R]], align 4
1098*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret %s [[L]]
1099*9880d681SAndroid Build Coastguard Worker;
1100*9880d681SAndroid Build Coastguard Worker  %a = mul nsw i64 %i, 36
1101*9880d681SAndroid Build Coastguard Worker  %b = trunc i64 %a to i32
1102*9880d681SAndroid Build Coastguard Worker  %c = mul i32 %b, %j
1103*9880d681SAndroid Build Coastguard Worker  %q = bitcast %s* %p to i8*
1104*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr inbounds i8, i8* %q, i32 %c
1105*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to %s*
1106*9880d681SAndroid Build Coastguard Worker  %l = load %s, %s* %r
1107*9880d681SAndroid Build Coastguard Worker  ret %s %l
1108*9880d681SAndroid Build Coastguard Worker}
1109*9880d681SAndroid Build Coastguard Worker
1110*9880d681SAndroid Build Coastguard Workerdefine double @test80([100 x double]* %p, i32 %i) {
1111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test80(
1112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = sext i32 %i to i64
1113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr [100 x double], [100 x double]* %p, i64 0, i64 [[TMP1]]
1114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double* [[PP1]], align 8
1115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
1116*9880d681SAndroid Build Coastguard Worker;
1117*9880d681SAndroid Build Coastguard Worker  %tmp = shl nsw i32 %i, 3
1118*9880d681SAndroid Build Coastguard Worker  %q = bitcast [100 x double]* %p to i8*
1119*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr i8, i8* %q, i32 %tmp
1120*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to double*
1121*9880d681SAndroid Build Coastguard Worker  %l = load double, double* %r
1122*9880d681SAndroid Build Coastguard Worker  ret double %l
1123*9880d681SAndroid Build Coastguard Worker}
1124*9880d681SAndroid Build Coastguard Worker
1125*9880d681SAndroid Build Coastguard Workerdefine double @test80_addrspacecast([100 x double] addrspace(1)* %p, i32 %i) {
1126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test80_addrspacecast(
1127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr [100 x double], [100 x double] addrspace(1)* %p, i32 0, i32 %i
1128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double addrspace(1)* [[PP1]], align 8
1129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
1130*9880d681SAndroid Build Coastguard Worker;
1131*9880d681SAndroid Build Coastguard Worker  %tmp = shl nsw i32 %i, 3
1132*9880d681SAndroid Build Coastguard Worker  %q = addrspacecast [100 x double] addrspace(1)* %p to i8 addrspace(2)*
1133*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr i8, i8 addrspace(2)* %q, i32 %tmp
1134*9880d681SAndroid Build Coastguard Worker  %r = addrspacecast i8 addrspace(2)* %pp to double addrspace(1)*
1135*9880d681SAndroid Build Coastguard Worker  %l = load double, double addrspace(1)* %r
1136*9880d681SAndroid Build Coastguard Worker  ret double %l
1137*9880d681SAndroid Build Coastguard Worker}
1138*9880d681SAndroid Build Coastguard Worker
1139*9880d681SAndroid Build Coastguard Workerdefine double @test80_addrspacecast_2([100 x double] addrspace(1)* %p, i32 %i) {
1140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test80_addrspacecast_2(
1141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr [100 x double], [100 x double] addrspace(1)* %p, i32 0, i32 %i
1142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[R:%.*]] = addrspacecast double addrspace(1)* [[PP1]] to double addrspace(3)*
1143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double addrspace(3)* [[R]], align 8
1144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
1145*9880d681SAndroid Build Coastguard Worker;
1146*9880d681SAndroid Build Coastguard Worker  %tmp = shl nsw i32 %i, 3
1147*9880d681SAndroid Build Coastguard Worker  %q = addrspacecast [100 x double] addrspace(1)* %p to i8 addrspace(2)*
1148*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr i8, i8 addrspace(2)* %q, i32 %tmp
1149*9880d681SAndroid Build Coastguard Worker  %r = addrspacecast i8 addrspace(2)* %pp to double addrspace(3)*
1150*9880d681SAndroid Build Coastguard Worker  %l = load double, double addrspace(3)* %r
1151*9880d681SAndroid Build Coastguard Worker  ret double %l
1152*9880d681SAndroid Build Coastguard Worker}
1153*9880d681SAndroid Build Coastguard Worker
1154*9880d681SAndroid Build Coastguard Workerdefine double @test80_as1([100 x double] addrspace(1)* %p, i16 %i) {
1155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test80_as1(
1156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = sext i16 %i to i32
1157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP1:%.*]] = getelementptr [100 x double], [100 x double] addrspace(1)* %p, i32 0, i32 [[TMP1]]
1158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double addrspace(1)* [[PP1]], align 8
1159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
1160*9880d681SAndroid Build Coastguard Worker;
1161*9880d681SAndroid Build Coastguard Worker  %tmp = shl nsw i16 %i, 3
1162*9880d681SAndroid Build Coastguard Worker  %q = bitcast [100 x double] addrspace(1)* %p to i8 addrspace(1)*
1163*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr i8, i8 addrspace(1)* %q, i16 %tmp
1164*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8 addrspace(1)* %pp to double addrspace(1)*
1165*9880d681SAndroid Build Coastguard Worker  %l = load double, double addrspace(1)* %r
1166*9880d681SAndroid Build Coastguard Worker  ret double %l
1167*9880d681SAndroid Build Coastguard Worker}
1168*9880d681SAndroid Build Coastguard Worker
1169*9880d681SAndroid Build Coastguard Workerdefine double @test81(double *%p, float %f) {
1170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test81(
1171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[I:%.*]] = fptosi float %f to i64
1172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Q:%.*]] = bitcast double* %p to i8*
1173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[PP:%.*]] = getelementptr i8, i8* [[Q]], i64 [[I]]
1174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[R:%.*]] = bitcast i8* [[PP]] to double*
1175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = load double, double* [[R]], align 8
1176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret double [[L]]
1177*9880d681SAndroid Build Coastguard Worker;
1178*9880d681SAndroid Build Coastguard Worker  %i = fptosi float %f to i64
1179*9880d681SAndroid Build Coastguard Worker  %q = bitcast double* %p to i8*
1180*9880d681SAndroid Build Coastguard Worker  %pp = getelementptr i8, i8* %q, i64 %i
1181*9880d681SAndroid Build Coastguard Worker  %r = bitcast i8* %pp to double*
1182*9880d681SAndroid Build Coastguard Worker  %l = load double, double* %r
1183*9880d681SAndroid Build Coastguard Worker  ret double %l
1184*9880d681SAndroid Build Coastguard Worker}
1185*9880d681SAndroid Build Coastguard Worker
1186*9880d681SAndroid Build Coastguard Workerdefine i64 @test82(i64 %A) nounwind {
1187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test82(
1188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shl i64 %A, 1
1189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[E:%.*]] = and i64 [[TMP1]], 4294966784
1190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[E]]
1191*9880d681SAndroid Build Coastguard Worker;
1192*9880d681SAndroid Build Coastguard Worker  %B = trunc i64 %A to i32
1193*9880d681SAndroid Build Coastguard Worker  %C = lshr i32 %B, 8
1194*9880d681SAndroid Build Coastguard Worker  %D = shl i32 %C, 9
1195*9880d681SAndroid Build Coastguard Worker  %E = zext i32 %D to i64
1196*9880d681SAndroid Build Coastguard Worker  ret i64 %E
1197*9880d681SAndroid Build Coastguard Worker}
1198*9880d681SAndroid Build Coastguard Worker
1199*9880d681SAndroid Build Coastguard Worker; PR15959
1200*9880d681SAndroid Build Coastguard Workerdefine i64 @test83(i16 %a, i64 %k) {
1201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test83(
1202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CONV:%.*]] = sext i16 %a to i32
1203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB:%.*]] = add i64 %k, 4294967295
1204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SH_PROM:%.*]] = trunc i64 [[SUB]] to i32
1205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[CONV]], [[SH_PROM]]
1206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SH_PROM1:%.*]] = zext i32 [[SHL]] to i64
1207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[SH_PROM1]]
1208*9880d681SAndroid Build Coastguard Worker;
1209*9880d681SAndroid Build Coastguard Worker  %conv = sext i16 %a to i32
1210*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i64 %k, -1
1211*9880d681SAndroid Build Coastguard Worker  %sh_prom = trunc i64 %sub to i32
1212*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %conv, %sh_prom
1213*9880d681SAndroid Build Coastguard Worker  %sh_prom1 = zext i32 %shl to i64
1214*9880d681SAndroid Build Coastguard Worker  ret i64 %sh_prom1
1215*9880d681SAndroid Build Coastguard Worker}
1216*9880d681SAndroid Build Coastguard Worker
1217*9880d681SAndroid Build Coastguard Workerdefine i8 @test84(i32 %a) {
1218*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test84(
1219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ADD:%.*]] = add i32 %a, 2130706432
1220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHR:%.*]] = lshr exact i32 [[ADD]], 23
1221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i32 [[SHR]] to i8
1222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[TRUNC]]
1223*9880d681SAndroid Build Coastguard Worker;
1224*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %a, -16777216
1225*9880d681SAndroid Build Coastguard Worker  %shr = lshr exact i32 %add, 23
1226*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %shr to i8
1227*9880d681SAndroid Build Coastguard Worker  ret i8 %trunc
1228*9880d681SAndroid Build Coastguard Worker}
1229*9880d681SAndroid Build Coastguard Worker
1230*9880d681SAndroid Build Coastguard Workerdefine i8 @test85(i32 %a) {
1231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test85(
1232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ADD:%.*]] = add i32 %a, 2130706432
1233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SHR:%.*]] = lshr exact i32 [[ADD]], 23
1234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i32 [[SHR]] to i8
1235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 [[TRUNC]]
1236*9880d681SAndroid Build Coastguard Worker;
1237*9880d681SAndroid Build Coastguard Worker  %add = add nuw i32 %a, -16777216
1238*9880d681SAndroid Build Coastguard Worker  %shr = lshr exact i32 %add, 23
1239*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %shr to i8
1240*9880d681SAndroid Build Coastguard Worker  ret i8 %trunc
1241*9880d681SAndroid Build Coastguard Worker}
1242*9880d681SAndroid Build Coastguard Worker
1243*9880d681SAndroid Build Coastguard Workerdefine i16 @test86(i16 %v) {
1244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test86(
1245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[S1:%.*]] = ashr i16 %v, 4
1246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[S1]]
1247*9880d681SAndroid Build Coastguard Worker;
1248*9880d681SAndroid Build Coastguard Worker  %a = sext i16 %v to i32
1249*9880d681SAndroid Build Coastguard Worker  %s = ashr i32 %a, 4
1250*9880d681SAndroid Build Coastguard Worker  %t = trunc i32 %s to i16
1251*9880d681SAndroid Build Coastguard Worker  ret i16 %t
1252*9880d681SAndroid Build Coastguard Worker}
1253*9880d681SAndroid Build Coastguard Worker
1254*9880d681SAndroid Build Coastguard Workerdefine i16 @test87(i16 %v) {
1255*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test87(
1256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A1:%.*]] = ashr i16 %v, 12
1257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[A1]]
1258*9880d681SAndroid Build Coastguard Worker;
1259*9880d681SAndroid Build Coastguard Worker  %c = sext i16 %v to i32
1260*9880d681SAndroid Build Coastguard Worker  %m = mul nsw i32 %c, 16
1261*9880d681SAndroid Build Coastguard Worker  %a = ashr i32 %m, 16
1262*9880d681SAndroid Build Coastguard Worker  %t = trunc i32 %a to i16
1263*9880d681SAndroid Build Coastguard Worker  ret i16 %t
1264*9880d681SAndroid Build Coastguard Worker}
1265*9880d681SAndroid Build Coastguard Worker
1266*9880d681SAndroid Build Coastguard Worker; Do not optimize to ashr i16 (shift by 18)
1267*9880d681SAndroid Build Coastguard Workerdefine i16 @test88(i16 %v) {
1268*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test88(
1269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = sext i16 %v to i32
1270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[S:%.*]] = ashr i32 [[A]], 18
1271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T:%.*]] = trunc i32 [[S]] to i16
1272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[T]]
1273*9880d681SAndroid Build Coastguard Worker;
1274*9880d681SAndroid Build Coastguard Worker  %a = sext i16 %v to i32
1275*9880d681SAndroid Build Coastguard Worker  %s = ashr i32 %a, 18
1276*9880d681SAndroid Build Coastguard Worker  %t = trunc i32 %s to i16
1277*9880d681SAndroid Build Coastguard Worker  ret i16 %t
1278*9880d681SAndroid Build Coastguard Worker}
1279*9880d681SAndroid Build Coastguard Worker
1280*9880d681SAndroid Build Coastguard Worker; Overflow on a float to int or int to float conversion is undefined (PR21130).
1281*9880d681SAndroid Build Coastguard Worker
1282*9880d681SAndroid Build Coastguard Workerdefine i8 @overflow_fptosi() {
1283*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_fptosi(
1284*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 undef
1285*9880d681SAndroid Build Coastguard Worker;
1286*9880d681SAndroid Build Coastguard Worker  %i = fptosi double 1.56e+02 to i8
1287*9880d681SAndroid Build Coastguard Worker  ret i8 %i
1288*9880d681SAndroid Build Coastguard Worker}
1289*9880d681SAndroid Build Coastguard Worker
1290*9880d681SAndroid Build Coastguard Workerdefine i8 @overflow_fptoui() {
1291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_fptoui(
1292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i8 undef
1293*9880d681SAndroid Build Coastguard Worker;
1294*9880d681SAndroid Build Coastguard Worker  %i = fptoui double 2.56e+02 to i8
1295*9880d681SAndroid Build Coastguard Worker  ret i8 %i
1296*9880d681SAndroid Build Coastguard Worker}
1297*9880d681SAndroid Build Coastguard Worker
1298*9880d681SAndroid Build Coastguard Worker; The maximum float is approximately 2 ** 128 which is 3.4E38.
1299*9880d681SAndroid Build Coastguard Worker; The constant below is 4E38. Use a 130 bit integer to hold that
1300*9880d681SAndroid Build Coastguard Worker; number; 129-bits for the value + 1 bit for the sign.
1301*9880d681SAndroid Build Coastguard Workerdefine float @overflow_uitofp() {
1302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_uitofp(
1303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret float undef
1304*9880d681SAndroid Build Coastguard Worker;
1305*9880d681SAndroid Build Coastguard Worker  %i = uitofp i130 400000000000000000000000000000000000000 to float
1306*9880d681SAndroid Build Coastguard Worker  ret float %i
1307*9880d681SAndroid Build Coastguard Worker}
1308*9880d681SAndroid Build Coastguard Worker
1309*9880d681SAndroid Build Coastguard Workerdefine float @overflow_sitofp() {
1310*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_sitofp(
1311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret float undef
1312*9880d681SAndroid Build Coastguard Worker;
1313*9880d681SAndroid Build Coastguard Worker  %i = sitofp i130 400000000000000000000000000000000000000 to float
1314*9880d681SAndroid Build Coastguard Worker  ret float %i
1315*9880d681SAndroid Build Coastguard Worker}
1316*9880d681SAndroid Build Coastguard Worker
1317*9880d681SAndroid Build Coastguard Workerdefine i32 @PR21388(i32* %v) {
1318*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR21388(
1319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[ICMP:%.*]] = icmp slt i32* %v, null
1320*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SEXT:%.*]] = sext i1 [[ICMP]] to i32
1321*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[SEXT]]
1322*9880d681SAndroid Build Coastguard Worker;
1323*9880d681SAndroid Build Coastguard Worker  %icmp = icmp slt i32* %v, null
1324*9880d681SAndroid Build Coastguard Worker  %sext = sext i1 %icmp to i32
1325*9880d681SAndroid Build Coastguard Worker  ret i32 %sext
1326*9880d681SAndroid Build Coastguard Worker}
1327*9880d681SAndroid Build Coastguard Worker
1328*9880d681SAndroid Build Coastguard Workerdefine float @sitofp_zext(i16 %a) {
1329*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sitofp_zext(
1330*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SITOFP:%.*]] = uitofp i16 %a to float
1331*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret float [[SITOFP]]
1332*9880d681SAndroid Build Coastguard Worker;
1333*9880d681SAndroid Build Coastguard Worker  %zext = zext i16 %a to i32
1334*9880d681SAndroid Build Coastguard Worker  %sitofp = sitofp i32 %zext to float
1335*9880d681SAndroid Build Coastguard Worker  ret float %sitofp
1336*9880d681SAndroid Build Coastguard Worker}
1337*9880d681SAndroid Build Coastguard Worker
1338*9880d681SAndroid Build Coastguard Workerdefine i1 @PR23309(i32 %A, i32 %B) {
1339*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR23309(
1340*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB:%.*]] = sub i32 %A, %B
1341*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[SUB]], 1
1342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TRUNC:%.*]] = icmp ne i32 [[TMP1]], 0
1343*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TRUNC]]
1344*9880d681SAndroid Build Coastguard Worker;
1345*9880d681SAndroid Build Coastguard Worker  %add = add i32 %A, -4
1346*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i32 %add, %B
1347*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %sub to i1
1348*9880d681SAndroid Build Coastguard Worker  ret i1 %trunc
1349*9880d681SAndroid Build Coastguard Worker}
1350*9880d681SAndroid Build Coastguard Worker
1351*9880d681SAndroid Build Coastguard Workerdefine i1 @PR23309v2(i32 %A, i32 %B) {
1352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR23309v2(
1353*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[SUB:%.*]] = add i32 %A, %B
1354*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[SUB]], 1
1355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TRUNC:%.*]] = icmp ne i32 [[TMP1]], 0
1356*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TRUNC]]
1357*9880d681SAndroid Build Coastguard Worker;
1358*9880d681SAndroid Build Coastguard Worker  %add = add i32 %A, -4
1359*9880d681SAndroid Build Coastguard Worker  %sub = add nuw i32 %add, %B
1360*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %sub to i1
1361*9880d681SAndroid Build Coastguard Worker  ret i1 %trunc
1362*9880d681SAndroid Build Coastguard Worker}
1363*9880d681SAndroid Build Coastguard Worker
1364*9880d681SAndroid Build Coastguard Workerdefine i16 @PR24763(i8 %V) {
1365*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR24763(
1366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[L:%.*]] = ashr i8 %V, 1
1367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[T:%.*]] = sext i8 [[L]] to i16
1368*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i16 [[T]]
1369*9880d681SAndroid Build Coastguard Worker;
1370*9880d681SAndroid Build Coastguard Worker  %conv = sext i8 %V to i32
1371*9880d681SAndroid Build Coastguard Worker  %l = lshr i32 %conv, 1
1372*9880d681SAndroid Build Coastguard Worker  %t = trunc i32 %l to i16
1373*9880d681SAndroid Build Coastguard Worker  ret i16 %t
1374*9880d681SAndroid Build Coastguard Worker}
1375