Home | History | Annotate | Download | only in SystemZ
      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 }
     96