[flang-commits] [flang] [flang] Propagate fast-math flags in target-rewrite (PR #135723)

via flang-commits flang-commits at lists.llvm.org
Mon Apr 14 18:36:41 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-codegen

Author: Asher Mancinelli (ashermancinelli)

<details>
<summary>Changes</summary>

TargetRewritePass was dropping fast-math flags. Add the flags to the new call ops and update tests.

---
Full diff: https://github.com/llvm/llvm-project/pull/135723.diff


4 Files Affected:

- (modified) flang/lib/Optimizer/CodeGen/TargetRewrite.cpp (+1) 
- (modified) flang/test/Fir/CUDA/cuda-target-rewrite.mlir (+1-1) 
- (added) flang/test/Fir/target-rewrite-fmfs.fir (+8) 
- (modified) flang/test/Fir/target-rewrite-selective.fir (+4-4) 


``````````diff
diff --git a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
index 43ed60fc0c292..6f5e01612fc97 100644
--- a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
+++ b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
@@ -542,6 +542,7 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
             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 831b5a0048008..10e8b8902aa63 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 0000000000000..e63f4acbe6671
--- /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 bfbbafdc2e2b3..eac1d35f8d24a 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>
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/135723


More information about the flang-commits mailing list