diff --git a/flang/lib/Lower/IntrinsicCall.cpp b/flang/lib/Lower/IntrinsicCall.cpp --- a/flang/lib/Lower/IntrinsicCall.cpp +++ b/flang/lib/Lower/IntrinsicCall.cpp @@ -1036,6 +1036,8 @@ {"sign", "llvm.copysign.f64", genF64F64F64FuncType}, {"sign", "llvm.copysign.f80", genF80F80F80FuncType}, {"sign", "llvm.copysign.f128", genF128F128F128FuncType}, + {"sqrt", "llvm.sqrt.f32", genF32F32FuncType}, + {"sqrt", "llvm.sqrt.f64", genF64F64FuncType}, }; // This helper class computes a "distance" between two function types. diff --git a/flang/test/Lower/llvm-math.f90 b/flang/test/Lower/llvm-math.f90 --- a/flang/test/Lower/llvm-math.f90 +++ b/flang/test/Lower/llvm-math.f90 @@ -88,4 +88,24 @@ ! CHECK: func private @fir.log10.f32.f32(%arg0: f32) ! CHECK-NEXT: %0 = fir.call @llvm.log10.f32(%arg0) : (f32) -> f32 ! CHECK-NEXT: return %0 : f32 +! CHECK-NEXT: } + + SUBROUTINE SQRT_WRAPPER(IN, OUT) + REAL :: IN, OUT + OUT = SQRT(IN) + END SUBROUTINE + +! CHECK-LABEL: func private @fir.sqrt.f32.f32(%arg0: f32) +! CHECK-NEXT: %0 = fir.call @llvm.sqrt.f32(%arg0) : (f32) -> f32 +! CHECK-NEXT: return %0 : f32 +! CHECK-NEXT: } + + SUBROUTINE SQRTD_WRAPPER(IN, OUT) + REAL(KIND=8) :: IN, OUT + OUT = SQRT(IN) + END SUBROUTINE + +! CHECK-LABEL: func private @fir.sqrt.f64.f64(%arg0: f64) +! CHECK-NEXT: %0 = fir.call @llvm.sqrt.f64(%arg0) : (f64) -> f64 +! CHECK-NEXT: return %0 : f64 ! CHECK-NEXT: } diff --git a/flang/test/Lower/sqrt.f90 b/flang/test/Lower/sqrt.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Lower/sqrt.f90 @@ -0,0 +1,42 @@ +! RUN: bbc -emit-fir %s -o - | FileCheck %s +! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s + +! CHECK-LABEL: sqrt_testr +subroutine sqrt_testr(a, b) + real :: a, b +! CHECK: fir.call @fir.sqrt.f32.f32 + b = sqrt(a) +end subroutine + +! CHECK-LABEL: sqrt_testd +subroutine sqrt_testd(a, b) + real(kind=8) :: a, b +! CHECK: fir.call @fir.sqrt.f64.f64 + b = sqrt(a) +end subroutine + +! CHECK-LABEL: sqrt_testc +subroutine sqrt_testc(z) + complex :: z +! CHECK: fir.call @fir.sqrt.z4.z4 + z = sqrt(z) +end subroutine + +! CHECK-LABEL: sqrt_testcd +subroutine sqrt_testcd(z) + complex(kind=8) :: z +! CHECK: fir.call @fir.sqrt.z8.z8 + z = sqrt(z) +end subroutine + +! CHECK-LABEL: @fir.sqrt.f32.f32 +! CHECK: fir.call {{.*}}mth_i_sqrt + +! CHECK-LABEL: @fir.sqrt.f64.f64 +! CHECK: fir.call {{.*}}mth_i_dsqrt + +! CHECK-LABEL: func private @fir.sqrt.z4.z4 +! CHECK: fir.call {{.*}}fc_sqrt + +! CHECK-LABEL: @fir.sqrt.z8.z8 +! CHECK: fir.call {{.*}}fz_sqrt