1*9880d681SAndroid Build Coastguard Worker; Test loads of symbolic addresses when generating small-model non-PIC. 2*9880d681SAndroid Build Coastguard Worker; All addresses can be treated as PC 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker@e4 = external global i32 7*9880d681SAndroid Build Coastguard Worker@d4 = global i32 1 8*9880d681SAndroid Build Coastguard Worker@e2 = external global i32, align 2 9*9880d681SAndroid Build Coastguard Worker@d2 = global i32 1, align 2 10*9880d681SAndroid Build Coastguard Worker@e1 = external global i32, align 1 11*9880d681SAndroid Build Coastguard Worker@d1 = global i32 1, align 1 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdeclare void @ef() 14*9880d681SAndroid Build Coastguard Workerdefine void @df() { 15*9880d681SAndroid Build Coastguard Worker ret void 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32 *) 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; Test a load of a fully-aligned external variable. 21*9880d681SAndroid Build Coastguard Workerdefine i32 *@f1() { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 23*9880d681SAndroid Build Coastguard Worker; CHECK: larl %r2, e4 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br %r14 25*9880d681SAndroid Build Coastguard Worker ret i32 *@e4 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; Test a load of a fully-aligned local variable. 29*9880d681SAndroid Build Coastguard Workerdefine i32 *@f2() { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 31*9880d681SAndroid Build Coastguard Worker; CHECK: larl %r2, d4 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br %r14 33*9880d681SAndroid Build Coastguard Worker ret i32 *@d4 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; Test a load of a 2-byte-aligned external variable. 37*9880d681SAndroid Build Coastguard Workerdefine i32 *@f3() { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 39*9880d681SAndroid Build Coastguard Worker; CHECK: larl %r2, e2 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br %r14 41*9880d681SAndroid Build Coastguard Worker ret i32 *@e2 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; Test a load of a 2-byte-aligned local variable. 45*9880d681SAndroid Build Coastguard Workerdefine i32 *@f4() { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK: larl %r2, d2 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br %r14 49*9880d681SAndroid Build Coastguard Worker ret i32 *@d2 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; Test a load of an unaligned external variable, which must go via the GOT. 53*9880d681SAndroid Build Coastguard Workerdefine i32 *@f5() { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 55*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl %r2, e1@GOT 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br %r14 57*9880d681SAndroid Build Coastguard Worker ret i32 *@e1 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; Test a load of an unaligned local variable, which must go via the GOT. 61*9880d681SAndroid Build Coastguard Workerdefine i32 *@f6() { 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 63*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl %r2, d1@GOT 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br %r14 65*9880d681SAndroid Build Coastguard Worker ret i32 *@d1 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; Test a load of an external function. 69*9880d681SAndroid Build Coastguard Workerdefine void() *@f7() { 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 71*9880d681SAndroid Build Coastguard Worker; CHECK: larl %r2, ef 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br %r14 73*9880d681SAndroid Build Coastguard Worker ret void() *@ef 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; Test a load of a local function. 77*9880d681SAndroid Build Coastguard Workerdefine void() *@f8() { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 79*9880d681SAndroid Build Coastguard Worker; CHECK: larl %r2, df 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br %r14 81*9880d681SAndroid Build Coastguard Worker ret void() *@df 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; Test that LARL can be rematerialized. 85*9880d681SAndroid Build Coastguard Workerdefine i32 @f9() { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 87*9880d681SAndroid Build Coastguard Worker; CHECK: larl %r2, d2 88*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 89*9880d681SAndroid Build Coastguard Worker; CHECK: larl %r2, d2 90*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 91*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 92*9880d681SAndroid Build Coastguard Worker call void @foo(i32 *@d2) 93*9880d681SAndroid Build Coastguard Worker call void @foo(i32 *@d2) 94*9880d681SAndroid Build Coastguard Worker ret i32 0 95*9880d681SAndroid Build Coastguard Worker} 96