[SystemZ] Add unsigned compare-and-branch instructions
[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 declare void @foo(i32 *)
19
20 ; Test a load of a fully-aligned external variable.
21 define i32 *@f1() {
22 ; CHECK-LABEL: f1:
23 ; CHECK: larl %r2, e4
24 ; CHECK-NEXT: br %r14
25   ret i32 *@e4
26 }
27
28 ; Test a load of a fully-aligned local variable.
29 define i32 *@f2() {
30 ; CHECK-LABEL: f2:
31 ; CHECK: larl %r2, d4
32 ; CHECK-NEXT: br %r14
33   ret i32 *@d4
34 }
35
36 ; Test a load of a 2-byte-aligned external variable.
37 define i32 *@f3() {
38 ; CHECK-LABEL: f3:
39 ; CHECK: larl %r2, e2
40 ; CHECK-NEXT: br %r14
41   ret i32 *@e2
42 }
43
44 ; Test a load of a 2-byte-aligned local variable.
45 define i32 *@f4() {
46 ; CHECK-LABEL: f4:
47 ; CHECK: larl %r2, d2
48 ; CHECK-NEXT: br %r14
49   ret i32 *@d2
50 }
51
52 ; Test a load of an unaligned external variable, which must go via the GOT.
53 define i32 *@f5() {
54 ; CHECK-LABEL: f5:
55 ; CHECK: lgrl %r2, e1@GOT
56 ; CHECK-NEXT: br %r14
57   ret i32 *@e1
58 }
59
60 ; Test a load of an unaligned local variable, which must go via the GOT.
61 define i32 *@f6() {
62 ; CHECK-LABEL: f6:
63 ; CHECK: lgrl %r2, d1@GOT
64 ; CHECK-NEXT: br %r14
65   ret i32 *@d1
66 }
67
68 ; Test a load of an external function.
69 define void() *@f7() {
70 ; CHECK-LABEL: f7:
71 ; CHECK: larl %r2, ef
72 ; CHECK-NEXT: br %r14
73   ret void() *@ef
74 }
75
76 ; Test a load of a local function.
77 define void() *@f8() {
78 ; CHECK-LABEL: f8:
79 ; CHECK: larl %r2, df
80 ; CHECK-NEXT: br %r14
81   ret void() *@df
82 }
83
84 ; Test that LARL can be rematerialized.
85 define i32 @f9() {
86 ; CHECK-LABEL: f9:
87 ; CHECK: larl %r2, d2
88 ; CHECK: brasl %r14, foo@PLT
89 ; CHECK: larl %r2, d2
90 ; CHECK: brasl %r14, foo@PLT
91 ; CHECK: br %r14
92   call void @foo(i32 *@d2)
93   call void @foo(i32 *@d2)
94   ret i32 0
95 }