[llvm] [llvm] Upgrade ARM data layouts that are missing Fi8 (PR #224639)

David Spickett via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 28 01:34:28 PDT 2026


https://github.com/DavidSpickett updated https://github.com/llvm/llvm-project/pull/224639

>From e1767658f954e2113f2c3e1fe8df9a734f178c71 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Fri, 18 Sep 2026 13:09:36 +0000
Subject: [PATCH 1/2] [llvm] Upgrade ARM data layouts that are missing Fi8

Such as the ones in https://github.com/llvm/llvm-test-suite/tree/main/Bitcode/simd_ops,
which started failing to compile after
https://github.com/llvm/llvm-project/pull/224012
stopped us overriding the module data layout.

fatal error: error in backend: Can't create a MachineFunction using a Module with a Target-incompatible DataLayout attached
  Target DataLayout: e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64
  Module DataLayout: e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64

The old layout is p32:32-i64, the new is p32:32-Fi8-i64.

In this change I have added this case to the data layout
upgrades. If there's no p32:32, the layout is not changed,
also if there is already a "Fi" or "Fn" in the layout.
---
 llvm/lib/IR/AutoUpgrade.cpp                   |  9 +++++++
 .../Bitcode/DataLayoutUpgradeTest.cpp         | 25 +++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 75fc03c22222b..5b942157bf7b4 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7861,6 +7861,15 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
     Res.insert(Pos, "-f64:32:64");
   }
 
+  // ARM data layout upgrades.
+  // Add -Fi8 if a -F has not already been specified.
+  if (T.isARM() && !DL.empty() && !DL.contains("Fi") && !DL.contains("Fn")) {
+    const std::string p3232 = "p:32:32";
+    size_t Pos = Res.find(p3232);
+    if (Pos != StringRef::npos)
+      Res.insert(Pos + p3232.size(), "-Fi8");
+  }
+
   if (!T.isX86())
     return Res;
 
diff --git a/llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp b/llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp
index 7cfa38bedb6ea..77308f89327c7 100644
--- a/llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp
+++ b/llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp
@@ -137,6 +137,12 @@ TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) {
   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv64"), "e-p:32:32-G1");
   // but that SPIRV Logical does not.
   EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spirv"), "e-p:32:32");
+
+  // Check that ARM targets add -Fi8 if it is not present.
+  EXPECT_EQ(UpgradeDataLayoutString(
+                "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "arm"),
+            "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
+  EXPECT_EQ(UpgradeDataLayoutString("p:32:32", "arm"), "p:32:32-Fi8");
 }
 
 TEST(DataLayoutUpgradeTest, NoDataLayoutUpgrade) {
@@ -226,6 +232,22 @@ TEST(DataLayoutUpgradeTest, NoDataLayoutUpgrade) {
           "powerpc64-unknown-aix"),
       "E-m:a-Fi64-i64:64-i128:128-n32:64-f64:32:64-S128-v256:256:256-v512:512:"
       "512");
+
+  // Check that ARM targets do not add Fi8 if there is no p32:32.
+  const char *ARM_no_f3232 = "e-m:e-i64:64-v128:64:128-a:0:32-n32-s64";
+  EXPECT_EQ(UpgradeDataLayoutString(ARM_no_f3232, "arm"), ARM_no_f3232);
+  // Or if Fi8 is already present.
+  const char *ARM_has_fi8 =
+      "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-s64";
+  EXPECT_EQ(UpgradeDataLayoutString(ARM_has_fi8, "arm"), ARM_has_fi8);
+  // Or if there is another Fi.
+  const char *ARM_has_fi4 =
+      "e-m:e-p:32:32-Fi4-i64:64-v128:64:128-a:0:32-n32-s64";
+  EXPECT_EQ(UpgradeDataLayoutString(ARM_has_fi4, "arm"), ARM_has_fi4);
+  // Or if there is a Fn.
+  const char *ARM_has_fn =
+      "e-m:e-p:32:32-Fn4-i64:64-v128:64:128-a:0:32-n32-s64";
+  EXPECT_EQ(UpgradeDataLayoutString(ARM_has_fn, "arm"), ARM_has_fn);
 }
 
 TEST(DataLayoutUpgradeTest, EmptyDataLayout) {
@@ -249,6 +271,9 @@ TEST(DataLayoutUpgradeTest, EmptyDataLayout) {
   EXPECT_EQ(UpgradeDataLayoutString("", "spirv64"), "G1");
   // but SPIRV Logical does not.
   EXPECT_EQ(UpgradeDataLayoutString("", "spirv"), "");
+
+  // Check that ARM targets do not add Fi8 to an empty layout.
+  EXPECT_EQ(UpgradeDataLayoutString("", "arm"), "");
 }
 
 } // end namespace

>From 7ad5bb9836cf19c8d731ace6e7fcf447a429d65d Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Mon, 28 Sep 2026 08:33:59 +0000
Subject: [PATCH 2/2] stringref

---
 llvm/lib/IR/AutoUpgrade.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 5b942157bf7b4..678b5b792d9e0 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7864,7 +7864,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
   // ARM data layout upgrades.
   // Add -Fi8 if a -F has not already been specified.
   if (T.isARM() && !DL.empty() && !DL.contains("Fi") && !DL.contains("Fn")) {
-    const std::string p3232 = "p:32:32";
+    const StringRef p3232 = "p:32:32";
     size_t Pos = Res.find(p3232);
     if (Pos != StringRef::npos)
       Res.insert(Pos + p3232.size(), "-Fi8");



More information about the llvm-commits mailing list