xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/bitcast.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-darwin10.0.0"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Bitcasts between vectors and scalars are valid.
7*9880d681SAndroid Build Coastguard Worker; PR4487
8*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i64 %a) {
9*9880d681SAndroid Build Coastguard Worker        %t1 = bitcast i64 %a to <2 x i32>
10*9880d681SAndroid Build Coastguard Worker        %t2 = bitcast i64 %a to <2 x i32>
11*9880d681SAndroid Build Coastguard Worker        %t3 = xor <2 x i32> %t1, %t2
12*9880d681SAndroid Build Coastguard Worker        %t4 = extractelement <2 x i32> %t3, i32 0
13*9880d681SAndroid Build Coastguard Worker        ret i32 %t4
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
16*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; Perform the bitwise logic in the source type of the operands to eliminate bitcasts.
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @xor_two_vector_bitcasts(<1 x i64> %a, <1 x i64> %b) {
22*9880d681SAndroid Build Coastguard Worker  %t1 = bitcast <1 x i64> %a to <2 x i32>
23*9880d681SAndroid Build Coastguard Worker  %t2 = bitcast <1 x i64> %b to <2 x i32>
24*9880d681SAndroid Build Coastguard Worker  %t3 = xor <2 x i32> %t1, %t2
25*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %t3
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @xor_two_vector_bitcasts(
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %t31 = xor <1 x i64> %a, %b
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %t3 = bitcast <1 x i64> %t31 to <2 x i32>
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret <2 x i32> %t3
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker; Verify that 'xor' of vector and constant is done as a vector bitwise op before the bitcast.
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @xor_bitcast_vec_to_vec(<1 x i64> %a) {
36*9880d681SAndroid Build Coastguard Worker  %t1 = bitcast <1 x i64> %a to <2 x i32>
37*9880d681SAndroid Build Coastguard Worker  %t2 = xor <2 x i32> <i32 1, i32 2>, %t1
38*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %t2
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @xor_bitcast_vec_to_vec(
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %t21 = xor <1 x i64> %a, <i64 8589934593>
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %t2 = bitcast <1 x i64> %t21 to <2 x i32>
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret <2 x i32> %t2
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; Verify that 'and' of integer and constant is done as a vector bitwise op before the bitcast.
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine i64 @and_bitcast_vec_to_int(<2 x i32> %a) {
49*9880d681SAndroid Build Coastguard Worker  %t1 = bitcast <2 x i32> %a to i64
50*9880d681SAndroid Build Coastguard Worker  %t2 = and i64 %t1, 3
51*9880d681SAndroid Build Coastguard Worker  ret i64 %t2
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @and_bitcast_vec_to_int(
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %t21 = and <2 x i32> %a, <i32 3, i32 0>
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %t2 = bitcast <2 x i32> %t21 to i64
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i64 %t2
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; Verify that 'or' of vector and constant is done as an integer bitwise op before the bitcast.
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @or_bitcast_int_to_vec(i64 %a) {
62*9880d681SAndroid Build Coastguard Worker  %t1 = bitcast i64 %a to <2 x i32>
63*9880d681SAndroid Build Coastguard Worker  %t2 = or <2 x i32> %t1, <i32 1, i32 2>
64*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %t2
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @or_bitcast_int_to_vec(
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %t21 = or i64 %a, 8589934593
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %t2 = bitcast i64 %t21 to <2 x i32>
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret <2 x i32> %t2
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; Optimize bitcasts that are extracting low element of vector.  This happens
73*9880d681SAndroid Build Coastguard Worker; because of SRoA.
74*9880d681SAndroid Build Coastguard Worker; rdar://7892780
75*9880d681SAndroid Build Coastguard Workerdefine float @test2(<2 x float> %A, <2 x i32> %B) {
76*9880d681SAndroid Build Coastguard Worker  %tmp28 = bitcast <2 x float> %A to i64  ; <i64> [#uses=2]
77*9880d681SAndroid Build Coastguard Worker  %tmp23 = trunc i64 %tmp28 to i32                ; <i32> [#uses=1]
78*9880d681SAndroid Build Coastguard Worker  %tmp24 = bitcast i32 %tmp23 to float            ; <float> [#uses=1]
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker  %tmp = bitcast <2 x i32> %B to i64
81*9880d681SAndroid Build Coastguard Worker  %tmp2 = trunc i64 %tmp to i32                ; <i32> [#uses=1]
82*9880d681SAndroid Build Coastguard Worker  %tmp4 = bitcast i32 %tmp2 to float            ; <float> [#uses=1]
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  %add = fadd float %tmp24, %tmp4
85*9880d681SAndroid Build Coastguard Worker  ret float %add
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %tmp24 = extractelement <2 x float> %A, i32 0
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  bitcast <2 x i32> %B to <2 x float>
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %tmp4 = extractelement <2 x float> {{.*}}, i32 0
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %add = fadd float %tmp24, %tmp4
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret float %add
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; Optimize bitcasts that are extracting other elements of a vector.  This
96*9880d681SAndroid Build Coastguard Worker; happens because of SRoA.
97*9880d681SAndroid Build Coastguard Worker; rdar://7892780
98*9880d681SAndroid Build Coastguard Workerdefine float @test3(<2 x float> %A, <2 x i64> %B) {
99*9880d681SAndroid Build Coastguard Worker  %tmp28 = bitcast <2 x float> %A to i64
100*9880d681SAndroid Build Coastguard Worker  %tmp29 = lshr i64 %tmp28, 32
101*9880d681SAndroid Build Coastguard Worker  %tmp23 = trunc i64 %tmp29 to i32
102*9880d681SAndroid Build Coastguard Worker  %tmp24 = bitcast i32 %tmp23 to float
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker  %tmp = bitcast <2 x i64> %B to i128
105*9880d681SAndroid Build Coastguard Worker  %tmp1 = lshr i128 %tmp, 64
106*9880d681SAndroid Build Coastguard Worker  %tmp2 = trunc i128 %tmp1 to i32
107*9880d681SAndroid Build Coastguard Worker  %tmp4 = bitcast i32 %tmp2 to float
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker  %add = fadd float %tmp24, %tmp4
110*9880d681SAndroid Build Coastguard Worker  ret float %add
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %tmp24 = extractelement <2 x float> %A, i32 1
114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  bitcast <2 x i64> %B to <4 x float>
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %tmp4 = extractelement <4 x float> {{.*}}, i32 2
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %add = fadd float %tmp24, %tmp4
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret float %add
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; Both bitcasts are unnecessary; change the extractelement.
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerdefine float @bitcast_extelt1(<2 x float> %A) {
123*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <2 x float> %A to <2 x i32>
124*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <2 x i32> %bc1, i32 0
125*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast i32 %ext to float
126*9880d681SAndroid Build Coastguard Worker  ret float %bc2
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_extelt1(
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %bc2 = extractelement <2 x float> %A, i32 0
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret float %bc2
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; Second bitcast can be folded into the first.
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine i64 @bitcast_extelt2(<4 x float> %A) {
136*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x float> %A to <2 x double>
137*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <2 x double> %bc1, i32 1
138*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast double %ext to i64
139*9880d681SAndroid Build Coastguard Worker  ret i64 %bc2
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_extelt2(
142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %bc = bitcast <4 x float> %A to <2 x i64>
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %bc2 = extractelement <2 x i64> %bc, i32 1
144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i64 %bc2
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; TODO: This should return %A.
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @bitcast_extelt3(<2 x i32> %A) {
150*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <2 x i32> %A to <1 x i64>
151*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <1 x i64> %bc1, i32 0
152*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast i64 %ext to <2 x i32>
153*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %bc2
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_extelt3(
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %bc1 = bitcast <2 x i32> %A to <1 x i64>
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %ext = extractelement <1 x i64> %bc1, i32 0
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %bc2 = bitcast i64 %ext to <2 x i32>
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret <2 x i32> %bc2
160*9880d681SAndroid Build Coastguard Worker}
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker; Handle the case where the input is not a vector.
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerdefine double @bitcast_extelt4(i128 %A) {
165*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast i128 %A to <2 x i64>
166*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <2 x i64> %bc1, i32 0
167*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast i64 %ext to double
168*9880d681SAndroid Build Coastguard Worker  ret double %bc2
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bitcast_extelt4(
171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %bc = bitcast i128 %A to <2 x double>
172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %bc2 = extractelement <2 x double> %bc, i32 0
173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret double %bc2
174*9880d681SAndroid Build Coastguard Worker}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test4(i32 %A, i32 %B){
177*9880d681SAndroid Build Coastguard Worker  %tmp38 = zext i32 %A to i64
178*9880d681SAndroid Build Coastguard Worker  %tmp32 = zext i32 %B to i64
179*9880d681SAndroid Build Coastguard Worker  %tmp33 = shl i64 %tmp32, 32
180*9880d681SAndroid Build Coastguard Worker  %ins35 = or i64 %tmp33, %tmp38
181*9880d681SAndroid Build Coastguard Worker  %tmp43 = bitcast i64 %ins35 to <2 x i32>
182*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %tmp43
183*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: @test4(
184*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT: insertelement <2 x i32> undef, i32 %A, i32 0
185*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT: insertelement <2 x i32> {{.*}}, i32 %B, i32 1
186*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT: ret <2 x i32>
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker}
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker; rdar://8360454
191*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test5(float %A, float %B) {
192*9880d681SAndroid Build Coastguard Worker  %tmp37 = bitcast float %A to i32
193*9880d681SAndroid Build Coastguard Worker  %tmp38 = zext i32 %tmp37 to i64
194*9880d681SAndroid Build Coastguard Worker  %tmp31 = bitcast float %B to i32
195*9880d681SAndroid Build Coastguard Worker  %tmp32 = zext i32 %tmp31 to i64
196*9880d681SAndroid Build Coastguard Worker  %tmp33 = shl i64 %tmp32, 32
197*9880d681SAndroid Build Coastguard Worker  %ins35 = or i64 %tmp33, %tmp38
198*9880d681SAndroid Build Coastguard Worker  %tmp43 = bitcast i64 %ins35 to <2 x float>
199*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %tmp43
200*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: @test5(
201*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT: insertelement <2 x float> undef, float %A, i32 0
202*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT: insertelement <2 x float> {{.*}}, float %B, i32 1
203*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT: ret <2 x float>
204*9880d681SAndroid Build Coastguard Worker}
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test6(float %A){
207*9880d681SAndroid Build Coastguard Worker  %tmp23 = bitcast float %A to i32              ; <i32> [#uses=1]
208*9880d681SAndroid Build Coastguard Worker  %tmp24 = zext i32 %tmp23 to i64                 ; <i64> [#uses=1]
209*9880d681SAndroid Build Coastguard Worker  %tmp25 = shl i64 %tmp24, 32                     ; <i64> [#uses=1]
210*9880d681SAndroid Build Coastguard Worker  %mask20 = or i64 %tmp25, 1109917696             ; <i64> [#uses=1]
211*9880d681SAndroid Build Coastguard Worker  %tmp35 = bitcast i64 %mask20 to <2 x float>     ; <<2 x float>> [#uses=1]
212*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %tmp35
213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: insertelement <2 x float> <float 4.200000e+01, float undef>, float %A, i32 1
215*9880d681SAndroid Build Coastguard Worker; CHECK: ret
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerdefine i64 @ISPC0(i64 %in) {
219*9880d681SAndroid Build Coastguard Worker  %out = and i64 %in, xor (i64 bitcast (<4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1> to i64), i64 -1)
220*9880d681SAndroid Build Coastguard Worker  ret i64 %out
221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ISPC0(
222*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 0
223*9880d681SAndroid Build Coastguard Worker}
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerdefine i64 @Vec2(i64 %in) {
227*9880d681SAndroid Build Coastguard Worker  %out = and i64 %in, xor (i64 bitcast (<4 x i16> <i16 0, i16 0, i16 0, i16 0> to i64), i64 0)
228*9880d681SAndroid Build Coastguard Worker  ret i64 %out
229*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @Vec2(
230*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 0
231*9880d681SAndroid Build Coastguard Worker}
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Workerdefine i64 @All11(i64 %in) {
234*9880d681SAndroid Build Coastguard Worker  %out = and i64 %in, xor (i64 bitcast (<2 x float> bitcast (i64 -1 to <2 x float>) to i64), i64 -1)
235*9880d681SAndroid Build Coastguard Worker  ret i64 %out
236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @All11(
237*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 0
238*9880d681SAndroid Build Coastguard Worker}
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Workerdefine i32 @All111(i32 %in) {
242*9880d681SAndroid Build Coastguard Worker  %out = and i32 %in, xor (i32 bitcast (<1 x float> bitcast (i32 -1 to <1 x float>) to i32), i32 -1)
243*9880d681SAndroid Build Coastguard Worker  ret i32 %out
244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @All111(
245*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
246*9880d681SAndroid Build Coastguard Worker}
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workerdefine <2 x i16> @BitcastInsert(i32 %a) {
249*9880d681SAndroid Build Coastguard Worker  %v = insertelement <1 x i32> undef, i32 %a, i32 0
250*9880d681SAndroid Build Coastguard Worker  %r = bitcast <1 x i32> %v to <2 x i16>
251*9880d681SAndroid Build Coastguard Worker  ret <2 x i16> %r
252*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @BitcastInsert(
253*9880d681SAndroid Build Coastguard Worker; CHECK: bitcast i32 %a to <2 x i16>
254*9880d681SAndroid Build Coastguard Worker}
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker; PR17293
257*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test7(<2 x i8*>* %arg) nounwind {
258*9880d681SAndroid Build Coastguard Worker  %cast = bitcast <2 x i8*>* %arg to <2 x i64>*
259*9880d681SAndroid Build Coastguard Worker  %load = load <2 x i64>, <2 x i64>* %cast, align 16
260*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %load
261*9880d681SAndroid Build Coastguard Worker; CHECK: @test7
262*9880d681SAndroid Build Coastguard Worker; CHECK: bitcast
263*9880d681SAndroid Build Coastguard Worker; CHECK: load
264*9880d681SAndroid Build Coastguard Worker}
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerdefine i8 @test8() {
267*9880d681SAndroid Build Coastguard Worker  %res = bitcast <8 x i1> <i1 true, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true> to i8
268*9880d681SAndroid Build Coastguard Worker  ret i8 %res
269*9880d681SAndroid Build Coastguard Worker; CHECK: @test8
270*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 -85
271*9880d681SAndroid Build Coastguard Worker}
272