[flang-commits] [flang] c3b3352 - [MLIR][ROCDL] Add conversion of math.erfc to AMD GPU library calls (#128899)
via flang-commits
flang-commits at lists.llvm.org
Thu Feb 27 11:32:28 PST 2025
Author: Jan Leyonberg
Date: 2025-02-27T14:32:25-05:00
New Revision: c3b3352f7346b06d9e17057fd5e9153e68229b9c
URL: https://github.com/llvm/llvm-project/commit/c3b3352f7346b06d9e17057fd5e9153e68229b9c
DIFF: https://github.com/llvm/llvm-project/commit/c3b3352f7346b06d9e17057fd5e9153e68229b9c.diff
LOG: [MLIR][ROCDL] Add conversion of math.erfc to AMD GPU library calls (#128899)
This patch adds a pattern to convert the math.erfc operation to AMD GPU
library calls.
Depends on: #128897 for the flang test
Added:
Modified:
flang/test/Lower/OpenMP/math-amdgpu.f90
mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp
mlir/test/Conversion/MathToROCDL/math-to-rocdl.mlir
Removed:
################################################################################
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