From be8bacfd93ec6a51692aafb3478ce975fb9812d2 Mon Sep 17 00:00:00 2001 From: Slava Zakharin Date: Thu, 4 Aug 2022 09:24:33 -0700 Subject: [PATCH] [flang] Replace more pgmath with libm. With this change all supported pgmath functions for non-complex data types are replaced with either libm calls or MLIR operations, except for MOD and some flavors of POW, which are going to be addressed by other commits. At the current stage a few math intrinsics are lowered into libm calls always. When appropriate MLIR operation are available, the table can be updated to generate them. --- flang/lib/Lower/IntrinsicCall.cpp | 42 +++++++++++++++++++++++++++++++ flang/test/Lower/Intrinsics/acos.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/acosh.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/asin.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/asinh.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/atanh.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/bessel_j0.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/bessel_j1.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/bessel_jn.f90 | 24 ++++++++++++++++++ flang/test/Lower/Intrinsics/bessel_y0.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/bessel_y1.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/bessel_yn.f90 | 24 ++++++++++++++++++ flang/test/Lower/Intrinsics/erfc.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/gamma.f90 | 22 ++++++++++++++++ flang/test/Lower/Intrinsics/log_gamma.f90 | 22 ++++++++++++++++ flang/test/Lower/dummy-procedure.f90 | 2 +- 16 files changed, 355 insertions(+), 1 deletion(-) create mode 100644 flang/test/Lower/Intrinsics/acos.f90 create mode 100644 flang/test/Lower/Intrinsics/acosh.f90 create mode 100644 flang/test/Lower/Intrinsics/asin.f90 create mode 100644 flang/test/Lower/Intrinsics/asinh.f90 create mode 100644 flang/test/Lower/Intrinsics/atanh.f90 create mode 100644 flang/test/Lower/Intrinsics/bessel_j0.f90 create mode 100644 flang/test/Lower/Intrinsics/bessel_j1.f90 create mode 100644 flang/test/Lower/Intrinsics/bessel_jn.f90 create mode 100644 flang/test/Lower/Intrinsics/bessel_y0.f90 create mode 100644 flang/test/Lower/Intrinsics/bessel_y1.f90 create mode 100644 flang/test/Lower/Intrinsics/bessel_yn.f90 create mode 100644 flang/test/Lower/Intrinsics/erfc.f90 create mode 100644 flang/test/Lower/Intrinsics/gamma.f90 create mode 100644 flang/test/Lower/Intrinsics/log_gamma.f90 diff --git a/flang/lib/Lower/IntrinsicCall.cpp b/flang/lib/Lower/IntrinsicCall.cpp index bce0d2d..ec2923b 100644 --- a/flang/lib/Lower/IntrinsicCall.cpp +++ b/flang/lib/Lower/IntrinsicCall.cpp @@ -1122,6 +1122,20 @@ static mlir::FunctionType genF32F32IntFuncType(mlir::MLIRContext *context) { return mlir::FunctionType::get(context, {ftype, itype}, {ftype}); } +template +static mlir::FunctionType genF64IntF64FuncType(mlir::MLIRContext *context) { + auto ftype = mlir::FloatType::getF64(context); + auto itype = mlir::IntegerType::get(context, Bits); + return mlir::FunctionType::get(context, {itype, ftype}, {ftype}); +} + +template +static mlir::FunctionType genF32IntF32FuncType(mlir::MLIRContext *context) { + auto ftype = mlir::FloatType::getF32(context); + auto itype = mlir::IntegerType::get(context, Bits); + return mlir::FunctionType::get(context, {itype, ftype}, {ftype}); +} + /// Callback type for generating lowering for a math operation. using MathGeneratorTy = mlir::Value (*)(fir::FirOpBuilder &, mlir::Location, llvm::StringRef, mlir::FunctionType, @@ -1211,6 +1225,10 @@ static constexpr MathOperation mathOperations[] = { {"abs", "fabs", genF64F64FuncType, genMathOp}, {"abs", "llvm.fabs.f128", genF128F128FuncType, genMathOp}, + {"acos", "acosf", genF32F32FuncType, genLibCall}, + {"acos", "acos", genF64F64FuncType, genLibCall}, + {"acosh", "acoshf", genF32F32FuncType, genLibCall}, + {"acosh", "acosh", genF64F64FuncType, genLibCall}, // llvm.trunc behaves the same way as libm's trunc. {"aint", "llvm.trunc.f32", genF32F32FuncType, genLibCall}, {"aint", "llvm.trunc.f64", genF64F64FuncType, genLibCall}, @@ -1222,10 +1240,28 @@ static constexpr MathOperation mathOperations[] = { genMathOp}, {"anint", "llvm.round.f80", genF80F80FuncType, genMathOp}, + {"asin", "asinf", genF32F32FuncType, genLibCall}, + {"asin", "asin", genF64F64FuncType, genLibCall}, + {"asinh", "asinhf", genF32F32FuncType, genLibCall}, + {"asinh", "asinh", genF64F64FuncType, genLibCall}, {"atan", "atanf", genF32F32FuncType, genMathOp}, {"atan", "atan", genF64F64FuncType, genMathOp}, {"atan2", "atan2f", genF32F32F32FuncType, genMathOp}, {"atan2", "atan2", genF64F64F64FuncType, genMathOp}, + {"atanh", "atanhf", genF32F32FuncType, genLibCall}, + {"atanh", "atanh", genF64F64FuncType, genLibCall}, + {"bessel_j0", "j0f", genF32F32FuncType, genLibCall}, + {"bessel_j0", "j0", genF64F64FuncType, genLibCall}, + {"bessel_j1", "j1f", genF32F32FuncType, genLibCall}, + {"bessel_j1", "j1", genF64F64FuncType, genLibCall}, + {"bessel_jn", "jnf", genF32IntF32FuncType<32>, genLibCall}, + {"bessel_jn", "jn", genF64IntF64FuncType<32>, genLibCall}, + {"bessel_y0", "y0f", genF32F32FuncType, genLibCall}, + {"bessel_y0", "y0", genF64F64FuncType, genLibCall}, + {"bessel_y1", "y1f", genF32F32FuncType, genLibCall}, + {"bessel_y1", "y1", genF64F64FuncType, genLibCall}, + {"bessel_yn", "ynf", genF32IntF32FuncType<32>, genLibCall}, + {"bessel_yn", "yn", genF64IntF64FuncType<32>, genLibCall}, // math::CeilOp returns a real, while Fortran CEILING returns integer. {"ceil", "ceilf", genF32F32FuncType, genMathOp}, {"ceil", "ceil", genF64F64FuncType, genMathOp}, @@ -1235,17 +1271,23 @@ static constexpr MathOperation mathOperations[] = { {"cosh", "cosh", genF64F64FuncType, genLibCall}, {"erf", "erff", genF32F32FuncType, genMathOp}, {"erf", "erf", genF64F64FuncType, genMathOp}, + {"erfc", "erfcf", genF32F32FuncType, genLibCall}, + {"erfc", "erfc", genF64F64FuncType, genLibCall}, {"exp", "expf", genF32F32FuncType, genMathOp}, {"exp", "exp", genF64F64FuncType, genMathOp}, // math::FloorOp returns a real, while Fortran FLOOR returns integer. {"floor", "floorf", genF32F32FuncType, genMathOp}, {"floor", "floor", genF64F64FuncType, genMathOp}, + {"gamma", "tgammaf", genF32F32FuncType, genLibCall}, + {"gamma", "tgamma", genF64F64FuncType, genLibCall}, {"hypot", "hypotf", genF32F32F32FuncType, genLibCall}, {"hypot", "hypot", genF64F64F64FuncType, genLibCall}, {"log", "logf", genF32F32FuncType, genMathOp}, {"log", "log", genF64F64FuncType, genMathOp}, {"log10", "log10f", genF32F32FuncType, genMathOp}, {"log10", "log10", genF64F64FuncType, genMathOp}, + {"log_gamma", "lgammaf", genF32F32FuncType, genLibCall}, + {"log_gamma", "lgamma", genF64F64FuncType, genLibCall}, // llvm.lround behaves the same way as libm's lround. {"nint", "llvm.lround.i64.f64", genIntF64FuncType<64>, genLibCall}, {"nint", "llvm.lround.i64.f32", genIntF32FuncType<64>, genLibCall}, diff --git a/flang/test/Lower/Intrinsics/acos.f90 b/flang/test/Lower/Intrinsics/acos.f90 new file mode 100644 index 0000000..6dcf780 --- /dev/null +++ b/flang/test/Lower/Intrinsics/acos.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = acos(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @acosf({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = acos(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @acos({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/acosh.f90 b/flang/test/Lower/Intrinsics/acosh.f90 new file mode 100644 index 0000000..c23265d --- /dev/null +++ b/flang/test/Lower/Intrinsics/acosh.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = acosh(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @acoshf({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = acosh(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @acosh({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/asin.f90 b/flang/test/Lower/Intrinsics/asin.f90 new file mode 100644 index 0000000..a7b44ff --- /dev/null +++ b/flang/test/Lower/Intrinsics/asin.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = asin(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @asinf({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = asin(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @asin({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/asinh.f90 b/flang/test/Lower/Intrinsics/asinh.f90 new file mode 100644 index 0000000..b87ec8f --- /dev/null +++ b/flang/test/Lower/Intrinsics/asinh.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = asinh(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @asinhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = asinh(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @asinh({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/atanh.f90 b/flang/test/Lower/Intrinsics/atanh.f90 new file mode 100644 index 0000000..826b06c --- /dev/null +++ b/flang/test/Lower/Intrinsics/atanh.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = atanh(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @atanhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = atanh(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @atanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/bessel_j0.f90 b/flang/test/Lower/Intrinsics/bessel_j0.f90 new file mode 100644 index 0000000..05ead73 --- /dev/null +++ b/flang/test/Lower/Intrinsics/bessel_j0.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = bessel_j0(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @j0f({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = bessel_j0(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @j0({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/bessel_j1.f90 b/flang/test/Lower/Intrinsics/bessel_j1.f90 new file mode 100644 index 0000000..9f88a9d --- /dev/null +++ b/flang/test/Lower/Intrinsics/bessel_j1.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = bessel_j1(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @j1f({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = bessel_j1(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @j1({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/bessel_jn.f90 b/flang/test/Lower/Intrinsics/bessel_jn.f90 new file mode 100644 index 0000000..0fec971 --- /dev/null +++ b/flang/test/Lower/Intrinsics/bessel_jn.f90 @@ -0,0 +1,24 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x, n) + real :: x, test_real4 + integer :: n + test_real4 = bessel_jn(n, x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @jnf({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (i32, f32) -> f32 + +function test_real8(x, n) + real(8) :: x, test_real8 + integer :: n + test_real8 = bessel_jn(n, x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @jn({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (i32, f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/bessel_y0.f90 b/flang/test/Lower/Intrinsics/bessel_y0.f90 new file mode 100644 index 0000000..5514d8a --- /dev/null +++ b/flang/test/Lower/Intrinsics/bessel_y0.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = bessel_y0(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @y0f({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = bessel_y0(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @y0({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/bessel_y1.f90 b/flang/test/Lower/Intrinsics/bessel_y1.f90 new file mode 100644 index 0000000..3c37948 --- /dev/null +++ b/flang/test/Lower/Intrinsics/bessel_y1.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = bessel_y1(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @y1f({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = bessel_y1(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @y1({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/bessel_yn.f90 b/flang/test/Lower/Intrinsics/bessel_yn.f90 new file mode 100644 index 0000000..5dda81e --- /dev/null +++ b/flang/test/Lower/Intrinsics/bessel_yn.f90 @@ -0,0 +1,24 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x, n) + real :: x, test_real4 + integer :: n + test_real4 = bessel_yn(n, x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @ynf({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (i32, f32) -> f32 + +function test_real8(x, n) + real(8) :: x, test_real8 + integer :: n + test_real8 = bessel_yn(n, x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @yn({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (i32, f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/erfc.f90 b/flang/test/Lower/Intrinsics/erfc.f90 new file mode 100644 index 0000000..99cef2d --- /dev/null +++ b/flang/test/Lower/Intrinsics/erfc.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = erfc(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @erfcf({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = erfc(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @erfc({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/gamma.f90 b/flang/test/Lower/Intrinsics/gamma.f90 new file mode 100644 index 0000000..eb15ed7 --- /dev/null +++ b/flang/test/Lower/Intrinsics/gamma.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = gamma(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @tgammaf({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = gamma(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @tgamma({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/Intrinsics/log_gamma.f90 b/flang/test/Lower/Intrinsics/log_gamma.f90 new file mode 100644 index 0000000..d469f94 --- /dev/null +++ b/flang/test/Lower/Intrinsics/log_gamma.f90 @@ -0,0 +1,22 @@ +! RUN: bbc -emit-fir %s -o - --math-runtime=fast | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=fast %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=relaxed | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=relaxed %s -o - | FileCheck --check-prefixes=ALL %s +! RUN: bbc -emit-fir %s -o - --math-runtime=precise | FileCheck --check-prefixes=ALL %s +! RUN: %flang_fc1 -emit-fir -mllvm -math-runtime=precise %s -o - | FileCheck --check-prefixes=ALL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = log_gamma(x) +end function + +! ALL-LABEL: @_QPtest_real4 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @lgammaf({{%[A-Za-z0-9._]+}}) : (f32) -> f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = log_gamma(x) +end function + +! ALL-LABEL: @_QPtest_real8 +! ALL: {{%[A-Za-z0-9._]+}} = fir.call @lgamma({{%[A-Za-z0-9._]+}}) : (f64) -> f64 diff --git a/flang/test/Lower/dummy-procedure.f90 b/flang/test/Lower/dummy-procedure.f90 index 1ad53cf..446fdbd 100644 --- a/flang/test/Lower/dummy-procedure.f90 +++ b/flang/test/Lower/dummy-procedure.f90 @@ -154,7 +154,7 @@ end subroutine ! CHECK-LABEL: func private @fir.acos.f32.ref_f32(%arg0: !fir.ref) -> f32 !CHECK: %[[load:.*]] = fir.load %arg0 - !CHECK: %[[res:.*]] = fir.call @__fs_acos_1(%[[load]]) : (f32) -> f32 + !CHECK: %[[res:.*]] = fir.call @acosf(%[[load]]) : (f32) -> f32 !CHECK: return %[[res]] : f32 ! CHECK-LABEL: func private @fir.atan2.f32.ref_f32.ref_f32( -- 2.7.4