[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