[flang-commits] [flang] [flang] Derive target-specific data layout from triple in TargetRewrite (PR #209649)

via flang-commits flang-commits at lists.llvm.org
Wed Jul 15 04:49:24 PDT 2026


https://github.com/anoopkg6 updated https://github.com/llvm/llvm-project/pull/209649

>From 2d2a8cb145b7ded9929e08630f05f2adad2bcbfb Mon Sep 17 00:00:00 2001
From: "anoop.kumar6 at ibm.com" <anoopk at b35lp63.lnxne.boe>
Date: Wed, 15 Jul 2026 01:20:31 +0200
Subject: [PATCH 1/2] [flang] Derive target-specific data layout from triple in
 TargetRewrite

When target-rewrite runs without an explicit llvm.data_layout attribute,
it falls back to hardcoded generic default in MLIR (kDefaultDataLayout)
which specifies f128 ABI alignment as 16 bytes. This is incorrect for
targets where f128 ABI alignment differs from its size, such as SystemZ
which requires 8 bytes per the ELF ABI.

The target triple is available in the target-rewrite pass. Fix by
deriving the data layout from the target triple using
triple.computeDataLayout() before falling back to the generic default,
ensuring target-specific alignments are correctly reflected in
dlti.dl_spec.
---
 flang/lib/Optimizer/CodeGen/TargetRewrite.cpp       | 11 +++++++++++
 .../Fir/target-rewrite-datalayout-from-triple.fir   | 13 +++++++++++++
 2 files changed, 24 insertions(+)
 create mode 100644 flang/test/Fir/target-rewrite-datalayout-from-triple.fir

diff --git a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
index 0ce27abce870b..37f502d1aa1e0 100644
--- a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
+++ b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
@@ -107,6 +107,17 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
     if (!forcedTargetABI.empty())
       fir::setTargetABI(mod, forcedTargetABI);
 
+    // If no data layout is set, derive it from the target triple to get
+    // correct target-specific alignments rather than a generic default.
+    if (!mod.getDataLayoutSpec()) {
+      llvm::Triple triple(fir::getTargetTriple(mod));
+      std::string dlStr = triple.computeDataLayout();
+      if (!dlStr.empty()) {
+        llvm::DataLayout llvmDL(dlStr);
+        fir::support::setMLIRDataLayout(mod, llvmDL);
+      }
+    }
+
     // TargetRewrite will require querying the type storage sizes, if it was
     // not set already, create a DataLayoutSpec for the ModuleOp now.
     std::optional<mlir::DataLayout> dl =
diff --git a/flang/test/Fir/target-rewrite-datalayout-from-triple.fir b/flang/test/Fir/target-rewrite-datalayout-from-triple.fir
new file mode 100644
index 0000000000000..fdacd63bfc34c
--- /dev/null
+++ b/flang/test/Fir/target-rewrite-datalayout-from-triple.fir
@@ -0,0 +1,13 @@
+// RUN: fir-opt --target-rewrite="target=s390x-unknown-linux-gnu" %s | FileCheck %s
+
+// Test that target-rewrite derives correct data layout from target triple
+// when no llvm.data_layout is present. For SystemZ, f128 ABI alignment
+// must be 8 bytes (64 bits), not 16.
+
+module attributes {
+  llvm.target_triple = "s390x-unknown-linux-gnu"
+} {
+}
+
+// CHECK: dlti.dl_spec
+// CHECK: f128 = dense<64> : vector<2xi64>

>From 0d029cc78d5531e2bf703f82e634650656279aaf Mon Sep 17 00:00:00 2001
From: "anoop.kumar6 at ibm.com" <anoopk at b35lp63.lnxne.boe>
Date: Wed, 15 Jul 2026 02:41:11 +0200
Subject: [PATCH 2/2] Fix build failure

---
 .../Fir/target-rewrite-datalayout-from-triple.fir   | 13 -------------
 1 file changed, 13 deletions(-)
 delete mode 100644 flang/test/Fir/target-rewrite-datalayout-from-triple.fir

diff --git a/flang/test/Fir/target-rewrite-datalayout-from-triple.fir b/flang/test/Fir/target-rewrite-datalayout-from-triple.fir
deleted file mode 100644
index fdacd63bfc34c..0000000000000
--- a/flang/test/Fir/target-rewrite-datalayout-from-triple.fir
+++ /dev/null
@@ -1,13 +0,0 @@
-// RUN: fir-opt --target-rewrite="target=s390x-unknown-linux-gnu" %s | FileCheck %s
-
-// Test that target-rewrite derives correct data layout from target triple
-// when no llvm.data_layout is present. For SystemZ, f128 ABI alignment
-// must be 8 bytes (64 bits), not 16.
-
-module attributes {
-  llvm.target_triple = "s390x-unknown-linux-gnu"
-} {
-}
-
-// CHECK: dlti.dl_spec
-// CHECK: f128 = dense<64> : vector<2xi64>



More information about the flang-commits mailing list