Author: Jonas Paulsson
Date: 2026-01-20T09:54:47-06:00
New Revision: 8eccda10d2a83d46fdc9b9dca7c2218926f67979

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

LOG: [SystemZ] Add SP alignment to the DataLayout string. (#176041)

Add '-S64' to the SystemZ datalayout string, to avoid overalignment of
stack objects.

Fixes #173402

Added: 
    llvm/test/CodeGen/SystemZ/stack-align.ll

Modified: 
    clang/test/CodeGen/target-data.c
    llvm/lib/IR/AutoUpgrade.cpp
    llvm/lib/TargetParser/TargetDataLayout.cpp
    llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/test/CodeGen/target-data.c 
b/clang/test/CodeGen/target-data.c
index e95079490bd3c..ee8e45511720c 100644
--- a/clang/test/CodeGen/target-data.c
+++ b/clang/test/CodeGen/target-data.c
@@ -207,11 +207,11 @@
 // RUN: FileCheck %s -check-prefix=SYSTEMZ
 // RUN: %clang_cc1 -triple s390x-unknown -target-cpu z13 -target-feature 
+soft-float -o - -emit-llvm %s | \
 // RUN: FileCheck %s -check-prefix=SYSTEMZ
-// SYSTEMZ: target datalayout = 
"E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
+// SYSTEMZ: target datalayout = 
"E-S64-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
 
 // RUN: %clang_cc1 -triple s390x-unknown -target-cpu z13 -o - -emit-llvm %s | \
 // RUN: FileCheck %s -check-prefix=SYSTEMZ-VECTOR
-// SYSTEMZ-VECTOR: target datalayout = 
"E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
+// SYSTEMZ-VECTOR: target datalayout = 
"E-S64-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
 
 // RUN: %clang_cc1 -triple s390x-none-zos -target-cpu z10 -o - -emit-llvm %s | 
\
 // RUN: FileCheck %s -check-prefix=ZOS
@@ -219,7 +219,7 @@
 // RUN: FileCheck %s -check-prefix=ZOS
 // RUN: %clang_cc1 -triple s390x-none-zos -target-cpu z13 -o - -emit-llvm %s | 
\
 // RUN: FileCheck %s -check-prefix=ZOS
-// ZOS: target datalayout = 
"E-m:l-p1:32:32-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
+// ZOS: target datalayout = 
"E-S64-m:l-p1:32:32-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
 
 // RUN: %clang_cc1 -triple msp430-unknown -o - -emit-llvm %s | \
 // RUN: FileCheck %s -check-prefix=MSP430

diff  --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index b886a589d3ff1..0897f091fe2f8 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -6526,6 +6526,13 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, 
StringRef TT) {
     return Res;
   }
 
+  if (T.isSystemZ() && !DL.empty()) {
+    // Make sure the stack alignment is present.
+    if (!DL.contains("-S64"))
+      return "E-S64" + DL.drop_front(1).str();
+    return DL.str();
+  }
+
   auto AddPtr32Ptr64AddrSpaces = [&DL, &Res]() {
     // If the datalayout matches the expected format, add pointer size address
     // spaces to the datalayout.

diff  --git a/llvm/lib/TargetParser/TargetDataLayout.cpp 
b/llvm/lib/TargetParser/TargetDataLayout.cpp
index b8c3b4325558c..b985c1eec4244 100644
--- a/llvm/lib/TargetParser/TargetDataLayout.cpp
+++ b/llvm/lib/TargetParser/TargetDataLayout.cpp
@@ -357,6 +357,9 @@ static std::string computeSystemZDataLayout(const Triple 
&TT) {
   // Big endian.
   Ret += "E";
 
+  // The natural stack alignment is 64 bits.
+  Ret += "-S64";
+
   // Data mangling.
   Ret += getManglingComponent(TT);
 

diff  --git a/llvm/test/CodeGen/SystemZ/stack-align.ll 
b/llvm/test/CodeGen/SystemZ/stack-align.ll
new file mode 100644
index 0000000000000..d7f6b1e8a46f2
--- /dev/null
+++ b/llvm/test/CodeGen/SystemZ/stack-align.ll
@@ -0,0 +1,17 @@
+; RUN: opt < %s -mtriple=s390x-unknown-linux-gnu -mcpu=z16 -S 
-passes=infer-alignment \
+; RUN:   2>&1 | FileCheck %s
+;
+; Test that the alignment of the alloca is not increased beyond the stack
+; alignment of 8 bytes.
+
+declare void @foo(ptr)
+
+define void @f1(<4 x i64> %Arg) {
+; CHECK-LABEL: define void @f1
+; CHECK-NEXT:    %param = alloca <4 x i64>, align 8
+; CHECK-NEXT:    store <4 x i64> %Arg, ptr %param, align 8
+  %param = alloca <4 x i64>, align 8
+  store <4 x i64> %Arg, ptr %param, align 8
+  call void @foo(ptr %param)
+  ret void
+}

diff  --git a/llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp 
b/llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp
index 898141cbcf978..a082adbf6565e 100644
--- a/llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp
+++ b/llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp
@@ -68,6 +68,12 @@ TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) {
       "1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:"
       "128:48-p9:192:256:256:32");
 
+  // Check that SystemZ adds -S64 if needed.
+  EXPECT_EQ(UpgradeDataLayoutString(
+                "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64",
+                "systemz"),
+            "E-S64-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64");
+
   // Check that RISCV64 upgrades -n64 to -n32:64.
   EXPECT_EQ(UpgradeDataLayoutString("e-m:e-p:64:64-i64:64-i128:128-n64-S128",
                                     "riscv64"),


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to