xref: /llvm-project/llvm/test/CodeGen/AArch64/tiny-model-static.ll (revision 1ee315ae7964c8433b772e0b5d667834994ba753)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny < %s | FileCheck %s
3; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny -fast-isel < %s | FileCheck %s
4; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny -global-isel < %s | FileCheck %s --check-prefix=CHECK-GLOBISEL
5
6; Note fast-isel tests here will fall back to isel
7
8@src = external local_unnamed_addr global [65536 x i8], align 1
9@dst = external global [65536 x i8], align 1
10@ptr = external local_unnamed_addr global ptr, align 8
11
12define dso_local void @foo1() {
13; CHECK-LABEL: foo1:
14; CHECK:       // %bb.0: // %entry
15; CHECK-NEXT:    ldr x8, :got:src
16; CHECK-NEXT:    ldrb w8, [x8]
17; CHECK-NEXT:    ldr x9, :got:dst
18; CHECK-NEXT:    strb w8, [x9]
19; CHECK-NEXT:    ret
20;
21; CHECK-GLOBISEL-LABEL: foo1:
22; CHECK-GLOBISEL:       // %bb.0: // %entry
23; CHECK-GLOBISEL-NEXT:    ldr x8, :got:src
24; CHECK-GLOBISEL-NEXT:    ldrb w8, [x8]
25; CHECK-GLOBISEL-NEXT:    ldr x9, :got:dst
26; CHECK-GLOBISEL-NEXT:    strb w8, [x9]
27; CHECK-GLOBISEL-NEXT:    ret
28entry:
29  %0 = load i8, ptr @src, align 1
30  store i8 %0, ptr @dst, align 1
31  ret void
32}
33
34define dso_local void @foo2() {
35; CHECK-LABEL: foo2:
36; CHECK:       // %bb.0: // %entry
37; CHECK-NEXT:    ldr x8, :got:ptr
38; CHECK-NEXT:    ldr x9, :got:dst
39; CHECK-NEXT:    str x9, [x8]
40; CHECK-NEXT:    ret
41;
42; CHECK-GLOBISEL-LABEL: foo2:
43; CHECK-GLOBISEL:       // %bb.0: // %entry
44; CHECK-GLOBISEL-NEXT:    ldr x8, :got:ptr
45; CHECK-GLOBISEL-NEXT:    ldr x9, :got:dst
46; CHECK-GLOBISEL-NEXT:    str x9, [x8]
47; CHECK-GLOBISEL-NEXT:    ret
48entry:
49  store ptr @dst, ptr @ptr, align 8
50  ret void
51}
52
53define dso_local void @foo3() {
54; FIXME: Needn't adr ptr
55;
56; CHECK-LABEL: foo3:
57; CHECK:       // %bb.0: // %entry
58; CHECK-NEXT:    ldr x8, :got:src
59; CHECK-NEXT:    ldr x9, :got:ptr
60; CHECK-NEXT:    ldrb w8, [x8]
61; CHECK-NEXT:    ldr x9, [x9]
62; CHECK-NEXT:    strb w8, [x9]
63; CHECK-NEXT:    ret
64;
65; CHECK-GLOBISEL-LABEL: foo3:
66; CHECK-GLOBISEL:       // %bb.0: // %entry
67; CHECK-GLOBISEL-NEXT:    ldr x8, :got:src
68; CHECK-GLOBISEL-NEXT:    ldr x9, :got:ptr
69; CHECK-GLOBISEL-NEXT:    ldrb w8, [x8]
70; CHECK-GLOBISEL-NEXT:    ldr x9, [x9]
71; CHECK-GLOBISEL-NEXT:    strb w8, [x9]
72; CHECK-GLOBISEL-NEXT:    ret
73entry:
74  %0 = load i8, ptr @src, align 1
75  %1 = load ptr, ptr @ptr, align 8
76  store i8 %0, ptr %1, align 1
77  ret void
78}
79
80@lsrc = internal global i8 0, align 4
81@ldst = internal global i8 0, align 4
82@lptr = internal global ptr null, align 8
83
84define dso_local void @bar1() {
85; CHECK-LABEL: bar1:
86; CHECK:       // %bb.0: // %entry
87; CHECK-NEXT:    adr x8, lsrc
88; CHECK-NEXT:    adr x9, ldst
89; CHECK-NEXT:    ldrb w8, [x8]
90; CHECK-NEXT:    strb w8, [x9]
91; CHECK-NEXT:    ret
92;
93; CHECK-GLOBISEL-LABEL: bar1:
94; CHECK-GLOBISEL:       // %bb.0: // %entry
95; CHECK-GLOBISEL-NEXT:    adr x8, lsrc
96; CHECK-GLOBISEL-NEXT:    adr x9, ldst
97; CHECK-GLOBISEL-NEXT:    ldrb w8, [x8]
98; CHECK-GLOBISEL-NEXT:    strb w8, [x9]
99; CHECK-GLOBISEL-NEXT:    ret
100entry:
101  %0 = load i8, ptr @lsrc, align 4
102  store i8 %0, ptr @ldst, align 4
103  ret void
104}
105
106define dso_local void @bar2() {
107; CHECK-LABEL: bar2:
108; CHECK:       // %bb.0: // %entry
109; CHECK-NEXT:    adr x8, lptr
110; CHECK-NEXT:    adr x9, ldst
111; CHECK-NEXT:    str x9, [x8]
112; CHECK-NEXT:    ret
113;
114; CHECK-GLOBISEL-LABEL: bar2:
115; CHECK-GLOBISEL:       // %bb.0: // %entry
116; CHECK-GLOBISEL-NEXT:    adr x8, lptr
117; CHECK-GLOBISEL-NEXT:    adr x9, ldst
118; CHECK-GLOBISEL-NEXT:    str x9, [x8]
119; CHECK-GLOBISEL-NEXT:    ret
120entry:
121  store ptr @ldst, ptr @lptr, align 8
122  ret void
123}
124
125define dso_local void @bar3() {
126; FIXME: Needn't adr lptr
127;
128; CHECK-LABEL: bar3:
129; CHECK:       // %bb.0: // %entry
130; CHECK-NEXT:    adr x8, lsrc
131; CHECK-NEXT:    ldr x9, lptr
132; CHECK-NEXT:    ldrb w8, [x8]
133; CHECK-NEXT:    strb w8, [x9]
134; CHECK-NEXT:    ret
135;
136; CHECK-GLOBISEL-LABEL: bar3:
137; CHECK-GLOBISEL:       // %bb.0: // %entry
138; CHECK-GLOBISEL-NEXT:    adr x8, lsrc
139; CHECK-GLOBISEL-NEXT:    adr x9, lptr
140; CHECK-GLOBISEL-NEXT:    ldrb w8, [x8]
141; CHECK-GLOBISEL-NEXT:    ldr x9, [x9]
142; CHECK-GLOBISEL-NEXT:    strb w8, [x9]
143; CHECK-GLOBISEL-NEXT:    ret
144entry:
145  %0 = load i8, ptr @lsrc, align 4
146  %1 = load ptr, ptr @lptr, align 8
147  store i8 %0, ptr %1, align 1
148  ret void
149}
150
151
152@lbsrc = internal global [65536 x i8] zeroinitializer, align 4
153@lbdst = internal global [65536 x i8] zeroinitializer, align 4
154
155define dso_local void @baz1() {
156; CHECK-LABEL: baz1:
157; CHECK:       // %bb.0: // %entry
158; CHECK-NEXT:    adr x8, lbsrc
159; CHECK-NEXT:    adr x9, lbdst
160; CHECK-NEXT:    ldrb w8, [x8]
161; CHECK-NEXT:    strb w8, [x9]
162; CHECK-NEXT:    ret
163;
164; CHECK-GLOBISEL-LABEL: baz1:
165; CHECK-GLOBISEL:       // %bb.0: // %entry
166; CHECK-GLOBISEL-NEXT:    adr x8, lbsrc
167; CHECK-GLOBISEL-NEXT:    adr x9, lbdst
168; CHECK-GLOBISEL-NEXT:    ldrb w8, [x8]
169; CHECK-GLOBISEL-NEXT:    strb w8, [x9]
170; CHECK-GLOBISEL-NEXT:    ret
171entry:
172  %0 = load i8, ptr @lbsrc, align 4
173  store i8 %0, ptr @lbdst, align 4
174  ret void
175}
176
177define dso_local void @baz2() {
178; CHECK-LABEL: baz2:
179; CHECK:       // %bb.0: // %entry
180; CHECK-NEXT:    adr x8, lptr
181; CHECK-NEXT:    adr x9, lbdst
182; CHECK-NEXT:    str x9, [x8]
183; CHECK-NEXT:    ret
184;
185; CHECK-GLOBISEL-LABEL: baz2:
186; CHECK-GLOBISEL:       // %bb.0: // %entry
187; CHECK-GLOBISEL-NEXT:    adr x8, lptr
188; CHECK-GLOBISEL-NEXT:    adr x9, lbdst
189; CHECK-GLOBISEL-NEXT:    str x9, [x8]
190; CHECK-GLOBISEL-NEXT:    ret
191entry:
192  store ptr @lbdst, ptr @lptr, align 8
193  ret void
194}
195
196define dso_local void @baz3() {
197; FIXME: Needn't adr lptr
198;
199; CHECK-LABEL: baz3:
200; CHECK:       // %bb.0: // %entry
201; CHECK-NEXT:    adr x8, lbsrc
202; CHECK-NEXT:    ldr x9, lptr
203; CHECK-NEXT:    ldrb w8, [x8]
204; CHECK-NEXT:    strb w8, [x9]
205; CHECK-NEXT:    ret
206;
207; CHECK-GLOBISEL-LABEL: baz3:
208; CHECK-GLOBISEL:       // %bb.0: // %entry
209; CHECK-GLOBISEL-NEXT:    adr x8, lbsrc
210; CHECK-GLOBISEL-NEXT:    adr x9, lptr
211; CHECK-GLOBISEL-NEXT:    ldrb w8, [x8]
212; CHECK-GLOBISEL-NEXT:    ldr x9, [x9]
213; CHECK-GLOBISEL-NEXT:    strb w8, [x9]
214; CHECK-GLOBISEL-NEXT:    ret
215entry:
216  %0 = load i8, ptr @lbsrc, align 4
217  %1 = load ptr, ptr @lptr, align 8
218  store i8 %0, ptr %1, align 1
219  ret void
220}
221
222
223declare void @func(...)
224
225define dso_local ptr @externfuncaddr() {
226; CHECK-LABEL: externfuncaddr:
227; CHECK:       // %bb.0: // %entry
228; CHECK-NEXT:    ldr x0, :got:func
229; CHECK-NEXT:    ret
230;
231; CHECK-GLOBISEL-LABEL: externfuncaddr:
232; CHECK-GLOBISEL:       // %bb.0: // %entry
233; CHECK-GLOBISEL-NEXT:    ldr x0, :got:func
234; CHECK-GLOBISEL-NEXT:    ret
235entry:
236      ret ptr @func
237}
238
239define dso_local ptr @localfuncaddr() {
240; CHECK-LABEL: localfuncaddr:
241; CHECK:       // %bb.0: // %entry
242; CHECK-NEXT:    adr x0, externfuncaddr
243; CHECK-NEXT:    ret
244;
245; CHECK-GLOBISEL-LABEL: localfuncaddr:
246; CHECK-GLOBISEL:       // %bb.0: // %entry
247; CHECK-GLOBISEL-NEXT:    adr x0, externfuncaddr
248; CHECK-GLOBISEL-NEXT:    ret
249entry:
250      ret ptr @externfuncaddr
251}
252