[flang-commits] [flang] [mlir] [MLIR][ROCDL] Add conversion of math.erfc to AMD GPU library calls (PR #128899)
Jan Leyonberg via flang-commits
flang-commits at lists.llvm.org
Thu Feb 27 09:54:20 PST 2025
https://github.com/jsjodin updated https://github.com/llvm/llvm-project/pull/128899
>From d6d48517d5dd2436bfdb26953513378b88f5d839 Mon Sep 17 00:00:00 2001
From: Jan Leyonberg <jan_sjodin at yahoo.com>
Date: Wed, 26 Feb 2025 10:51:01 -0500
Subject: [PATCH] [MLIR][ROCDL] Add conversion of math.erfc to AMD GPU library
calls
This patch adds a pattern to convert the math.erfc operation to AMD GPU
library calls.
---
flang/test/Lower/OpenMP/math-amdgpu.f90 | 14 ++++++++++++++
.../lib/Conversion/MathToROCDL/MathToROCDL.cpp | 2 ++
.../Conversion/MathToROCDL/math-to-rocdl.mlir | 18 ++++++++++++++++++
3 files changed, 34 insertions(+)
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
More information about the flang-commits
mailing list