xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/memcpy-02.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test load/store pairs that act as memcpys.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker@g1src = global i8 1
6*9880d681SAndroid Build Coastguard Worker@g1dst = global i8 1
7*9880d681SAndroid Build Coastguard Worker@g2src = global i16 2
8*9880d681SAndroid Build Coastguard Worker@g2dst = global i16 2
9*9880d681SAndroid Build Coastguard Worker@g3 = global i32 3
10*9880d681SAndroid Build Coastguard Worker@g4 = global i64 4
11*9880d681SAndroid Build Coastguard Worker@g5src = external global fp128, align 16
12*9880d681SAndroid Build Coastguard Worker@g5dst = external global fp128, align 16
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; Test the simple i8 case.
15*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8 *%ptr1) {
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
17*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2)
18*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
19*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
20*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
21*9880d681SAndroid Build Coastguard Worker  store i8 %val, i8 *%ptr2
22*9880d681SAndroid Build Coastguard Worker  ret void
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is zero-extended to 32 bits.
26*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8 *%ptr1) {
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
28*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2)
29*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
30*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
31*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
32*9880d681SAndroid Build Coastguard Worker  %ext = zext i8 %val to i32
33*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %ext to i8
34*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8 *%ptr2
35*9880d681SAndroid Build Coastguard Worker  ret void
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is zero-extended to 64 bits.
39*9880d681SAndroid Build Coastguard Workerdefine void @f3(i8 *%ptr1) {
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
41*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2)
42*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
43*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
44*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
45*9880d681SAndroid Build Coastguard Worker  %ext = zext i8 %val to i64
46*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %ext to i8
47*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8 *%ptr2
48*9880d681SAndroid Build Coastguard Worker  ret void
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is sign-extended to 32 bits.
52*9880d681SAndroid Build Coastguard Workerdefine void @f4(i8 *%ptr1) {
53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
54*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2)
55*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
56*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
57*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
58*9880d681SAndroid Build Coastguard Worker  %ext = sext i8 %val to i32
59*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %ext to i8
60*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8 *%ptr2
61*9880d681SAndroid Build Coastguard Worker  ret void
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is sign-extended to 64 bits.
65*9880d681SAndroid Build Coastguard Workerdefine void @f5(i8 *%ptr1) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
67*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2)
68*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
69*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i8, i8 *%ptr1, i64 1
70*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *%ptr1
71*9880d681SAndroid Build Coastguard Worker  %ext = sext i8 %val to i64
72*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %ext to i8
73*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8 *%ptr2
74*9880d681SAndroid Build Coastguard Worker  ret void
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; Test the simple i16 case.
78*9880d681SAndroid Build Coastguard Workerdefine void @f6(i16 *%ptr1) {
79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
80*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2)
81*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
82*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i16, i16 *%ptr1, i64 1
83*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *%ptr1
84*9880d681SAndroid Build Coastguard Worker  store i16 %val, i16 *%ptr2
85*9880d681SAndroid Build Coastguard Worker  ret void
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is zero-extended to 32 bits.
89*9880d681SAndroid Build Coastguard Workerdefine void @f7(i16 *%ptr1) {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
91*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2)
92*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
93*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i16, i16 *%ptr1, i64 1
94*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *%ptr1
95*9880d681SAndroid Build Coastguard Worker  %ext = zext i16 %val to i32
96*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %ext to i16
97*9880d681SAndroid Build Coastguard Worker  store i16 %trunc, i16 *%ptr2
98*9880d681SAndroid Build Coastguard Worker  ret void
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is zero-extended to 64 bits.
102*9880d681SAndroid Build Coastguard Workerdefine void @f8(i16 *%ptr1) {
103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
104*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2)
105*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
106*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i16, i16 *%ptr1, i64 1
107*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *%ptr1
108*9880d681SAndroid Build Coastguard Worker  %ext = zext i16 %val to i64
109*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %ext to i16
110*9880d681SAndroid Build Coastguard Worker  store i16 %trunc, i16 *%ptr2
111*9880d681SAndroid Build Coastguard Worker  ret void
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is sign-extended to 32 bits.
115*9880d681SAndroid Build Coastguard Workerdefine void @f9(i16 *%ptr1) {
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
117*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2)
118*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
119*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i16, i16 *%ptr1, i64 1
120*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *%ptr1
121*9880d681SAndroid Build Coastguard Worker  %ext = sext i16 %val to i32
122*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %ext to i16
123*9880d681SAndroid Build Coastguard Worker  store i16 %trunc, i16 *%ptr2
124*9880d681SAndroid Build Coastguard Worker  ret void
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is sign-extended to 64 bits.
128*9880d681SAndroid Build Coastguard Workerdefine void @f10(i16 *%ptr1) {
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
130*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2)
131*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
132*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i16, i16 *%ptr1, i64 1
133*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *%ptr1
134*9880d681SAndroid Build Coastguard Worker  %ext = sext i16 %val to i64
135*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %ext to i16
136*9880d681SAndroid Build Coastguard Worker  store i16 %trunc, i16 *%ptr2
137*9880d681SAndroid Build Coastguard Worker  ret void
138*9880d681SAndroid Build Coastguard Worker}
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker; Test the simple i32 case.
141*9880d681SAndroid Build Coastguard Workerdefine void @f11(i32 *%ptr1) {
142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
143*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 4(4,%r2), 0(%r2)
144*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
145*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i32, i32 *%ptr1, i64 1
146*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *%ptr1
147*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32 *%ptr2
148*9880d681SAndroid Build Coastguard Worker  ret void
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker; Test i32 cases where the value is zero-extended to 64 bits.
152*9880d681SAndroid Build Coastguard Workerdefine void @f12(i32 *%ptr1) {
153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
154*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 4(4,%r2), 0(%r2)
155*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
156*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i32, i32 *%ptr1, i64 1
157*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *%ptr1
158*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %val to i64
159*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %ext to i32
160*9880d681SAndroid Build Coastguard Worker  store i32 %trunc, i32 *%ptr2
161*9880d681SAndroid Build Coastguard Worker  ret void
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; Test i32 cases where the value is sign-extended to 64 bits.
165*9880d681SAndroid Build Coastguard Workerdefine void @f13(i32 *%ptr1) {
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
167*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 4(4,%r2), 0(%r2)
168*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
169*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i32, i32 *%ptr1, i64 1
170*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *%ptr1
171*9880d681SAndroid Build Coastguard Worker  %ext = sext i32 %val to i64
172*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %ext to i32
173*9880d681SAndroid Build Coastguard Worker  store i32 %trunc, i32 *%ptr2
174*9880d681SAndroid Build Coastguard Worker  ret void
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker; Test the i64 case.
178*9880d681SAndroid Build Coastguard Workerdefine void @f14(i64 *%ptr1) {
179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
180*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 8(8,%r2), 0(%r2)
181*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
182*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i64, i64 *%ptr1, i64 1
183*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1
184*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%ptr2
185*9880d681SAndroid Build Coastguard Worker  ret void
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker; Test the f32 case.
189*9880d681SAndroid Build Coastguard Workerdefine void @f15(float *%ptr1) {
190*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
191*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 4(4,%r2), 0(%r2)
192*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
193*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr float, float *%ptr1, i64 1
194*9880d681SAndroid Build Coastguard Worker  %val = load float , float *%ptr1
195*9880d681SAndroid Build Coastguard Worker  store float %val, float *%ptr2
196*9880d681SAndroid Build Coastguard Worker  ret void
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker; Test the f64 case.
200*9880d681SAndroid Build Coastguard Workerdefine void @f16(double *%ptr1) {
201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
202*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 8(8,%r2), 0(%r2)
203*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
204*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr double, double *%ptr1, i64 1
205*9880d681SAndroid Build Coastguard Worker  %val = load double , double *%ptr1
206*9880d681SAndroid Build Coastguard Worker  store double %val, double *%ptr2
207*9880d681SAndroid Build Coastguard Worker  ret void
208*9880d681SAndroid Build Coastguard Worker}
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker; Test the f128 case.
211*9880d681SAndroid Build Coastguard Workerdefine void @f17(fp128 *%ptr1) {
212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17:
213*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 16(16,%r2), 0(%r2)
214*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
215*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr fp128, fp128 *%ptr1, i64 1
216*9880d681SAndroid Build Coastguard Worker  %val = load fp128 , fp128 *%ptr1
217*9880d681SAndroid Build Coastguard Worker  store fp128 %val, fp128 *%ptr2
218*9880d681SAndroid Build Coastguard Worker  ret void
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker; Make sure that we don't use MVC if the load is volatile.
222*9880d681SAndroid Build Coastguard Workerdefine void @f18(i64 *%ptr1) {
223*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18:
224*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc
225*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
226*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i64, i64 *%ptr1, i64 1
227*9880d681SAndroid Build Coastguard Worker  %val = load volatile i64 , i64 *%ptr1
228*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%ptr2
229*9880d681SAndroid Build Coastguard Worker  ret void
230*9880d681SAndroid Build Coastguard Worker}
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker; ...likewise the store.
233*9880d681SAndroid Build Coastguard Workerdefine void @f19(i64 *%ptr1) {
234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19:
235*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc
236*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
237*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i64, i64 *%ptr1, i64 1
238*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1
239*9880d681SAndroid Build Coastguard Worker  store volatile i64 %val, i64 *%ptr2
240*9880d681SAndroid Build Coastguard Worker  ret void
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker; Test that MVC is not used for aligned loads and stores if there is
244*9880d681SAndroid Build Coastguard Worker; no way of telling whether they alias.  We don't want to use MVC in
245*9880d681SAndroid Build Coastguard Worker; cases where the addresses could be equal.
246*9880d681SAndroid Build Coastguard Workerdefine void @f20(i64 *%ptr1, i64 *%ptr2) {
247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20:
248*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc
249*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
250*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1
251*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%ptr2
252*9880d681SAndroid Build Coastguard Worker  ret void
253*9880d681SAndroid Build Coastguard Worker}
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker; ...and again for unaligned loads and stores.
256*9880d681SAndroid Build Coastguard Workerdefine void @f21(i64 *%ptr1, i64 *%ptr2) {
257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21:
258*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc
259*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
260*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 2
261*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%ptr2, align 2
262*9880d681SAndroid Build Coastguard Worker  ret void
263*9880d681SAndroid Build Coastguard Worker}
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Worker; Test a case where there is definite overlap.
266*9880d681SAndroid Build Coastguard Workerdefine void @f22(i64 %base) {
267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22:
268*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc
269*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
270*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, 1
271*9880d681SAndroid Build Coastguard Worker  %ptr1 = inttoptr i64 %base to i64 *
272*9880d681SAndroid Build Coastguard Worker  %ptr2 = inttoptr i64 %add to i64 *
273*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 1
274*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%ptr2, align 1
275*9880d681SAndroid Build Coastguard Worker  ret void
276*9880d681SAndroid Build Coastguard Worker}
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Worker; Test that we can use MVC for global addresses for i8.
279*9880d681SAndroid Build Coastguard Workerdefine void @f23(i8 *%ptr) {
280*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23:
281*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[SRC:%r[0-5]]], g1src
282*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[DST:%r[0-5]]], g1dst
283*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 0(1,[[DST]]), 0([[SRC]])
284*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
285*9880d681SAndroid Build Coastguard Worker  %val = load i8 , i8 *@g1src
286*9880d681SAndroid Build Coastguard Worker  store i8 %val, i8 *@g1dst
287*9880d681SAndroid Build Coastguard Worker  ret void
288*9880d681SAndroid Build Coastguard Worker}
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker; Test that we use LHRL and STHRL for i16.
291*9880d681SAndroid Build Coastguard Workerdefine void @f24(i16 *%ptr) {
292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24:
293*9880d681SAndroid Build Coastguard Worker; CHECK: lhrl [[REG:%r[0-5]]], g2src
294*9880d681SAndroid Build Coastguard Worker; CHECK: sthrl [[REG]], g2dst
295*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
296*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *@g2src
297*9880d681SAndroid Build Coastguard Worker  store i16 %val, i16 *@g2dst
298*9880d681SAndroid Build Coastguard Worker  ret void
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker; Test that we use LRL for i32.
302*9880d681SAndroid Build Coastguard Workerdefine void @f25(i32 *%ptr) {
303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25:
304*9880d681SAndroid Build Coastguard Worker; CHECK: lrl [[REG:%r[0-5]]], g3
305*9880d681SAndroid Build Coastguard Worker; CHECK: st [[REG]], 0(%r2)
306*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
307*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *@g3
308*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32 *%ptr
309*9880d681SAndroid Build Coastguard Worker  ret void
310*9880d681SAndroid Build Coastguard Worker}
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Worker; ...likewise STRL.
313*9880d681SAndroid Build Coastguard Workerdefine void @f26(i32 *%ptr) {
314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f26:
315*9880d681SAndroid Build Coastguard Worker; CHECK: l [[REG:%r[0-5]]], 0(%r2)
316*9880d681SAndroid Build Coastguard Worker; CHECK: strl [[REG]], g3
317*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
318*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *%ptr
319*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32 *@g3
320*9880d681SAndroid Build Coastguard Worker  ret void
321*9880d681SAndroid Build Coastguard Worker}
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Worker; Test that we use LGRL for i64.
324*9880d681SAndroid Build Coastguard Workerdefine void @f27(i64 *%ptr) {
325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f27:
326*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl [[REG:%r[0-5]]], g4
327*9880d681SAndroid Build Coastguard Worker; CHECK: stg [[REG]], 0(%r2)
328*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
329*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *@g4
330*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%ptr
331*9880d681SAndroid Build Coastguard Worker  ret void
332*9880d681SAndroid Build Coastguard Worker}
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker; ...likewise STGRL.
335*9880d681SAndroid Build Coastguard Workerdefine void @f28(i64 *%ptr) {
336*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f28:
337*9880d681SAndroid Build Coastguard Worker; CHECK: lg [[REG:%r[0-5]]], 0(%r2)
338*9880d681SAndroid Build Coastguard Worker; CHECK: stgrl [[REG]], g4
339*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
340*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr
341*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *@g4
342*9880d681SAndroid Build Coastguard Worker  ret void
343*9880d681SAndroid Build Coastguard Worker}
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker; Test that we can use MVC for global addresses for fp128.
346*9880d681SAndroid Build Coastguard Workerdefine void @f29(fp128 *%ptr) {
347*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f29:
348*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[SRC:%r[0-5]]], g5src
349*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[DST:%r[0-5]]], g5dst
350*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 0(16,[[DST]]), 0([[SRC]])
351*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
352*9880d681SAndroid Build Coastguard Worker  %val = load fp128 , fp128 *@g5src, align 16
353*9880d681SAndroid Build Coastguard Worker  store fp128 %val, fp128 *@g5dst, align 16
354*9880d681SAndroid Build Coastguard Worker  ret void
355*9880d681SAndroid Build Coastguard Worker}
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker; Test a case where offset disambiguation is enough.
358*9880d681SAndroid Build Coastguard Workerdefine void @f30(i64 *%ptr1) {
359*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f30:
360*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 8(8,%r2), 0(%r2)
361*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
362*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr i64, i64 *%ptr1, i64 1
363*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 1
364*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%ptr2, align 1
365*9880d681SAndroid Build Coastguard Worker  ret void
366*9880d681SAndroid Build Coastguard Worker}
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Worker; Test f21 in cases where TBAA tells us there is no alias.
369*9880d681SAndroid Build Coastguard Workerdefine void @f31(i64 *%ptr1, i64 *%ptr2) {
370*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f31:
371*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 0(8,%r3), 0(%r2)
372*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
373*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 2, !tbaa !1
374*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%ptr2, align 2, !tbaa !2
375*9880d681SAndroid Build Coastguard Worker  ret void
376*9880d681SAndroid Build Coastguard Worker}
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker; Test f21 in cases where TBAA is present but doesn't help.
379*9880d681SAndroid Build Coastguard Workerdefine void @f32(i64 *%ptr1, i64 *%ptr2) {
380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32:
381*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc
382*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
383*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *%ptr1, align 2, !tbaa !1
384*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *%ptr2, align 2, !tbaa !1
385*9880d681SAndroid Build Coastguard Worker  ret void
386*9880d681SAndroid Build Coastguard Worker}
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Worker!0 = !{ !"root" }
389*9880d681SAndroid Build Coastguard Worker!1 = !{ !3, !3, i64 0 }
390*9880d681SAndroid Build Coastguard Worker!2 = !{ !4, !4, i64 0 }
391*9880d681SAndroid Build Coastguard Worker!3 = !{ !"set1", !0 }
392*9880d681SAndroid Build Coastguard Worker!4 = !{ !"set2", !0 }
393