blob: ecf0d76b44b3fb11f81ceaf46e05967d059385e6 [file] [log] [blame]
David Green9dd1d452018-08-22 11:31:39 +00001; 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; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny -relocation-model=pic < %s | FileCheck %s --check-prefix=CHECK-PIC
6; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny -relocation-model=pic -fast-isel < %s | FileCheck %s --check-prefix=CHECK-PIC
7; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny -relocation-model=pic -global-isel < %s | FileCheck %s --check-prefix=CHECK-PIC-GLOBISEL
8
9; Note fast-isel tests here will fall back to isel
10
11@src = external local_unnamed_addr global [65536 x i8], align 1
12@dst = external global [65536 x i8], align 1
13@ptr = external local_unnamed_addr global i8*, align 8
14
15define void @foo1() {
16; CHECK-LABEL: foo1:
17; CHECK: // %bb.0: // %entry
18; CHECK-NEXT: adr x8, src
19; CHECK-NEXT: ldrb w8, [x8]
20; CHECK-NEXT: adr x9, dst
21; CHECK-NEXT: strb w8, [x9]
22; CHECK-NEXT: ret
23;
24; CHECK-GLOBISEL-LABEL: foo1:
25; CHECK-GLOBISEL: // %bb.0: // %entry
26; CHECK-GLOBISEL-NEXT: adr x8, src
27; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]
28; CHECK-GLOBISEL-NEXT: adr x9, dst
29; CHECK-GLOBISEL-NEXT: strb w8, [x9]
30; CHECK-GLOBISEL-NEXT: ret
31;
32; CHECK-PIC-LABEL: foo1:
33; CHECK-PIC: // %bb.0: // %entry
34; CHECK-PIC-NEXT: ldr x8, :got:src
35; CHECK-PIC-NEXT: ldrb w8, [x8]
36; CHECK-PIC-NEXT: ldr x9, :got:dst
37; CHECK-PIC-NEXT: strb w8, [x9]
38; CHECK-PIC-NEXT: ret
39;
40; CHECK-PIC-GLOBISEL-LABEL: foo1:
41; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
42; CHECK-PIC-GLOBISEL-NEXT: ldr x8, :got:src
43; CHECK-PIC-GLOBISEL-NEXT: ldrb w8, [x8]
44; CHECK-PIC-GLOBISEL-NEXT: ldr x9, :got:dst
45; CHECK-PIC-GLOBISEL-NEXT: strb w8, [x9]
46; CHECK-PIC-GLOBISEL-NEXT: ret
47entry:
48 %0 = load i8, i8* getelementptr inbounds ([65536 x i8], [65536 x i8]* @src, i64 0, i64 0), align 1
49 store i8 %0, i8* getelementptr inbounds ([65536 x i8], [65536 x i8]* @dst, i64 0, i64 0), align 1
50 ret void
51}
52
53define void @foo2() {
54; CHECK-LABEL: foo2:
55; CHECK: // %bb.0: // %entry
56; CHECK-NEXT: adr x8, ptr
57; CHECK-NEXT: adr x9, dst
58; CHECK-NEXT: str x9, [x8]
59; CHECK-NEXT: ret
60;
61; CHECK-GLOBISEL-LABEL: foo2:
62; CHECK-GLOBISEL: // %bb.0: // %entry
63; CHECK-GLOBISEL-NEXT: adr x8, dst
64; CHECK-GLOBISEL-NEXT: adr x9, ptr
65; CHECK-GLOBISEL-NEXT: str x8, [x9]
66; CHECK-GLOBISEL-NEXT: ret
67;
68; CHECK-PIC-LABEL: foo2:
69; CHECK-PIC: // %bb.0: // %entry
70; CHECK-PIC-NEXT: ldr x8, :got:ptr
71; CHECK-PIC-NEXT: ldr x9, :got:dst
72; CHECK-PIC-NEXT: str x9, [x8]
73; CHECK-PIC-NEXT: ret
74;
75; CHECK-PIC-GLOBISEL-LABEL: foo2:
76; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
77; CHECK-PIC-GLOBISEL-NEXT: ldr x8, :got:dst
78; CHECK-PIC-GLOBISEL-NEXT: ldr x9, :got:ptr
79; CHECK-PIC-GLOBISEL-NEXT: str x8, [x9]
80; CHECK-PIC-GLOBISEL-NEXT: ret
81entry:
82 store i8* getelementptr inbounds ([65536 x i8], [65536 x i8]* @dst, i64 0, i64 0), i8** @ptr, align 8
83 ret void
84}
85
86define void @foo3() {
87; FIXME: Needn't adr ptr
88;
89; CHECK-LABEL: foo3:
90; CHECK: // %bb.0: // %entry
91; CHECK-NEXT: adr x8, src
92; CHECK-NEXT: adr x9, ptr
93; CHECK-NEXT: ldrb w8, [x8]
94; CHECK-NEXT: ldr x9, [x9]
95; CHECK-NEXT: strb w8, [x9]
96; CHECK-NEXT: ret
97;
98; CHECK-GLOBISEL-LABEL: foo3:
99; CHECK-GLOBISEL: // %bb.0: // %entry
100; CHECK-GLOBISEL-NEXT: adr x8, src
101; CHECK-GLOBISEL-NEXT: adr x9, ptr
102; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]
103; CHECK-GLOBISEL-NEXT: ldr x9, [x9]
104; CHECK-GLOBISEL-NEXT: strb w8, [x9]
105; CHECK-GLOBISEL-NEXT: ret
106;
107; CHECK-PIC-LABEL: foo3:
108; CHECK-PIC: // %bb.0: // %entry
109; CHECK-PIC-NEXT: ldr x8, :got:src
110; CHECK-PIC-NEXT: ldr x9, :got:ptr
111; CHECK-PIC-NEXT: ldrb w8, [x8]
112; CHECK-PIC-NEXT: ldr x9, [x9]
113; CHECK-PIC-NEXT: strb w8, [x9]
114; CHECK-PIC-NEXT: ret
115;
116; CHECK-PIC-GLOBISEL-LABEL: foo3:
117; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
118; CHECK-PIC-GLOBISEL-NEXT: ldr x8, :got:src
119; CHECK-PIC-GLOBISEL-NEXT: ldr x9, :got:ptr
120; CHECK-PIC-GLOBISEL-NEXT: ldrb w8, [x8]
121; CHECK-PIC-GLOBISEL-NEXT: ldr x9, [x9]
122; CHECK-PIC-GLOBISEL-NEXT: strb w8, [x9]
123; CHECK-PIC-GLOBISEL-NEXT: ret
124entry:
125 %0 = load i8, i8* getelementptr inbounds ([65536 x i8], [65536 x i8]* @src, i64 0, i64 0), align 1
126 %1 = load i8*, i8** @ptr, align 8
127 store i8 %0, i8* %1, align 1
128 ret void
129}
130
131@lsrc = internal global i8 0, align 4
132@ldst = internal global i8 0, align 4
133@lptr = internal global i8* null, align 8
134
135define void @bar1() {
136; CHECK-LABEL: bar1:
137; CHECK: // %bb.0: // %entry
138; CHECK-NEXT: adr x8, lsrc
139; CHECK-NEXT: ldrb w8, [x8]
140; CHECK-NEXT: adr x9, ldst
141; CHECK-NEXT: strb w8, [x9]
142; CHECK-NEXT: ret
143;
144; CHECK-GLOBISEL-LABEL: bar1:
145; CHECK-GLOBISEL: // %bb.0: // %entry
146; CHECK-GLOBISEL-NEXT: adr x8, lsrc
147; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]
148; CHECK-GLOBISEL-NEXT: adr x9, ldst
149; CHECK-GLOBISEL-NEXT: strb w8, [x9]
150; CHECK-GLOBISEL-NEXT: ret
151;
152; CHECK-PIC-LABEL: bar1:
153; CHECK-PIC: // %bb.0: // %entry
154; CHECK-PIC-NEXT: adr x8, lsrc
155; CHECK-PIC-NEXT: ldrb w8, [x8]
156; CHECK-PIC-NEXT: adr x9, ldst
157; CHECK-PIC-NEXT: strb w8, [x9]
158; CHECK-PIC-NEXT: ret
159;
160; CHECK-PIC-GLOBISEL-LABEL: bar1:
161; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
162; CHECK-PIC-GLOBISEL-NEXT: adr x8, lsrc
163; CHECK-PIC-GLOBISEL-NEXT: ldrb w8, [x8]
164; CHECK-PIC-GLOBISEL-NEXT: adr x9, ldst
165; CHECK-PIC-GLOBISEL-NEXT: strb w8, [x9]
166; CHECK-PIC-GLOBISEL-NEXT: ret
167entry:
168 %0 = load i8, i8* @lsrc, align 4
169 store i8 %0, i8* @ldst, align 4
170 ret void
171}
172
173define void @bar2() {
174; CHECK-LABEL: bar2:
175; CHECK: // %bb.0: // %entry
176; CHECK-NEXT: adr x8, lptr
177; CHECK-NEXT: adr x9, ldst
178; CHECK-NEXT: str x9, [x8]
179; CHECK-NEXT: ret
180;
181; CHECK-GLOBISEL-LABEL: bar2:
182; CHECK-GLOBISEL: // %bb.0: // %entry
183; CHECK-GLOBISEL-NEXT: adr x8, ldst
184; CHECK-GLOBISEL-NEXT: adr x9, lptr
185; CHECK-GLOBISEL-NEXT: str x8, [x9]
186; CHECK-GLOBISEL-NEXT: ret
187;
188; CHECK-PIC-LABEL: bar2:
189; CHECK-PIC: // %bb.0: // %entry
190; CHECK-PIC-NEXT: adr x8, lptr
191; CHECK-PIC-NEXT: adr x9, ldst
192; CHECK-PIC-NEXT: str x9, [x8]
193; CHECK-PIC-NEXT: ret
194;
195; CHECK-PIC-GLOBISEL-LABEL: bar2:
196; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
197; CHECK-PIC-GLOBISEL-NEXT: adr x8, ldst
198; CHECK-PIC-GLOBISEL-NEXT: adr x9, lptr
199; CHECK-PIC-GLOBISEL-NEXT: str x8, [x9]
200; CHECK-PIC-GLOBISEL-NEXT: ret
201entry:
202 store i8* @ldst, i8** @lptr, align 8
203 ret void
204}
205
206define void @bar3() {
207; FIXME: Needn't adr lptr
208;
209; CHECK-LABEL: bar3:
210; CHECK: // %bb.0: // %entry
211; CHECK-NEXT: adr x8, lsrc
212; CHECK-NEXT: adr x9, lptr
213; CHECK-NEXT: ldrb w8, [x8]
214; CHECK-NEXT: ldr x9, [x9]
215; CHECK-NEXT: strb w8, [x9]
216; CHECK-NEXT: ret
217;
218; CHECK-GLOBISEL-LABEL: bar3:
219; CHECK-GLOBISEL: // %bb.0: // %entry
220; CHECK-GLOBISEL-NEXT: adr x8, lsrc
221; CHECK-GLOBISEL-NEXT: adr x9, lptr
222; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]
223; CHECK-GLOBISEL-NEXT: ldr x9, [x9]
224; CHECK-GLOBISEL-NEXT: strb w8, [x9]
225; CHECK-GLOBISEL-NEXT: ret
226;
227; CHECK-PIC-LABEL: bar3:
228; CHECK-PIC: // %bb.0: // %entry
229; CHECK-PIC-NEXT: adr x8, lsrc
230; CHECK-PIC-NEXT: adr x9, lptr
231; CHECK-PIC-NEXT: ldrb w8, [x8]
232; CHECK-PIC-NEXT: ldr x9, [x9]
233; CHECK-PIC-NEXT: strb w8, [x9]
234; CHECK-PIC-NEXT: ret
235;
236; CHECK-PIC-GLOBISEL-LABEL: bar3:
237; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
238; CHECK-PIC-GLOBISEL-NEXT: adr x8, lsrc
239; CHECK-PIC-GLOBISEL-NEXT: adr x9, lptr
240; CHECK-PIC-GLOBISEL-NEXT: ldrb w8, [x8]
241; CHECK-PIC-GLOBISEL-NEXT: ldr x9, [x9]
242; CHECK-PIC-GLOBISEL-NEXT: strb w8, [x9]
243; CHECK-PIC-GLOBISEL-NEXT: ret
244entry:
245 %0 = load i8, i8* @lsrc, align 4
246 %1 = load i8*, i8** @lptr, align 8
247 store i8 %0, i8* %1, align 1
248 ret void
249}
250
251
252@lbsrc = internal global [65536 x i8] zeroinitializer, align 4
253@lbdst = internal global [65536 x i8] zeroinitializer, align 4
254
255define void @baz1() {
256; CHECK-LABEL: baz1:
257; CHECK: // %bb.0: // %entry
258; CHECK-NEXT: adr x8, lbsrc
259; CHECK-NEXT: ldrb w8, [x8]
260; CHECK-NEXT: adr x9, lbdst
261; CHECK-NEXT: strb w8, [x9]
262; CHECK-NEXT: ret
263;
264; CHECK-GLOBISEL-LABEL: baz1:
265; CHECK-GLOBISEL: // %bb.0: // %entry
266; CHECK-GLOBISEL-NEXT: adr x8, lbsrc
267; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]
268; CHECK-GLOBISEL-NEXT: adr x9, lbdst
269; CHECK-GLOBISEL-NEXT: strb w8, [x9]
270; CHECK-GLOBISEL-NEXT: ret
271;
272; CHECK-PIC-LABEL: baz1:
273; CHECK-PIC: // %bb.0: // %entry
274; CHECK-PIC-NEXT: adr x8, lbsrc
275; CHECK-PIC-NEXT: ldrb w8, [x8]
276; CHECK-PIC-NEXT: adr x9, lbdst
277; CHECK-PIC-NEXT: strb w8, [x9]
278; CHECK-PIC-NEXT: ret
279;
280; CHECK-PIC-GLOBISEL-LABEL: baz1:
281; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
282; CHECK-PIC-GLOBISEL-NEXT: adr x8, lbsrc
283; CHECK-PIC-GLOBISEL-NEXT: ldrb w8, [x8]
284; CHECK-PIC-GLOBISEL-NEXT: adr x9, lbdst
285; CHECK-PIC-GLOBISEL-NEXT: strb w8, [x9]
286; CHECK-PIC-GLOBISEL-NEXT: ret
287entry:
288 %0 = load i8, i8* getelementptr inbounds ([65536 x i8], [65536 x i8]* @lbsrc, i64 0, i64 0), align 4
289 store i8 %0, i8* getelementptr inbounds ([65536 x i8], [65536 x i8]* @lbdst, i64 0, i64 0), align 4
290 ret void
291}
292
293define void @baz2() {
294; CHECK-LABEL: baz2:
295; CHECK: // %bb.0: // %entry
296; CHECK-NEXT: adr x8, lptr
297; CHECK-NEXT: adr x9, lbdst
298; CHECK-NEXT: str x9, [x8]
299; CHECK-NEXT: ret
300;
301; CHECK-GLOBISEL-LABEL: baz2:
302; CHECK-GLOBISEL: // %bb.0: // %entry
303; CHECK-GLOBISEL-NEXT: adr x8, lbdst
304; CHECK-GLOBISEL-NEXT: adr x9, lptr
305; CHECK-GLOBISEL-NEXT: str x8, [x9]
306; CHECK-GLOBISEL-NEXT: ret
307;
308; CHECK-PIC-LABEL: baz2:
309; CHECK-PIC: // %bb.0: // %entry
310; CHECK-PIC-NEXT: adr x8, lptr
311; CHECK-PIC-NEXT: adr x9, lbdst
312; CHECK-PIC-NEXT: str x9, [x8]
313; CHECK-PIC-NEXT: ret
314;
315; CHECK-PIC-GLOBISEL-LABEL: baz2:
316; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
317; CHECK-PIC-GLOBISEL-NEXT: adr x8, lbdst
318; CHECK-PIC-GLOBISEL-NEXT: adr x9, lptr
319; CHECK-PIC-GLOBISEL-NEXT: str x8, [x9]
320; CHECK-PIC-GLOBISEL-NEXT: ret
321entry:
322 store i8* getelementptr inbounds ([65536 x i8], [65536 x i8]* @lbdst, i64 0, i64 0), i8** @lptr, align 8
323 ret void
324}
325
326define void @baz3() {
327; FIXME: Needn't adr lptr
328;
329; CHECK-LABEL: baz3:
330; CHECK: // %bb.0: // %entry
331; CHECK-NEXT: adr x8, lbsrc
332; CHECK-NEXT: adr x9, lptr
333; CHECK-NEXT: ldrb w8, [x8]
334; CHECK-NEXT: ldr x9, [x9]
335; CHECK-NEXT: strb w8, [x9]
336; CHECK-NEXT: ret
337;
338; CHECK-GLOBISEL-LABEL: baz3:
339; CHECK-GLOBISEL: // %bb.0: // %entry
340; CHECK-GLOBISEL-NEXT: adr x8, lbsrc
341; CHECK-GLOBISEL-NEXT: adr x9, lptr
342; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]
343; CHECK-GLOBISEL-NEXT: ldr x9, [x9]
344; CHECK-GLOBISEL-NEXT: strb w8, [x9]
345; CHECK-GLOBISEL-NEXT: ret
346;
347; CHECK-PIC-LABEL: baz3:
348; CHECK-PIC: // %bb.0: // %entry
349; CHECK-PIC-NEXT: adr x8, lbsrc
350; CHECK-PIC-NEXT: adr x9, lptr
351; CHECK-PIC-NEXT: ldrb w8, [x8]
352; CHECK-PIC-NEXT: ldr x9, [x9]
353; CHECK-PIC-NEXT: strb w8, [x9]
354; CHECK-PIC-NEXT: ret
355;
356; CHECK-PIC-GLOBISEL-LABEL: baz3:
357; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
358; CHECK-PIC-GLOBISEL-NEXT: adr x8, lbsrc
359; CHECK-PIC-GLOBISEL-NEXT: adr x9, lptr
360; CHECK-PIC-GLOBISEL-NEXT: ldrb w8, [x8]
361; CHECK-PIC-GLOBISEL-NEXT: ldr x9, [x9]
362; CHECK-PIC-GLOBISEL-NEXT: strb w8, [x9]
363; CHECK-PIC-GLOBISEL-NEXT: ret
364entry:
365 %0 = load i8, i8* getelementptr inbounds ([65536 x i8], [65536 x i8]* @lbsrc, i64 0, i64 0), align 4
366 %1 = load i8*, i8** @lptr, align 8
367 store i8 %0, i8* %1, align 1
368 ret void
369}
370
371
372declare void @func(...)
373
374define i8* @externfuncaddr() {
375; CHECK-LABEL: externfuncaddr:
376; CHECK: // %bb.0: // %entry
377; CHECK-NEXT: adr x0, func
378; CHECK-NEXT: ret
379;
380; CHECK-GLOBISEL-LABEL: externfuncaddr:
381; CHECK-GLOBISEL: // %bb.0: // %entry
382; CHECK-GLOBISEL-NEXT: adr x0, func
383; CHECK-GLOBISEL-NEXT: ret
384;
385; CHECK-PIC-LABEL: externfuncaddr:
386; CHECK-PIC: // %bb.0: // %entry
387; CHECK-PIC-NEXT: ldr x0, :got:func
388; CHECK-PIC-NEXT: ret
389;
390; CHECK-PIC-GLOBISEL-LABEL: externfuncaddr:
391; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
392; CHECK-PIC-GLOBISEL-NEXT: ldr x0, :got:func
393; CHECK-PIC-GLOBISEL-NEXT: ret
394entry:
395 ret i8* bitcast (void (...)* @func to i8*)
396}
397
398define i8* @localfuncaddr() {
399; CHECK-LABEL: localfuncaddr:
400; CHECK: // %bb.0: // %entry
401; CHECK-NEXT: adr x0, externfuncaddr
402; CHECK-NEXT: ret
403;
404; CHECK-GLOBISEL-LABEL: localfuncaddr:
405; CHECK-GLOBISEL: // %bb.0: // %entry
406; CHECK-GLOBISEL-NEXT: adr x0, externfuncaddr
407; CHECK-GLOBISEL-NEXT: ret
408;
409; CHECK-PIC-LABEL: localfuncaddr:
410; CHECK-PIC: // %bb.0: // %entry
411; CHECK-PIC-NEXT: ldr x0, :got:externfuncaddr
412; CHECK-PIC-NEXT: ret
413;
414; CHECK-PIC-GLOBISEL-LABEL: localfuncaddr:
415; CHECK-PIC-GLOBISEL: // %bb.0: // %entry
416; CHECK-PIC-GLOBISEL-NEXT: ldr x0, :got:externfuncaddr
417; CHECK-PIC-GLOBISEL-NEXT: ret
418entry:
419 ret i8* bitcast (i8* ()* @externfuncaddr to i8*)
420}
421