Skip to content

Conversation

ashermancinelli
Copy link
Contributor

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

TargetRewritePass was dropping fast-math flags. Add the flags to the new call ops and update tests.
@ashermancinelli ashermancinelli self-assigned this Apr 15, 2025
@llvmbot llvmbot added flang Flang issues not falling into any other category flang:fir-hlfir flang:codegen labels Apr 15, 2025
@llvmbot
Copy link
Member

llvmbot commented Apr 15, 2025

@llvm/pr-subscribers-flang-fir-hlfir

@llvm/pr-subscribers-flang-codegen

Author: Asher Mancinelli (ashermancinelli)

Changes

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 --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> 
Copy link
Contributor

@vzakhari vzakhari left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, Asher!

@ashermancinelli ashermancinelli merged commit 595cc96 into llvm:main Apr 15, 2025
14 of 15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

flang:codegen flang:fir-hlfir flang Flang issues not falling into any other category

3 participants