blob: 31d2041251708f8ac724efcdd68dd8b367d72961 [file] [log] [blame]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00001; 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
13declare void @ef()
14define void @df() {
15 ret void
16}
17
Richard Sandiford891a7e72013-06-27 09:42:10 +000018declare void @foo(i32 *)
19
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000020; Test a load of a fully-aligned external variable.
21define i32 *@f1() {
Stephen Lind24ab202013-07-14 06:24:09 +000022; CHECK-LABEL: f1:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000023; 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.
29define i32 *@f2() {
Stephen Lind24ab202013-07-14 06:24:09 +000030; CHECK-LABEL: f2:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000031; 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.
37define i32 *@f3() {
Stephen Lind24ab202013-07-14 06:24:09 +000038; CHECK-LABEL: f3:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000039; 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.
45define i32 *@f4() {
Stephen Lind24ab202013-07-14 06:24:09 +000046; CHECK-LABEL: f4:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000047; 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.
53define i32 *@f5() {
Stephen Lind24ab202013-07-14 06:24:09 +000054; CHECK-LABEL: f5:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000055; 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.
61define i32 *@f6() {
Stephen Lind24ab202013-07-14 06:24:09 +000062; CHECK-LABEL: f6:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000063; CHECK: lgrl %r2, d1@GOT
64; CHECK-NEXT: br %r14
65 ret i32 *@d1
66}
67
68; Test a load of an external function.
69define void() *@f7() {
Stephen Lind24ab202013-07-14 06:24:09 +000070; CHECK-LABEL: f7:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000071; CHECK: larl %r2, ef
72; CHECK-NEXT: br %r14
73 ret void() *@ef
74}
75
76; Test a load of a local function.
77define void() *@f8() {
Stephen Lind24ab202013-07-14 06:24:09 +000078; CHECK-LABEL: f8:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000079; CHECK: larl %r2, df
80; CHECK-NEXT: br %r14
81 ret void() *@df
82}
Richard Sandiford891a7e72013-06-27 09:42:10 +000083
84; Test that LARL can be rematerialized.
85define i32 @f9() {
Stephen Lind24ab202013-07-14 06:24:09 +000086; CHECK-LABEL: f9:
Richard Sandiford891a7e72013-06-27 09:42:10 +000087; 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}