[llvm] [ARM] Generate build-attributes more correctly in the presence of intrinsic declarations. (PR #160749)
David Green via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 27 06:44:17 PDT 2025
https://github.com/davemgreen updated https://github.com/llvm/llvm-project/pull/160749
>From bac9b8686c12977aecb268a4645ec54d583ea5dc Mon Sep 17 00:00:00 2001
From: David Green <david.green at arm.com>
Date: Sat, 27 Sep 2025 14:44:06 +0100
Subject: [PATCH] [ARM] Generation build-attributes more correctly in the
presence of function declarations.
This code doesn't work very well, but this at least makes it work when
intrinsic definitions are present. It now discounts functions declarations from
the set of attributes it looks at. It would have worked better before
0ab5b5b8581d9f2951575f7245824e6e4fc57dec when module-level attributes could
provide the information used to construct build-attributes.
---
llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 19 +++++++++++--------
.../CodeGen/ARM/build-attributes-fn-attr3.ll | 3 +++
.../CodeGen/ARM/build-attributes-fn-attr4.ll | 3 +++
.../CodeGen/ARM/build-attributes-fn-attr5.ll | 3 +++
.../CodeGen/ARM/build-attributes-fn-attr6.ll | 3 +++
5 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
index 1c42f44765abf..2381effb1b6d3 100644
--- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
+++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
@@ -610,20 +610,23 @@ void ARMAsmPrinter::emitEndOfAsmFile(Module &M) {
// to appear in the .ARM.attributes section in ELF.
// Instead of subclassing the MCELFStreamer, we do the work here.
- // Returns true if all functions have the same function attribute value.
- // It also returns true when the module has no functions.
+// Returns true if all function definitions have the same function attribute
+// value. It also returns true when the module has no functions.
static bool checkFunctionsAttributeConsistency(const Module &M, StringRef Attr,
StringRef Value) {
- return !any_of(M, [&](const Function &F) {
- return F.getFnAttribute(Attr).getValueAsString() != Value;
- });
+ return !any_of(M, [&](const Function &F) {
+ if (F.isDeclaration())
+ return false;
+ return F.getFnAttribute(Attr).getValueAsString() != Value;
+ });
}
-// Returns true if all functions have the same denormal mode.
+// Returns true if all functions definitions have the same denormal mode.
// It also returns true when the module has no functions.
-static bool checkDenormalAttributeConsistency(const Module &M,
- StringRef Attr,
+static bool checkDenormalAttributeConsistency(const Module &M, StringRef Attr,
DenormalMode Value) {
return !any_of(M, [&](const Function &F) {
+ if (F.isDeclaration())
+ return false;
StringRef AttrVal = F.getFnAttribute(Attr).getValueAsString();
return parseDenormalFPAttribute(AttrVal) != Value;
});
diff --git a/llvm/test/CodeGen/ARM/build-attributes-fn-attr3.ll b/llvm/test/CodeGen/ARM/build-attributes-fn-attr3.ll
index 7f70c44c78f9c..27d1dc20bd815 100644
--- a/llvm/test/CodeGen/ARM/build-attributes-fn-attr3.ll
+++ b/llvm/test/CodeGen/ARM/build-attributes-fn-attr3.ll
@@ -11,7 +11,10 @@
define i32 @foo() local_unnamed_addr #0 {
entry:
+ %a = call float @llvm.fma.f32(float 0.0, float 0.0, float 0.0)
ret i32 42
}
+declare float @llvm.fma.f32(float, float, float)
+
attributes #0 = { minsize norecurse nounwind optsize readnone "no-trapping-math"="true" "denormal-fp-math"="ieee"}
diff --git a/llvm/test/CodeGen/ARM/build-attributes-fn-attr4.ll b/llvm/test/CodeGen/ARM/build-attributes-fn-attr4.ll
index c99cb27adf155..9c8dd8d95c61c 100644
--- a/llvm/test/CodeGen/ARM/build-attributes-fn-attr4.ll
+++ b/llvm/test/CodeGen/ARM/build-attributes-fn-attr4.ll
@@ -10,7 +10,10 @@
define i32 @foo1() local_unnamed_addr #0 {
entry:
+ %a = call float @llvm.fma.f32(float 0.0, float 0.0, float 0.0)
ret i32 42
}
+declare float @llvm.fma.f32(float, float, float)
+
attributes #0 = { minsize norecurse nounwind optsize readnone "denormal-fp-math"="positive-zero,positive-zero" }
diff --git a/llvm/test/CodeGen/ARM/build-attributes-fn-attr5.ll b/llvm/test/CodeGen/ARM/build-attributes-fn-attr5.ll
index ba1e7d7ce55c1..cda3ea0fc6d18 100644
--- a/llvm/test/CodeGen/ARM/build-attributes-fn-attr5.ll
+++ b/llvm/test/CodeGen/ARM/build-attributes-fn-attr5.ll
@@ -10,7 +10,10 @@
define i32 @foo1() local_unnamed_addr #0 {
entry:
+ %a = call float @llvm.fma.f32(float 0.0, float 0.0, float 0.0)
ret i32 42
}
+declare float @llvm.fma.f32(float, float, float)
+
attributes #0 = { minsize norecurse nounwind optsize readnone "denormal-fp-math"="preserve-sign,preserve-sign"}
diff --git a/llvm/test/CodeGen/ARM/build-attributes-fn-attr6.ll b/llvm/test/CodeGen/ARM/build-attributes-fn-attr6.ll
index 1cd68aed1e051..59d0a40198392 100644
--- a/llvm/test/CodeGen/ARM/build-attributes-fn-attr6.ll
+++ b/llvm/test/CodeGen/ARM/build-attributes-fn-attr6.ll
@@ -11,6 +11,7 @@
define i32 @foo1() local_unnamed_addr #0 {
entry:
+ %a = call float @llvm.fma.f32(float 0.0, float 0.0, float 0.0)
ret i32 42
}
@@ -19,5 +20,7 @@ entry:
ret i32 42
}
+declare float @llvm.fma.f32(float, float, float)
+
attributes #0 = { minsize norecurse nounwind optsize readnone "denormal-fp-math"="preserve-sign,preserve-sign"}
attributes #1 = { minsize norecurse nounwind optsize readnone "denormal-fp-math"="positive-zero,positive-zero"}
More information about the llvm-commits
mailing list