[flang-commits] [flang] [mlir] [MLIR][ROCDL] Add conversion of math.erfc to AMD GPU library calls (PR #128899)
via flang-commits
flang-commits at lists.llvm.org
Wed Feb 26 08:07:55 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-openmp
Author: Jan Leyonberg (jsjodin)
<details>
<summary>Changes</summary>
This patch adds a pattern to convert the math.erfc operation to AMD GPU library calls.
Depends on: #<!-- -->128897 for the flang test
---
Full diff: https://github.com/llvm/llvm-project/pull/128899.diff
3 Files Affected:
- (modified) flang/test/Lower/OpenMP/math-amdgpu.f90 (+14)
- (modified) mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp (+2)
- (modified) mlir/test/Conversion/MathToROCDL/math-to-rocdl.mlir (+18)
``````````diff
diff --git a/flang/test/Lower/OpenMP/math-amdgpu.f90 b/flang/test/Lower/OpenMP/math-amdgpu.f90
index 116768ba9412a..55a14f7d31378 100644
--- a/flang/test/Lower/OpenMP/math-amdgpu.f90
+++ b/flang/test/Lower/OpenMP/math-amdgpu.f90
@@ -99,6 +99,20 @@ subroutine omp_erf_f64(x, y)
y = erf(x)
end subroutine omp_erf_f64
+subroutine omp_erfc_f32(x, y)
+!$omp declare target
+ real :: x, y
+!CHECK: call float @__ocml_erfc_f32(float {{.*}})
+ y = erfc(x)
+end subroutine omp_erfc_f32
+
+subroutine omp_erfc_f64(x, y)
+!$omp declare target
+ real(8) :: x, y
+!CHECK: call double @__ocml_erfc_f64(double {{.*}})
+ y = erfc(x)
+end subroutine omp_erfc_f64
+
subroutine omp_exp_f32(x, y)
!$omp declare target
real :: x, y
diff --git a/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp b/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp
index 838eef30a938f..e065c804507ac 100644
--- a/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp
+++ b/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp
@@ -113,6 +113,8 @@ void mlir::populateMathToROCDLConversionPatterns(
"__ocml_tan_f64", "__ocml_tan_f16");
populateOpPatterns<math::ErfOp>(converter, patterns, "__ocml_erf_f32",
"__ocml_erf_f64", "__ocml_erf_f16");
+ populateOpPatterns<math::ErfcOp>(converter, patterns, "__ocml_erfc_f32",
+ "__ocml_erfc_f64", "__ocml_erfc_f16");
populateOpPatterns<math::FPowIOp>(converter, patterns, "__ocml_pown_f32",
"__ocml_pown_f64", "__ocml_pown_f16");
// Single arith pattern that needs a ROCDL call, probably not
diff --git a/mlir/test/Conversion/MathToROCDL/math-to-rocdl.mlir b/mlir/test/Conversion/MathToROCDL/math-to-rocdl.mlir
index 313d7b086731e..dbff23339d8b3 100644
--- a/mlir/test/Conversion/MathToROCDL/math-to-rocdl.mlir
+++ b/mlir/test/Conversion/MathToROCDL/math-to-rocdl.mlir
@@ -462,6 +462,24 @@ module @test_module {
// -----
+module @test_module {
+ // CHECK: llvm.func @__ocml_erfc_f16(f16) -> f16
+ // CHECK: llvm.func @__ocml_erfc_f32(f32) -> f32
+ // CHECK: llvm.func @__ocml_erfc_f64(f64) -> f64
+ // CHECK-LABEL: func @math_erfc
+ func.func @math_erfc(%arg_f16 : f16, %arg_f32 : f32, %arg_f64 : f64) -> (f16, f32, f64) {
+ %result16 = math.erfc %arg_f16 : f16
+ // CHECK: llvm.call @__ocml_erfc_f16(%{{.*}}) : (f16) -> f16
+ %result32 = math.erfc %arg_f32 : f32
+ // CHECK: llvm.call @__ocml_erfc_f32(%{{.*}}) : (f32) -> f32
+ %result64 = math.erfc %arg_f64 : f64
+ // CHECK: llvm.call @__ocml_erfc_f64(%{{.*}}) : (f64) -> f64
+ func.return %result16, %result32, %result64 : f16, f32, f64
+ }
+}
+
+// -----
+
module @test_module {
// CHECK: llvm.func @__ocml_sin_f16(f16) -> f16
// CHECK: llvm.func @__ocml_sin_f32(f32) -> f32
``````````
</details>
https://github.com/llvm/llvm-project/pull/128899
More information about the flang-commits
mailing list