; 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 }