[SystemZ] Allow LA and LARL to be rematerialized
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>
Thu, 27 Jun 2013 09:42:10 +0000 (09:42 +0000)
committerRichard Sandiford <rsandifo@linux.vnet.ibm.com>
Thu, 27 Jun 2013 09:42:10 +0000 (09:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185069 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SystemZ/SystemZInstrInfo.td
test/CodeGen/SystemZ/frame-01.ll
test/CodeGen/SystemZ/la-01.ll
test/DebugInfo/SystemZ/variable-loc.ll

index 7debcdd506acdbc3aedc3216d48c344ebd31c293..ff0d5665dfac085ba838996d153e0c006c943ee0 100644 (file)
@@ -417,7 +417,8 @@ def STRVG : StoreRXY<"strvg", 0xE32F, storeu<bswap, nonvolatile_store>, GR64>;
 //===----------------------------------------------------------------------===//
 
 // Load BDX-style addresses.
-let neverHasSideEffects = 1, Function = "la" in {
+let neverHasSideEffects = 1, isAsCheapAsAMove = 1, isReMaterializable = 1,
+    Function = "la" in {
   let PairType = "12" in
     def LA : InstRX<0x41, (outs GR64:$R1), (ins laaddr12pair:$XBD2),
                     "la\t$R1, $XBD2",
@@ -430,7 +431,8 @@ let neverHasSideEffects = 1, Function = "la" in {
 
 // Load a PC-relative address.  There's no version of this instruction
 // with a 16-bit offset, so there's no relaxation.
-let neverHasSideEffects = 1 in {
+let neverHasSideEffects = 1, isAsCheapAsAMove = 1, isMoveImm = 1,
+    isReMaterializable = 1 in {
   def LARL : InstRIL<0xC00, (outs GR64:$R1), (ins pcrel32:$I2),
                      "larl\t$R1, $I2",
                      [(set GR64:$R1, pcrel32:$I2)]>;
index 0d343128c4cd8fd6b35c075e025dc129e9797f1d..6c60a2e96fc0e706403c274b39c41c813b0f3dd1 100644 (file)
@@ -3,6 +3,8 @@
 ;
 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
 
+declare void @foo(i32 *)
+
 ; The CFA offset is 160 (the caller-allocated part of the frame) + 168.
 define void @f1(i64 %x) {
 ; CHECK: f1:
@@ -108,3 +110,17 @@ define void @f7(i64 %x) {
   store volatile i64 %x, i64* %ptr
   ret void
 }
+
+; Make sure that LA can be rematerialized.
+define void @f8() {
+; CHECK: f8:
+; CHECK: la %r2, 164(%r15)
+; CHECK: brasl %r14, foo@PLT
+; CHECK: la %r2, 164(%r15)
+; CHECK: brasl %r14, foo@PLT
+; CHECK: br %r14
+  %ptr = alloca i32
+  call void @foo(i32 *%ptr)
+  call void @foo(i32 *%ptr)
+  ret void
+}
index b43e3f8662dc774fe62131d2abd5e83a262f1bc4..1ebe109ee007c49ad53a8fa1f8e1241b4187eab2 100644 (file)
@@ -15,6 +15,8 @@ define void @df() {
   ret void
 }
 
+declare void @foo(i32 *)
+
 ; Test a load of a fully-aligned external variable.
 define i32 *@f1() {
 ; CHECK: f1:
@@ -78,3 +80,16 @@ define void() *@f8() {
 ; CHECK-NEXT: br %r14
   ret void() *@df
 }
+
+; Test that LARL can be rematerialized.
+define i32 @f9() {
+; CHECK: 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
+}
index e6f4ff99dd4f8d88e51372f001c0c47255300e18..a5ecdb9e7d1ea2c7b13307601343c8d35779a8e9 100644 (file)
@@ -8,8 +8,7 @@
 ;
 ; CHECK: main:
 ; CHECK: aghi    %r15, -568
-; CHECK: la      [[MAIN_ARR:%r[0-9]+]], 164(%r11)
-; CHECK: lgr     %r2, [[MAIN_ARR]]
+; CHECK: la      %r2, 164(%r11)
 ; CHECK: brasl   %r14, populate_array@PLT
 ;
 ; Now check that the debugging information reflects this: