diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index b89c9ce46e7d6..0412b93798b94 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -2401,6 +2401,19 @@ void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs, if (!Info) CheckFailed("invalid name for a VFABI variant: " + S, V); } + + if (auto A = Attrs.getFnAttr("denormal-fp-math"); A.isValid()) { + StringRef S = A.getValueAsString(); + 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 (!parseDenormalFPAttribute(S).isValid()) + 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 45324392aacde..bafbc9486a1c2 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 f8b66aae212e7..82b39d4fa34cb 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 f60581c0089af..d9b1375d3c633 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 cea11a3c58e3c..ddfddbc22a517 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 22c422c816039..eea1dda6230a9 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 0000000000000..f79f28a366944 --- /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 --implicit-check-not="invalid value" %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 +}