[Flang] Lower atan, sinh, cosh intrinsics
The intrinsic computes the tan and hyperbolic sin, cosine values. By
default they are lowered to runtime calls to the math library. Not all
types are supported currently. The generic and llvm lowering does not
lower floating point types with kind greater than 8, the llvm lowering
does not support the complex types.
Note: tanh is not present in fir-dev hence ignoring for now. We can add
support after upstreaming is complete. sin and cos will come in separate
patches since they have llvm intrinsic lowering.
This is part of the upstreaming effort from the fir-dev branch in [1].
[1] https://github.com/flang-compiler/f18-llvm-project
Reviewed By: PeteSteinfeld
Differential Revision: https://reviews.llvm.org/D122264
Co-authored-by: Eric Schweitz <[email protected]>
Co-authored-by: William Moses <[email protected]>
diff --git a/flang/test/Lower/trigonometric-intrinsics.f90 b/flang/test/Lower/trigonometric-intrinsics.f90
new file mode 100644
index 0000000..8ec8f13
--- /dev/null
+++ b/flang/test/Lower/trigonometric-intrinsics.f90
@@ -0,0 +1,122 @@
+! RUN: bbc -emit-fir %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s
+
+! CHECK-LABEL: atan_testr
+subroutine atan_testr(a, b)
+ real :: a, b
+! CHECK: fir.call @fir.atan.f32.f32
+ b = atan(a)
+end subroutine
+
+! CHECK-LABEL: atan_testd
+subroutine atan_testd(a, b)
+ real(kind=8) :: a, b
+! CHECK: fir.call @fir.atan.f64.f64
+ b = atan(a)
+end subroutine
+
+! CHECK-LABEL: atan_testc
+subroutine atan_testc(z)
+ complex :: z
+! CHECK: fir.call @fir.atan.z4.z4
+ z = atan(z)
+end subroutine
+
+! CHECK-LABEL: atan_testcd
+subroutine atan_testcd(z)
+ complex(kind=8) :: z
+! CHECK: fir.call @fir.atan.z8.z8
+ z = atan(z)
+end subroutine
+
+! CHECK-LABEL: cosh_testr
+subroutine cosh_testr(a, b)
+ real :: a, b
+! CHECK: fir.call @fir.cosh.f32.f32
+ b = cosh(a)
+end subroutine
+
+! CHECK-LABEL: cosh_testd
+subroutine cosh_testd(a, b)
+ real(kind=8) :: a, b
+! CHECK: fir.call @fir.cosh.f64.f64
+ b = cosh(a)
+end subroutine
+
+! CHECK-LABEL: cosh_testc
+subroutine cosh_testc(z)
+ complex :: z
+! CHECK: fir.call @fir.cosh.z4.z4
+ z = cosh(z)
+end subroutine
+
+! CHECK-LABEL: cosh_testcd
+subroutine cosh_testcd(z)
+ complex(kind=8) :: z
+! CHECK: fir.call @fir.cosh.z8.z8
+ z = cosh(z)
+end subroutine
+
+! CHECK-LABEL: sinh_testr
+subroutine sinh_testr(a, b)
+ real :: a, b
+! CHECK: fir.call @fir.sinh.f32.f32
+ b = sinh(a)
+end subroutine
+
+! CHECK-LABEL: sinh_testd
+subroutine sinh_testd(a, b)
+ real(kind=8) :: a, b
+! CHECK: fir.call @fir.sinh.f64.f64
+ b = sinh(a)
+end subroutine
+
+! CHECK-LABEL: sinh_testc
+subroutine sinh_testc(z)
+ complex :: z
+! CHECK: fir.call @fir.sinh.z4.z4
+ z = sinh(z)
+end subroutine
+
+! CHECK-LABEL: sinh_testcd
+subroutine sinh_testcd(z)
+ complex(kind=8) :: z
+! CHECK: fir.call @fir.sinh.z8.z8
+ z = sinh(z)
+end subroutine
+
+! CHECK-LABEL: @fir.atan.f32.f32
+! CHECK: fir.call {{.*}}atan
+
+! CHECK-LABEL: @fir.atan.f64.f64
+! CHECK: fir.call {{.*}}atan
+
+! CHECK-LABEL: @fir.atan.z4.z4
+! CHECK: fir.call {{.*}}atan
+
+! CHECK-LABEL: @fir.atan.z8.z8
+! CHECK: fir.call {{.*}}atan
+
+! CHECK-LABEL: @fir.cosh.f32.f32
+! CHECK: fir.call {{.*}}cosh
+
+! CHECK-LABEL: @fir.cosh.f64.f64
+! CHECK: fir.call {{.*}}cosh
+
+! CHECK-LABEL: @fir.cosh.z4.z4
+! CHECK: fir.call {{.*}}cosh
+
+! CHECK-LABEL: @fir.cosh.z8.z8
+! CHECK: fir.call {{.*}}cosh
+
+! CHECK-LABEL: @fir.sinh.f32.f32
+! CHECK: fir.call {{.*}}sinh
+
+! CHECK-LABEL: @fir.sinh.f64.f64
+! CHECK: fir.call {{.*}}sinh
+
+! CHECK-LABEL: @fir.sinh.z4.z4
+! CHECK: fir.call {{.*}}sinh
+
+! CHECK-LABEL: @fir.sinh.z8.z8
+! CHECK: fir.call {{.*}}sinh