[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