[llvm] d5b7514 - llvm-reduce: Don't remove strictfp

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 3 12:58:52 PST 2023


Author: Matt Arsenault
Date: 2023-01-03T15:57:58-05:00
New Revision: d5b7514c3d298058d2509af5e0093519b1a20662

URL: https://github.com/llvm/llvm-project/commit/d5b7514c3d298058d2509af5e0093519b1a20662
DIFF: https://github.com/llvm/llvm-project/commit/d5b7514c3d298058d2509af5e0093519b1a20662.diff

LOG: llvm-reduce: Don't remove strictfp

The verifier should fail if constrained intrinsics are used in
functions with strictfp, but that patch hasn't been pushed yet.

Ideally we would be able to analyze the function body to see if any
constrained intrinsics were used, but we seem to be missing a utility
function to check for any constrained ops.

Added: 
    llvm/test/tools/llvm-reduce/remove-attributes-strictfp.ll

Modified: 
    llvm/tools/llvm-reduce/deltas/ReduceAttributes.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-reduce/remove-attributes-strictfp.ll b/llvm/test/tools/llvm-reduce/remove-attributes-strictfp.ll
new file mode 100644
index 000000000000..8607aae9dda2
--- /dev/null
+++ b/llvm/test/tools/llvm-reduce/remove-attributes-strictfp.ll
@@ -0,0 +1,48 @@
+; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=attributes --test FileCheck --test-arg %s --test-arg --input-file %s -o %t
+; RUN: FileCheck --check-prefixes=CHECK,RESULT %s < %t
+
+; Test that invalid reductions aren't produced on strictfp functions.
+
+; CHECK-LABEL: define float @strictfp_intrinsic(float %x, float %y)
+; RESULT-SAME: [[STRICTFP_ONLY:#[0-9]+]] {
+define float @strictfp_intrinsic(float %x, float %y) #0 {
+  %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict")
+  ret float %val
+}
+
+; CHECK-LABEL: define float @strictfp_callsite(float %x, float %y)
+; RESULT-SAME: [[STRICTFP_ONLY]] {
+; RESULT: call float @extern.func(float %x, float %y) [[STRICTFP_ONLY]]
+define float @strictfp_callsite(float %x, float %y) #0 {
+  %val = call float @extern.func(float %x, float %y) #0
+  ret float %val
+}
+
+; CHECK-LABEL: define float @strictfp_declaration(float %x, float %y)
+; RESULT-SAME: [[STRICTFP_ONLY]] {
+define float @strictfp_declaration(float %x, float %y) #0 {
+  %val = call float @strict.extern.func(float %x, float %y)
+  ret float %val
+}
+
+; CHECK-LABEL: define float @strictfp_no_constrained_ops(float %x, float %y)
+; RESULT-SAME: [[STRICTFP_ONLY]] {
+define float @strictfp_no_constrained_ops(float %x, float %y) #0 {
+  %val = call float @llvm.copysign.f32(float %x, float %y)
+  ret float %val
+}
+
+; CHECK-LABEL: declare float @strict.extern.func(float, float)
+; RESULT-SAME: [[STRICTFP_ONLY]]{{$}}
+declare float @strict.extern.func(float, float) #0
+
+declare float @extern.func(float, float)
+
+declare float @llvm.copysign.f32(float, float) #1
+declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata) #2
+
+; RESULT: attributes [[STRICTFP_ONLY]] = { strictfp }
+
+attributes #0 = { nounwind strictfp }
+attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
+attributes #2 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceAttributes.cpp b/llvm/tools/llvm-reduce/deltas/ReduceAttributes.cpp
index 56503676920b..0bd16ff5f887 100644
--- a/llvm/tools/llvm-reduce/deltas/ReduceAttributes.cpp
+++ b/llvm/tools/llvm-reduce/deltas/ReduceAttributes.cpp
@@ -119,6 +119,13 @@ class AttributeRemapper : public InstVisitor<AttributeRemapper> {
 
         if (RemoveNoInline && Kind == Attribute::OptimizeNone)
           continue;
+
+        // TODO: Could only remove this if there are no constrained calls in the
+        // function.
+        if (Kind == Attribute::StrictFP) {
+          AttrsToPreserve.emplace_back(A);
+          continue;
+        }
       }
 
       if (O.shouldKeep())


        


More information about the llvm-commits mailing list