[SystemZ] Add CodeGen test cases
[oota-llvm.git] / test / CodeGen / SystemZ / la-01.ll
1 ; Test loads of symbolic addresses when generating small-model non-PIC.
2 ; All addresses can be treated as PC
3 ;
4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5
6 @e4 = external global i32
7 @d4 = global i32 1
8 @e2 = external global i32, align 2
9 @d2 = global i32 1, align 2
10 @e1 = external global i32, align 1
11 @d1 = global i32 1, align 1
12
13 declare void @ef()
14 define void @df() {
15   ret void
16 }
17
18 ; Test a load of a fully-aligned external variable.
19 define i32 *@f1() {
20 ; CHECK: f1:
21 ; CHECK: larl %r2, e4
22 ; CHECK-NEXT: br %r14
23   ret i32 *@e4
24 }
25
26 ; Test a load of a fully-aligned local variable.
27 define i32 *@f2() {
28 ; CHECK: f2:
29 ; CHECK: larl %r2, d4
30 ; CHECK-NEXT: br %r14
31   ret i32 *@d4
32 }
33
34 ; Test a load of a 2-byte-aligned external variable.
35 define i32 *@f3() {
36 ; CHECK: f3:
37 ; CHECK: larl %r2, e2
38 ; CHECK-NEXT: br %r14
39   ret i32 *@e2
40 }
41
42 ; Test a load of a 2-byte-aligned local variable.
43 define i32 *@f4() {
44 ; CHECK: f4:
45 ; CHECK: larl %r2, d2
46 ; CHECK-NEXT: br %r14
47   ret i32 *@d2
48 }
49
50 ; Test a load of an unaligned external variable, which must go via the GOT.
51 define i32 *@f5() {
52 ; CHECK: f5:
53 ; CHECK: lgrl %r2, e1@GOT
54 ; CHECK-NEXT: br %r14
55   ret i32 *@e1
56 }
57
58 ; Test a load of an unaligned local variable, which must go via the GOT.
59 define i32 *@f6() {
60 ; CHECK: f6:
61 ; CHECK: lgrl %r2, d1@GOT
62 ; CHECK-NEXT: br %r14
63   ret i32 *@d1
64 }
65
66 ; Test a load of an external function.
67 define void() *@f7() {
68 ; CHECK: f7:
69 ; CHECK: larl %r2, ef
70 ; CHECK-NEXT: br %r14
71   ret void() *@ef
72 }
73
74 ; Test a load of a local function.
75 define void() *@f8() {
76 ; CHECK: f8:
77 ; CHECK: larl %r2, df
78 ; CHECK-NEXT: br %r14
79   ret void() *@df
80 }