[llvm] [Verifier] Verify attribute `denormal-fp-math[-f32]` (PR #112310)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 14 23:11:11 PDT 2024
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/112310
>From 44accc6bce65bda917979385fd8b865c68ec58c6 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Tue, 15 Oct 2024 13:19:11 +0800
Subject: [PATCH 1/2] [Verifier] Verify attribute `denormal-fp-math[-f32]`
---
llvm/lib/IR/Verifier.cpp | 19 ++++++++++++++++++
llvm/test/CodeGen/AMDGPU/clamp-modifier.ll | 2 +-
.../DebugInfo/COFF/fortran-contained-proc.ll | 4 ++--
.../Attributor/nofpclass-minimum-maximum.ll | 2 +-
.../Attributor/nofpclass-minnum-maxnum.ll | 2 +-
.../InstCombine/fcmp-denormals-are-zero.ll | 2 +-
llvm/test/Verifier/denormal-fp-math.ll | 20 +++++++++++++++++++
7 files changed, 45 insertions(+), 6 deletions(-)
create mode 100644 llvm/test/Verifier/denormal-fp-math.ll
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index b89c9ce46e7d61..e9f8ef831e5a13 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -2401,6 +2401,25 @@ void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
if (!Info)
CheckFailed("invalid name for a VFABI variant: " + S, V);
}
+
+ auto IsValidDenormalMode = [](StringRef S) {
+ DenormalMode Denormals = parseDenormalFPAttribute(S);
+ return Denormals.Input != DenormalMode::Invalid &&
+ Denormals.Output != DenormalMode::Invalid;
+ };
+
+ if (auto A = Attrs.getFnAttr("denormal-fp-math"); A.isValid()) {
+ StringRef S = A.getValueAsString();
+ if (!IsValidDenormalMode(S))
+ CheckFailed("invalid value for 'denormal-fp-math' attribute: " + S, V);
+ }
+
+ if (auto A = Attrs.getFnAttr("denormal-fp-math-f32"); A.isValid()) {
+ StringRef S = A.getValueAsString();
+ if (!IsValidDenormalMode(S))
+ CheckFailed("invalid value for 'denormal-fp-math-f32' attribute: " + S,
+ V);
+ }
}
void Verifier::verifyFunctionMetadata(
diff --git a/llvm/test/CodeGen/AMDGPU/clamp-modifier.ll b/llvm/test/CodeGen/AMDGPU/clamp-modifier.ll
index 45324392aacde2..bafbc9486a1c21 100644
--- a/llvm/test/CodeGen/AMDGPU/clamp-modifier.ll
+++ b/llvm/test/CodeGen/AMDGPU/clamp-modifier.ll
@@ -1657,7 +1657,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1
attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }
attributes #1 = { nounwind readnone }
-attributes #2 = { nounwind "denormal-fp-math-f32"="ieee.ieee" }
+attributes #2 = { nounwind "denormal-fp-math-f32"="ieee,ieee" }
attributes #3 = { nounwind "denormal-fp-math-f32"="ieee,ieee" "denormal-fp-math"="preserve-sign,preserve-sign" }
!llvm.dbg.cu = !{!0}
diff --git a/llvm/test/DebugInfo/COFF/fortran-contained-proc.ll b/llvm/test/DebugInfo/COFF/fortran-contained-proc.ll
index f8b66aae212e79..82b39d4fa34cb0 100644
--- a/llvm/test/DebugInfo/COFF/fortran-contained-proc.ll
+++ b/llvm/test/DebugInfo/COFF/fortran-contained-proc.ll
@@ -74,8 +74,8 @@ declare void @llvm.dbg.declare(metadata, metadata, metadata) #3
; Function Attrs: mustprogress nofree nosync nounwind readnone speculatable willreturn
declare void @llvm.dbg.value(metadata, metadata, metadata) #3
-attributes #0 = { nounwind uwtable "denormal-fp-math"="preserve_sign,preserve_sign" "frame-pointer"="none" "intel-lang"="fortran" "min-legal-vector-width"="0" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" }
-attributes #1 = { mustprogress nofree norecurse nosync nounwind uwtable willreturn writeonly "denormal-fp-math"="preserve_sign,preserve_sign" "frame-pointer"="none" "intel-lang"="fortran" "min-legal-vector-width"="0" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" }
+attributes #0 = { nounwind uwtable "denormal-fp-math"="preserve-sign,preserve-sign" "frame-pointer"="none" "intel-lang"="fortran" "min-legal-vector-width"="0" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" }
+attributes #1 = { mustprogress nofree norecurse nosync nounwind uwtable willreturn writeonly "denormal-fp-math"="preserve-sign,preserve-sign" "frame-pointer"="none" "intel-lang"="fortran" "min-legal-vector-width"="0" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" }
attributes #2 = { nofree "intel-lang"="fortran" }
attributes #3 = { mustprogress nofree nosync nounwind readnone speculatable willreturn }
attributes #4 = { nounwind }
diff --git a/llvm/test/Transforms/Attributor/nofpclass-minimum-maximum.ll b/llvm/test/Transforms/Attributor/nofpclass-minimum-maximum.ll
index f60581c0089afe..d9b1375d3c6337 100644
--- a/llvm/test/Transforms/Attributor/nofpclass-minimum-maximum.ll
+++ b/llvm/test/Transforms/Attributor/nofpclass-minimum-maximum.ll
@@ -511,6 +511,6 @@ attributes #3 = { "denormal-fp-math"="dynamic,dynamic" }
attributes #4 = { "denormal-fp-math"="ieee,preserve-sign" }
attributes #5 = { "denormal-fp-math"="preserve-sign,ieee" }
attributes #6 = { "denormal-fp-math"="ieee,positive-zero" }
-attributes #7 = { "denormal-fp-math"="positive-zero-sign,ieee" }
+attributes #7 = { "denormal-fp-math"="positive-zero,ieee" }
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; TUNIT: {{.*}}
diff --git a/llvm/test/Transforms/Attributor/nofpclass-minnum-maxnum.ll b/llvm/test/Transforms/Attributor/nofpclass-minnum-maxnum.ll
index cea11a3c58e3c4..ddfddbc22a5179 100644
--- a/llvm/test/Transforms/Attributor/nofpclass-minnum-maxnum.ll
+++ b/llvm/test/Transforms/Attributor/nofpclass-minnum-maxnum.ll
@@ -511,6 +511,6 @@ attributes #3 = { "denormal-fp-math"="dynamic,dynamic" }
attributes #4 = { "denormal-fp-math"="ieee,preserve-sign" }
attributes #5 = { "denormal-fp-math"="preserve-sign,ieee" }
attributes #6 = { "denormal-fp-math"="ieee,positive-zero" }
-attributes #7 = { "denormal-fp-math"="positive-zero-sign,ieee" }
+attributes #7 = { "denormal-fp-math"="positive-zero,ieee" }
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; TUNIT: {{.*}}
diff --git a/llvm/test/Transforms/InstCombine/fcmp-denormals-are-zero.ll b/llvm/test/Transforms/InstCombine/fcmp-denormals-are-zero.ll
index 22c422c8160395..eea1dda6230a9d 100644
--- a/llvm/test/Transforms/InstCombine/fcmp-denormals-are-zero.ll
+++ b/llvm/test/Transforms/InstCombine/fcmp-denormals-are-zero.ll
@@ -350,5 +350,5 @@ declare <2 x double> @llvm.fabs.v2f64(<2 x double>)
attributes #0 = { "denormal-fp-math"="ieee,preserve-sign" }
attributes #1 = { "denormal-fp-math"="ieee,positive-zero" }
-attributes #2 = { "denormal-fp-math"="ieee,iee" }
+attributes #2 = { "denormal-fp-math"="ieee,ieee" }
attributes #3 = { "denormal-fp-math-f32"="ieee,preserve-sign" }
diff --git a/llvm/test/Verifier/denormal-fp-math.ll b/llvm/test/Verifier/denormal-fp-math.ll
new file mode 100644
index 00000000000000..f9d778b460db9b
--- /dev/null
+++ b/llvm/test/Verifier/denormal-fp-math.ll
@@ -0,0 +1,20 @@
+; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s
+
+define float @test_denormal_fp_math_valid() "denormal-fp-math"="ieee,ieee" {
+ ret float 1.0
+}
+
+; CHECK: invalid value for 'denormal-fp-math' attribute: foo,ieee
+define float @test_denormal_fp_math_invalid1() "denormal-fp-math"="foo,ieee" {
+ ret float 1.0
+}
+
+; CHECK: invalid value for 'denormal-fp-math' attribute: ieee,ieee,ieee
+define float @test_denormal_fp_math_invalid2() "denormal-fp-math"="ieee,ieee,ieee" {
+ ret float 1.0
+}
+
+; CHECK: invalid value for 'denormal-fp-math-f32' attribute: foo,ieee
+define float @test_denormal_fp_math_f32_invalid() "denormal-fp-math-f32"="foo,ieee" {
+ ret float 1.0
+}
>From 0848fc0be808fcb7ed953e6e7cbeb937b42af4d2 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Tue, 15 Oct 2024 14:10:46 +0800
Subject: [PATCH 2/2] [Verifier] Address reviewe comments. NFC.
---
llvm/lib/IR/Verifier.cpp | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index e9f8ef831e5a13..0412b93798b94d 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -2402,21 +2402,15 @@ void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
CheckFailed("invalid name for a VFABI variant: " + S, V);
}
- auto IsValidDenormalMode = [](StringRef S) {
- DenormalMode Denormals = parseDenormalFPAttribute(S);
- return Denormals.Input != DenormalMode::Invalid &&
- Denormals.Output != DenormalMode::Invalid;
- };
-
if (auto A = Attrs.getFnAttr("denormal-fp-math"); A.isValid()) {
StringRef S = A.getValueAsString();
- if (!IsValidDenormalMode(S))
+ if (!parseDenormalFPAttribute(S).isValid())
CheckFailed("invalid value for 'denormal-fp-math' attribute: " + S, V);
}
if (auto A = Attrs.getFnAttr("denormal-fp-math-f32"); A.isValid()) {
StringRef S = A.getValueAsString();
- if (!IsValidDenormalMode(S))
+ if (!parseDenormalFPAttribute(S).isValid())
CheckFailed("invalid value for 'denormal-fp-math-f32' attribute: " + S,
V);
}
More information about the llvm-commits
mailing list