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 { mlir::TypeRange{newInTypes}.drop_front(dropFront), newResTys)); newCall = rewriter->create(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 +// CHECK: %{{.*}} = fir.call @_FortranAzpowk(%{{.*}}, %{{.*}}, %{{.*}}) fastmath : (f64, f64, i64) -> tuple // CHECK: func.func private @_FortranAzpowk(f64, f64, i64) -> tuple 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) -> complex { + %0 = fir.call @csin(%arg0) fastmath : (complex) -> complex + // CHECK: fir.call @csin(%{{.+}}) fastmath + return %0 : complex +} 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>, complex, i64) -> complex -// CMPLXOFF-DAG: fir.call @_QPtest2({{.*}}, {{.*}}, {{.*}}) : (!fir.ref>, index, complex) -> !fir.boxchar<1> +// CMPLXOFF-DAG: fir.call @_QPtest1({{.*}}, {{.*}}, {{.*}}) fastmath : (!fir.ref>, complex, i64) -> complex +// CMPLXOFF-DAG: fir.call @_QPtest2({{.*}}, {{.*}}, {{.*}}) fastmath : (!fir.ref>, index, complex) -> !fir.boxchar<1> // CMPLXOFF-DAG: func.func private @_QPtest1(!fir.ref>, complex, i64) -> complex // CMPLXOFF-DAG: func.func private @_QPtest2(!fir.ref>, index, complex) -> !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>, index, !fir.vector<2:f32>) -> !fir.boxchar<1> +// CHAROFF-DAG: fir.call @_QPtest1({{.*}}, {{.*}}) fastmath : (!fir.boxchar<1>, !fir.vector<2:f32>) -> !fir.vector<2:f32> +// CHAROFF-DAG: fir.call @_QPtest2({{.*}}, {{.*}}, {{.*}}) fastmath : (!fir.ref>, 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>, index, !fir.vector<2:f32>) -> !fir.boxchar<1>