[llvm] bc80d1a - [SystemZ][z/OS] Set R5 as not restored. (#179666)

via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 4 07:57:28 PST 2026


Author: sujianIBM
Date: 2026-02-04T10:57:24-05:00
New Revision: bc80d1ac0cff6823ca8d2de222623c0fd7ed8edf

URL: https://github.com/llvm/llvm-project/commit/bc80d1ac0cff6823ca8d2de222623c0fd7ed8edf
DIFF: https://github.com/llvm/llvm-project/commit/bc80d1ac0cff6823ca8d2de222623c0fd7ed8edf.diff

LOG: [SystemZ][z/OS] Set R5 as not restored. (#179666)

R5 (environment register) should not be restored. This is missing in the
code.
Add it back and also add a test to verify it.

Added: 
    

Modified: 
    llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
    llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
index 570bbd884a244..b113f92ebea19 100644
--- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
@@ -1027,8 +1027,10 @@ bool SystemZXPLINKFrameLowering::assignCalleeSavedSpillSlots(
 
   // If this function has an associated personality function then the
   // environment register R5 must be saved in the DSA.
-  if (!MF.getLandingPads().empty())
+  if (!MF.getLandingPads().empty()) {
     CSI.push_back(CalleeSavedInfo(Regs.getADARegister()));
+    CSI.back().setRestored(false);
+  }
 
   // Scan the call-saved GPRs and find the bounds of the register spill area.
   Register LowRestoreGPR = 0;

diff  --git a/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll b/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll
index bdd0660651456..0687d00283c80 100644
--- a/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll
+++ b/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll
@@ -316,6 +316,27 @@ define i64 @func5(i64 %n) {
   ret i64 %call
 }
 
+; Require saving of r5, which is not restored.
+; CHECK64: stmg 5,9,1864(4)
+; CHECK64-NEXT: aghi 4,-192
+; CHECK64: lmg 7,9,2072(4)
+; CHECK64-NEXT: aghi 4,192
+declare i32 @personality(...)
+declare void @panic()
+define void @func6() uwtable personality ptr @personality {
+entry:
+  br label %bb1
+bb1:
+  invoke void @panic()
+          to label %bb2 unwind label %bb3
+bb2:
+  ret void
+bb3:
+  %lp = landingpad { ptr, i32 }
+          catch ptr null
+  br label %bb1
+}
+
 ; CHECK-LABEL: large_stack
 ; CHECK64: agfi  4,-1048800
 ; CHECK64-NEXT: llgt  3,1208
@@ -336,12 +357,12 @@ define void @large_stack0() {
 ; CHECK64: lgr 0,3
 ; CHECK64: llgt  3,1208
 ; CHECK64: cg  4,64(3)
-; CHECK64: jhe L#BB7_2
+; CHECK64: jhe L#BB8_2
 ; CHECK64: %bb.1:
 ; CHECK64: lg  3,72(3)
 ; CHECK64: basr  3,3
 ; CHECK64: bcr 0,7
-; CHECK64: L#BB7_2:
+; CHECK64: L#BB8_2:
 ; CHECK64: stmg  6,7,2064(4)
 ; CHECK64: lgr 3,0
 
@@ -361,12 +382,12 @@ define void @large_stack1(i64 %n1, i64 %n2, i64 %n3) {
 ; CHECK64: agfi  4,-1048800
 ; CHECK64: llgt  3,1208
 ; CHECK64: cg  4,64(3)
-; CHECK64: jhe L#BB8_2
+; CHECK64: jhe L#BB9_2
 ; CHECK64: %bb.1:
 ; CHECK64: lg  3,72(3)
 ; CHECK64: basr  3,3
 ; CHECK64: bcr 0,7
-; CHECK64: L#BB8_2:
+; CHECK64: L#BB9_2:
 ; CHECK64: lgr 3,0
 ; CHECK64: lg  3,2192(3)
 ; CHECK64: stmg  4,12,2048(4)


        


More information about the llvm-commits mailing list