xref: /aosp_15_r20/external/llvm/test/Transforms/ConstProp/loads.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -default-data-layout="e-p:64:64:64-p1:16:16:16-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" -instcombine -S | FileCheck %s --check-prefix=LE
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -default-data-layout="E-p:64:64:64-p1:16:16:16-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" -instcombine -S | FileCheck %s --check-prefix=BE
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; {{ 0xDEADBEEF, 0xBA }, 0xCAFEBABE}
5*9880d681SAndroid Build Coastguard Worker@g1 = constant {{i32,i8},i32} {{i32,i8} { i32 -559038737, i8 186 }, i32 -889275714 }
6*9880d681SAndroid Build Coastguard Worker@g2 = constant double 1.0
7*9880d681SAndroid Build Coastguard Worker; { 0x7B, 0x06B1BFF8 }
8*9880d681SAndroid Build Coastguard Worker@g3 = constant {i64, i64} { i64 123, i64 112312312 }
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; Simple load
11*9880d681SAndroid Build Coastguard Workerdefine i32 @test1() {
12*9880d681SAndroid Build Coastguard Worker  %r = load i32, i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0)
13*9880d681SAndroid Build Coastguard Worker  ret i32 %r
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; 0xDEADBEEF
16*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test1(
17*9880d681SAndroid Build Coastguard Worker; LE: ret i32 -559038737
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; 0xDEADBEEF
20*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test1(
21*9880d681SAndroid Build Coastguard Worker; BE: ret i32 -559038737
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; PR3152
25*9880d681SAndroid Build Coastguard Worker; Load of first 16 bits of 32-bit value.
26*9880d681SAndroid Build Coastguard Workerdefine i16 @test2() {
27*9880d681SAndroid Build Coastguard Worker  %r = load i16, i16* bitcast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16*)
28*9880d681SAndroid Build Coastguard Worker  ret i16 %r
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; 0xBEEF
31*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test2(
32*9880d681SAndroid Build Coastguard Worker; LE: ret i16 -16657
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker; 0xDEAD
35*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test2(
36*9880d681SAndroid Build Coastguard Worker; BE: ret i16 -8531
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine i16 @test2_addrspacecast() {
40*9880d681SAndroid Build Coastguard Worker  %r = load i16, i16 addrspace(1)* addrspacecast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16 addrspace(1)*)
41*9880d681SAndroid Build Coastguard Worker  ret i16 %r
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; FIXME: Should be able to load through a constant addrspacecast.
44*9880d681SAndroid Build Coastguard Worker; 0xBEEF
45*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test2_addrspacecast(
46*9880d681SAndroid Build Coastguard Worker; XLE: ret i16 -16657
47*9880d681SAndroid Build Coastguard Worker; LE: load i16, i16 addrspace(1)* addrspacecast
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker; 0xDEAD
50*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test2_addrspacecast(
51*9880d681SAndroid Build Coastguard Worker; XBE: ret i16 -8531
52*9880d681SAndroid Build Coastguard Worker; BE: load i16, i16 addrspace(1)* addrspacecast
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; Load of second 16 bits of 32-bit value.
56*9880d681SAndroid Build Coastguard Workerdefine i16 @test3() {
57*9880d681SAndroid Build Coastguard Worker  %r = load i16, i16* getelementptr(i16, i16* bitcast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16*), i32 1)
58*9880d681SAndroid Build Coastguard Worker  ret i16 %r
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; 0xDEAD
61*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test3(
62*9880d681SAndroid Build Coastguard Worker; LE: ret i16 -8531
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; 0xBEEF
65*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test3(
66*9880d681SAndroid Build Coastguard Worker; BE: ret i16 -16657
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; Load of 8 bit field + tail padding.
70*9880d681SAndroid Build Coastguard Workerdefine i16 @test4() {
71*9880d681SAndroid Build Coastguard Worker  %r = load i16, i16* getelementptr(i16, i16* bitcast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16*), i32 2)
72*9880d681SAndroid Build Coastguard Worker  ret i16 %r
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker; 0x00BA
75*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test4(
76*9880d681SAndroid Build Coastguard Worker; LE: ret i16 186
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; 0xBA00
79*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test4(
80*9880d681SAndroid Build Coastguard Worker; BE: ret i16 -17920
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; Load of double bits.
84*9880d681SAndroid Build Coastguard Workerdefine i64 @test6() {
85*9880d681SAndroid Build Coastguard Worker  %r = load i64, i64* bitcast(double* @g2 to i64*)
86*9880d681SAndroid Build Coastguard Worker  ret i64 %r
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; 0x3FF_0000000000000
89*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test6(
90*9880d681SAndroid Build Coastguard Worker; LE: ret i64 4607182418800017408
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; 0x3FF_0000000000000
93*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test6(
94*9880d681SAndroid Build Coastguard Worker; BE: ret i64 4607182418800017408
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker; Load of double bits.
98*9880d681SAndroid Build Coastguard Workerdefine i16 @test7() {
99*9880d681SAndroid Build Coastguard Worker  %r = load i16, i16* bitcast(double* @g2 to i16*)
100*9880d681SAndroid Build Coastguard Worker  ret i16 %r
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; 0x0000
103*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test7(
104*9880d681SAndroid Build Coastguard Worker; LE: ret i16 0
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker; 0x3FF0
107*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test7(
108*9880d681SAndroid Build Coastguard Worker; BE: ret i16 16368
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; Double load.
112*9880d681SAndroid Build Coastguard Workerdefine double @test8() {
113*9880d681SAndroid Build Coastguard Worker  %r = load double, double* bitcast({{i32,i8},i32}* @g1 to double*)
114*9880d681SAndroid Build Coastguard Worker  ret double %r
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test8(
117*9880d681SAndroid Build Coastguard Worker; LE: ret double 0xBADEADBEEF
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test8(
120*9880d681SAndroid Build Coastguard Worker; BE: ret double 0xDEADBEEFBA000000
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; i128 load.
125*9880d681SAndroid Build Coastguard Workerdefine i128 @test9() {
126*9880d681SAndroid Build Coastguard Worker  %r = load i128, i128* bitcast({i64, i64}* @g3 to i128*)
127*9880d681SAndroid Build Coastguard Worker  ret i128 %r
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; 0x00000000_06B1BFF8_00000000_0000007B
130*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test9(
131*9880d681SAndroid Build Coastguard Worker; LE: ret i128 2071796475790618158476296315
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; 0x00000000_0000007B_00000000_06B1BFF8
134*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test9(
135*9880d681SAndroid Build Coastguard Worker; BE: ret i128 2268949521066387161080
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; vector load.
139*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test10() {
140*9880d681SAndroid Build Coastguard Worker  %r = load <2 x i64>, <2 x i64>* bitcast({i64, i64}* @g3 to <2 x i64>*)
141*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %r
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test10(
144*9880d681SAndroid Build Coastguard Worker; LE: ret <2 x i64> <i64 123, i64 112312312>
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test10(
147*9880d681SAndroid Build Coastguard Worker; BE: ret <2 x i64> <i64 123, i64 112312312>
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker; PR5287
152*9880d681SAndroid Build Coastguard Worker; { 0xA1, 0x08 }
153*9880d681SAndroid Build Coastguard Worker@g4 = internal constant { i8, i8 } { i8 -95, i8 8 }
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine i16 @test11() nounwind {
156*9880d681SAndroid Build Coastguard Workerentry:
157*9880d681SAndroid Build Coastguard Worker  %a = load i16, i16* bitcast ({ i8, i8 }* @g4 to i16*)
158*9880d681SAndroid Build Coastguard Worker  ret i16 %a
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker; 0x08A1
161*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test11(
162*9880d681SAndroid Build Coastguard Worker; LE: ret i16 2209
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; 0xA108
165*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test11(
166*9880d681SAndroid Build Coastguard Worker; BE: ret i16 -24312
167*9880d681SAndroid Build Coastguard Worker}
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker; PR5551
171*9880d681SAndroid Build Coastguard Worker@test12g = private constant [6 x i8] c"a\00b\00\00\00"
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine i16 @test12() {
174*9880d681SAndroid Build Coastguard Worker  %a = load i16, i16* getelementptr inbounds ([3 x i16], [3 x i16]* bitcast ([6 x i8]* @test12g to [3 x i16]*), i32 0, i64 1)
175*9880d681SAndroid Build Coastguard Worker  ret i16 %a
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker; 0x0062
178*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test12(
179*9880d681SAndroid Build Coastguard Worker; LE: ret i16 98
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker; 0x6200
182*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test12(
183*9880d681SAndroid Build Coastguard Worker; BE: ret i16 25088
184*9880d681SAndroid Build Coastguard Worker}
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; PR5978
188*9880d681SAndroid Build Coastguard Worker@g5 = constant i8 4
189*9880d681SAndroid Build Coastguard Workerdefine i1 @test13() {
190*9880d681SAndroid Build Coastguard Worker  %A = load i1, i1* bitcast (i8* @g5 to i1*)
191*9880d681SAndroid Build Coastguard Worker  ret i1 %A
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test13(
194*9880d681SAndroid Build Coastguard Worker; LE: ret i1 false
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test13(
197*9880d681SAndroid Build Coastguard Worker; BE: ret i1 false
198*9880d681SAndroid Build Coastguard Worker}
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker@g6 = constant [2 x i8*] [i8* inttoptr (i64 1 to i8*), i8* inttoptr (i64 2 to i8*)]
201*9880d681SAndroid Build Coastguard Workerdefine i64 @test14() nounwind {
202*9880d681SAndroid Build Coastguard Workerentry:
203*9880d681SAndroid Build Coastguard Worker  %tmp = load i64, i64* bitcast ([2 x i8*]* @g6 to i64*)
204*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test14(
207*9880d681SAndroid Build Coastguard Worker; LE: ret i64 1
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test14(
210*9880d681SAndroid Build Coastguard Worker; BE: ret i64 1
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker; Check with address space pointers
214*9880d681SAndroid Build Coastguard Worker@g6_as1 = constant [2 x i8 addrspace(1)*] [i8 addrspace(1)* inttoptr (i16 1 to i8 addrspace(1)*), i8 addrspace(1)* inttoptr (i16 2 to i8 addrspace(1)*)]
215*9880d681SAndroid Build Coastguard Workerdefine i16 @test14_as1() nounwind {
216*9880d681SAndroid Build Coastguard Workerentry:
217*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* bitcast ([2 x i8 addrspace(1)*]* @g6_as1 to i16*)
218*9880d681SAndroid Build Coastguard Worker  ret i16 %tmp
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker; LE: @test14_as1
221*9880d681SAndroid Build Coastguard Worker; LE: ret i16 1
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker; BE: @test14_as1
224*9880d681SAndroid Build Coastguard Worker; BE: ret i16 1
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerdefine i64 @test15() nounwind {
228*9880d681SAndroid Build Coastguard Workerentry:
229*9880d681SAndroid Build Coastguard Worker  %tmp = load i64, i64* bitcast (i8** getelementptr inbounds ([2 x i8*], [2 x i8*]* @g6, i32 0, i64 1) to i64*)
230*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test15(
233*9880d681SAndroid Build Coastguard Worker; LE: ret i64 2
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test15(
236*9880d681SAndroid Build Coastguard Worker; BE: ret i64 2
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker@gv7 = constant [4 x i8*] [i8* null, i8* inttoptr (i64 -14 to i8*), i8* null, i8* null]
240*9880d681SAndroid Build Coastguard Workerdefine i64 @test16.1() {
241*9880d681SAndroid Build Coastguard Worker  %v = load i64, i64* bitcast ([4 x i8*]* @gv7 to i64*), align 8
242*9880d681SAndroid Build Coastguard Worker  ret i64 %v
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test16.1(
245*9880d681SAndroid Build Coastguard Worker; LE: ret i64 0
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test16.1(
248*9880d681SAndroid Build Coastguard Worker; BE: ret i64 0
249*9880d681SAndroid Build Coastguard Worker}
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Workerdefine i64 @test16.2() {
252*9880d681SAndroid Build Coastguard Worker  %v = load i64, i64* bitcast (i8** getelementptr inbounds ([4 x i8*], [4 x i8*]* @gv7, i64 0, i64 1) to i64*), align 8
253*9880d681SAndroid Build Coastguard Worker  ret i64 %v
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test16.2(
256*9880d681SAndroid Build Coastguard Worker; LE: ret i64 -14
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test16.2(
259*9880d681SAndroid Build Coastguard Worker; BE: ret i64 -14
260*9880d681SAndroid Build Coastguard Worker}
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Workerdefine i64 @test16.3() {
263*9880d681SAndroid Build Coastguard Worker  %v = load i64, i64* bitcast (i8** getelementptr inbounds ([4 x i8*], [4 x i8*]* @gv7, i64 0, i64 2) to i64*), align 8
264*9880d681SAndroid Build Coastguard Worker  ret i64 %v
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker; LE-LABEL: @test16.3(
267*9880d681SAndroid Build Coastguard Worker; LE: ret i64 0
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker; BE-LABEL: @test16.3(
270*9880d681SAndroid Build Coastguard Worker; BE: ret i64 0
271*9880d681SAndroid Build Coastguard Worker}
272