aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsher Mancinelli <ashermancinelli@gmail.com>2025-04-15 05:43:32 -0700
committerGitHub <noreply@github.com>2025-04-15 05:43:32 -0700
commit595cc960b6da7f55d64d2025abb67a9aabb01a85 (patch)
treecd400e0ebfcad9b88616e4746af5523b0863f130
parent9a6c001b125d7d37b8f2c8b96461768c797c4e3f (diff)
downloadllvm-595cc960b6da7f55d64d2025abb67a9aabb01a85.zip
llvm-595cc960b6da7f55d64d2025abb67a9aabb01a85.tar.gz
llvm-595cc960b6da7f55d64d2025abb67a9aabb01a85.tar.bz2
[flang] Propagate fast-math flags in target-rewrite (#135723)
TargetRewritePass was dropping fast-math flags. Add the flags to the new call ops and update tests.
-rw-r--r--flang/lib/Optimizer/CodeGen/TargetRewrite.cpp1
-rw-r--r--flang/test/Fir/CUDA/cuda-target-rewrite.mlir2
-rw-r--r--flang/test/Fir/target-rewrite-fmfs.fir8
-rw-r--r--flang/test/Fir/target-rewrite-selective.fir8
4 files changed, 14 insertions, 5 deletions
diff --git a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
index 43ed60f..6f5e016 100644
--- a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
+++ b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
@@ -542,6 +542,7 @@ public:
mlir::TypeRange{newInTypes}.drop_front(dropFront), newResTys));
newCall = rewriter->create<fir::CallOp>(loc, newResTys, newOpers);
}
+ newCall.setFastmathAttr(callOp.getFastmathAttr());
// Always set ABI argument attributes on call operations, even when
// direct, as required by
// https://llvm.org/docs/LangRef.html#parameter-attributes.
diff --git a/flang/test/Fir/CUDA/cuda-target-rewrite.mlir b/flang/test/Fir/CUDA/cuda-target-rewrite.mlir
index 831b5a0..10e8b89 100644
--- a/flang/test/Fir/CUDA/cuda-target-rewrite.mlir
+++ b/flang/test/Fir/CUDA/cuda-target-rewrite.mlir
@@ -14,7 +14,7 @@ gpu.module @testmod {
}
// CHECK-LABEL: gpu.func @_QPvcpowdk
-// CHECK: %{{.*}} = fir.call @_FortranAzpowk(%{{.*}}, %{{.*}}, %{{.*}}) : (f64, f64, i64) -> tuple<f64, f64>
+// CHECK: %{{.*}} = fir.call @_FortranAzpowk(%{{.*}}, %{{.*}}, %{{.*}}) fastmath<contract> : (f64, f64, i64) -> tuple<f64, f64>
// CHECK: func.func private @_FortranAzpowk(f64, f64, i64) -> tuple<f64, f64> attributes {fir.bindc_name = "_FortranAzpowk", fir.runtime}
}
diff --git a/flang/test/Fir/target-rewrite-fmfs.fir b/flang/test/Fir/target-rewrite-fmfs.fir
new file mode 100644
index 0000000..e63f4ac
--- /dev/null
+++ b/flang/test/Fir/target-rewrite-fmfs.fir
@@ -0,0 +1,8 @@
+// RUN: fir-opt --target-rewrite %s | FileCheck %s
+
+// CHECK-LABEL: func.func @libm_preserves_fmfs
+func.func @libm_preserves_fmfs(%arg0 : complex<f32>) -> complex<f32> {
+ %0 = fir.call @csin(%arg0) fastmath<contract> : (complex<f32>) -> complex<f32>
+ // CHECK: fir.call @csin(%{{.+}}) fastmath<contract>
+ return %0 : complex<f32>
+}
diff --git a/flang/test/Fir/target-rewrite-selective.fir b/flang/test/Fir/target-rewrite-selective.fir
index bfbbafd..eac1d35f 100644
--- a/flang/test/Fir/target-rewrite-selective.fir
+++ b/flang/test/Fir/target-rewrite-selective.fir
@@ -21,13 +21,13 @@
// r = test2(value)
// end function
-// CMPLXOFF-DAG: fir.call @_QPtest1({{.*}}, {{.*}}, {{.*}}) : (!fir.ref<!fir.char<1,?>>, complex<f32>, i64) -> complex<f32>
-// CMPLXOFF-DAG: fir.call @_QPtest2({{.*}}, {{.*}}, {{.*}}) : (!fir.ref<!fir.char<1,10>>, index, complex<f32>) -> !fir.boxchar<1>
+// CMPLXOFF-DAG: fir.call @_QPtest1({{.*}}, {{.*}}, {{.*}}) fastmath<contract> : (!fir.ref<!fir.char<1,?>>, complex<f32>, i64) -> complex<f32>
+// CMPLXOFF-DAG: fir.call @_QPtest2({{.*}}, {{.*}}, {{.*}}) fastmath<contract> : (!fir.ref<!fir.char<1,10>>, index, complex<f32>) -> !fir.boxchar<1>
// CMPLXOFF-DAG: func.func private @_QPtest1(!fir.ref<!fir.char<1,?>>, complex<f32>, i64) -> complex<f32>
// CMPLXOFF-DAG: func.func private @_QPtest2(!fir.ref<!fir.char<1,10>>, index, complex<f32>) -> !fir.boxchar<1>
-// CHAROFF-DAG: fir.call @_QPtest1({{.*}}, {{.*}}) : (!fir.boxchar<1>, !fir.vector<2:f32>) -> !fir.vector<2:f32>
-// CHAROFF-DAG: fir.call @_QPtest2({{.*}}, {{.*}}, {{.*}}) : (!fir.ref<!fir.char<1,10>>, index, !fir.vector<2:f32>) -> !fir.boxchar<1>
+// CHAROFF-DAG: fir.call @_QPtest1({{.*}}, {{.*}}) fastmath<contract> : (!fir.boxchar<1>, !fir.vector<2:f32>) -> !fir.vector<2:f32>
+// CHAROFF-DAG: fir.call @_QPtest2({{.*}}, {{.*}}, {{.*}}) fastmath<contract> : (!fir.ref<!fir.char<1,10>>, index, !fir.vector<2:f32>) -> !fir.boxchar<1>
// CHAROFF-DAG: func.func private @_QPtest1(!fir.boxchar<1>, !fir.vector<2:f32>) -> !fir.vector<2:f32>
// CHAROFF-DAG: func.func private @_QPtest2(!fir.ref<!fir.char<1,10>>, index, !fir.vector<2:f32>) -> !fir.boxchar<1>