diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index f4541bf30676a6..fe7605d8ce4ba7 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -1059,6 +1059,12 @@ static constexpr MathOperation mathOperations[] = { {"atan", "catan", genFuncType, Ty::Complex<8>>, genLibCall}, {"atan", RTNAME_STRING(CAtanF128), FuncTypeComplex16Complex16, genLibF128Call}, + {"atan", "atan2f", genFuncType, Ty::Real<4>, Ty::Real<4>>, + genMathOp}, + {"atan", "atan2", genFuncType, Ty::Real<8>, Ty::Real<8>>, + genMathOp}, + {"atan", RTNAME_STRING(Atan2F128), FuncTypeReal16Real16Real16, + genLibF128Call}, {"atan2", "atan2f", genFuncType, Ty::Real<4>, Ty::Real<4>>, genMathOp}, {"atan2", "atan2", genFuncType, Ty::Real<8>, Ty::Real<8>>, diff --git a/flang/test/Lower/Intrinsics/atan.f90 b/flang/test/Lower/Intrinsics/atan.f90 new file mode 100644 index 00000000000000..cf595b4d95d1d4 --- /dev/null +++ b/flang/test/Lower/Intrinsics/atan.f90 @@ -0,0 +1,55 @@ +! Check that correct runtime calls are used. +! RUN: bbc --math-runtime=precise -emit-fir %s -o - | FileCheck --check-prefixes=CHECK-RUNTIME %s +! RUN: %flang_fc1 -mllvm -math-runtime=precise -emit-fir %s -o - | FileCheck --check-prefixes=CHECK-RUNTIME %s + +! Check that the correct math dialect operations are used. +! RUN: bbc -emit-fir %s -o - | FileCheck --check-prefixes=CHECK-NORMAL %s +! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck --check-prefixes=CHECK-NORMAL %s + +function test_real4(x) + real :: x, test_real4 + test_real4 = atan(x) +end function + +! CHECK-RUNTIME: {{%[A-Za-z0-9._]+}} = fir.call @atanf({{.*}}) {{.*}}: (f32) -> f32 +! CHECK-NORMAL: {{%[A-Za-z0-9._]+}} = math.atan {{.*}} {{.*}}: f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = atan(x) +end function + +! CHECK-RUNTIME: {{%[A-Za-z0-9._]+}} = fir.call @atan({{.*}}) {{.*}}: (f64) -> f64 +! CHECK-NORMAL: {{%[A-Za-z0-9._]+}} = math.atan {{.*}} {{.*}}: f64 + +function test_complex4(x) + complex :: x, test_complex4 + test_complex4 = atan(x) +end function + +! CHECK-RUNTIME: {{%[A-Za-z0-9._]+}} = fir.call @catanf({{.*}}) {{.*}}: (!fir.complex<4>) -> !fir.complex<4> +! CHECK-NORMAL: {{%[A-Za-z0-9._]+}} = fir.call @catanf({{.*}}) {{.*}}: (!fir.complex<4>) -> !fir.complex<4> + +function test_complex8(x) + complex(kind=8) :: x, test_complex8 + test_complex8 = atan(x) +end function + +! CHECK-RUNTIME: {{%[A-Za-z0-9._]+}} = fir.call @catan({{.*}}) {{.*}}: (!fir.complex<8>) -> !fir.complex<8> +! CHECK-NORMAL: {{%[A-Za-z0-9._]+}} = fir.call @catan({{.*}}) {{.*}}: (!fir.complex<8>) -> !fir.complex<8> + +function test_real4_2(y, x) + real :: y, x, test_real4_2 + test_real4_2 = atan(y, x) +end function + +! CHECK-RUNTIME: {{%[A-Za-z0-9._]+}} = fir.call @atan2f({{.*}}) {{.*}}: (f32, f32) -> f32 +! CHECK-NORMAL: {{%[A-Za-z0-9._]+}} = math.atan2 {{.*}} {{.*}}: f32 + +function test_real8_2(y, x) + real(8) :: y, x, test_real8_2 + test_real8_2 = atan(y, x) +end function + +! CHECK-RUNTIME: {{%[A-Za-z0-9._]+}} = fir.call @atan2({{.*}}) {{.*}}: (f64, f64) -> f64 +! CHECK-NORMAL: {{%[A-Za-z0-9._]+}} = math.atan2 {{.*}} {{.*}}: f64 diff --git a/flang/test/Lower/Intrinsics/atan_real16.f90 b/flang/test/Lower/Intrinsics/atan_real16.f90 index 5c0c262711c61b..3ae037307c32b6 100644 --- a/flang/test/Lower/Intrinsics/atan_real16.f90 +++ b/flang/test/Lower/Intrinsics/atan_real16.f90 @@ -3,7 +3,18 @@ ! RUN: bbc --math-runtime=precise -emit-fir %s -o - | FileCheck %s ! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s +function test_real16(x) + real(16) :: x, test_real16 + test_real16 = atan(x) +end function real16 + +! CHECK-LABEL: @_QPtest_real16 ! CHECK: fir.call @_FortranAAtanF128({{.*}}){{.*}}: (f128) -> f128 - real(16) :: a, b - b = atan(a) -end + +function test_real16_2(y, x) + real(16) :: y, x, test_real16 + test_real16 = atan(y, x) +end function real16_2 + +! CHECK-LABEL: @_QPtest_real16 +! CHECK: fir.call @_FortranAAtan2F128({{.*}}){{.*}}: (f128, f128) -> f128