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 @@ -1014,6 +1014,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 @@ -23,3 +23,25 @@ ! CHECK-NEXT: %0 = fir.load %arg0 : !fir.ref ! CHECK-NEXT: %1 = fir.load %arg1 : !fir.ref ! CHECK-NEXT: %2 = fir.call @llvm.pow.f32(%0, %1) : (f32, f32) -> f32 + + SUBROUTINE SQRT_WRAPPER(IN, OUT) + REAL :: IN, OUT + OUT = SQRT(IN) + END SUBROUTINE + +! CHECK-LABEL: func @_QPsqrt_wrapper( +! CHECK-SAME: %[[IN_REF:.*]]: !fir.ref {{.*}}, %[[OUT_REF:.*]]: !fir.ref {{.*}}) { +! CHECK-NEXT: %[[IN:.*]] = fir.load %[[IN_REF]] : !fir.ref +! CHECK-NEXT: %[[RESULT:.*]] = fir.call @llvm.sqrt.f32(%[[IN]]) : (f32) -> f32 +! CHECK-NEXT: fir.store %[[RESULT]] to %[[OUT_REF]] : !fir.ref + + SUBROUTINE SQRTD_WRAPPER(IN, OUT) + REAL(KIND=8) :: IN, OUT + OUT = SQRT(IN) + END SUBROUTINE + +! CHECK-LABEL: func @_QPsqrtd_wrapper( +! CHECK-SAME: %[[IN_REF:.*]]: !fir.ref {{.*}}, %[[OUT_REF:.*]]: !fir.ref {{.*}}) { +! CHECK-NEXT: %[[IN:.*]] = fir.load %[[IN_REF]] : !fir.ref +! CHECK-NEXT: %[[RESULT:.*]] = fir.call @llvm.sqrt.f64(%[[IN]]) : (f64) -> f64 +! CHECK-NEXT: fir.store %[[RESULT]] to %[[OUT_REF]] : !fir.ref 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,31 @@ +! 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 {{.*}}mth_i_sqrt + b = sqrt(a) +end subroutine + +! CHECK-LABEL: sqrt_testd +subroutine sqrt_testd(a, b) + real(kind=8) :: a, b + ! CHECK: fir.call {{.*}}mth_i_dsqrt + b = sqrt(a) +end subroutine + +! CHECK-LABEL: sqrt_testc +subroutine sqrt_testc(z) + complex :: z + ! CHECK: fir.call {{.*}}fc_sqrt + z = sqrt(z) +end subroutine + +! CHECK-LABEL: sqrt_testcd +subroutine sqrt_testcd(z) + complex(kind=8) :: z + ! CHECK: fir.call {{.*}}fz_sqrt + z = sqrt(z) +end subroutine +