| ; Test loads of symbolic addresses when generating small-model non-PIC. |
| ; All addresses can be treated as PC |
| ; |
| ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s |
| |
| @e4 = external global i32 |
| @d4 = global i32 1 |
| @e2 = external global i32, align 2 |
| @d2 = global i32 1, align 2 |
| @e1 = external global i32, align 1 |
| @d1 = global i32 1, align 1 |
| |
| declare void @ef() |
| define void @df() { |
| ret void |
| } |
| |
| declare void @foo(i32 *) |
| |
| ; Test a load of a fully-aligned external variable. |
| define i32 *@f1() { |
| ; CHECK-LABEL: f1: |
| ; CHECK: larl %r2, e4 |
| ; CHECK-NEXT: br %r14 |
| ret i32 *@e4 |
| } |
| |
| ; Test a load of a fully-aligned local variable. |
| define i32 *@f2() { |
| ; CHECK-LABEL: f2: |
| ; CHECK: larl %r2, d4 |
| ; CHECK-NEXT: br %r14 |
| ret i32 *@d4 |
| } |
| |
| ; Test a load of a 2-byte-aligned external variable. |
| define i32 *@f3() { |
| ; CHECK-LABEL: f3: |
| ; CHECK: larl %r2, e2 |
| ; CHECK-NEXT: br %r14 |
| ret i32 *@e2 |
| } |
| |
| ; Test a load of a 2-byte-aligned local variable. |
| define i32 *@f4() { |
| ; CHECK-LABEL: f4: |
| ; CHECK: larl %r2, d2 |
| ; CHECK-NEXT: br %r14 |
| ret i32 *@d2 |
| } |
| |
| ; Test a load of an unaligned external variable, which must go via the GOT. |
| define i32 *@f5() { |
| ; CHECK-LABEL: f5: |
| ; CHECK: lgrl %r2, e1@GOT |
| ; CHECK-NEXT: br %r14 |
| ret i32 *@e1 |
| } |
| |
| ; Test a load of an unaligned local variable, which must go via the GOT. |
| define i32 *@f6() { |
| ; CHECK-LABEL: f6: |
| ; CHECK: lgrl %r2, d1@GOT |
| ; CHECK-NEXT: br %r14 |
| ret i32 *@d1 |
| } |
| |
| ; Test a load of an external function. |
| define void() *@f7() { |
| ; CHECK-LABEL: f7: |
| ; CHECK: larl %r2, ef |
| ; CHECK-NEXT: br %r14 |
| ret void() *@ef |
| } |
| |
| ; Test a load of a local function. |
| define void() *@f8() { |
| ; CHECK-LABEL: f8: |
| ; CHECK: larl %r2, df |
| ; CHECK-NEXT: br %r14 |
| ret void() *@df |
| } |
| |
| ; Test that LARL can be rematerialized. |
| define i32 @f9() { |
| ; CHECK-LABEL: f9: |
| ; CHECK: larl %r2, d2 |
| ; CHECK: brasl %r14, foo@PLT |
| ; CHECK: larl %r2, d2 |
| ; CHECK: brasl %r14, foo@PLT |
| ; CHECK: br %r14 |
| call void @foo(i32 *@d2) |
| call void @foo(i32 *@d2) |
| ret i32 0 |
| } |