[flang-commits] [flang] fea20cb - [Flang] Lower the sqrt intrinsics

Kiran Chandramohan via flang-commits flang-commits at lists.llvm.org
Tue Mar 22 08:09:42 PDT 2022


Author: Kiran Chandramohan
Date: 2022-03-22T15:05:21Z
New Revision: fea20cb99087208d589d81bb7bbbc84198c7ffa4

URL: https://github.com/llvm/llvm-project/commit/fea20cb99087208d589d81bb7bbbc84198c7ffa4
DIFF: https://github.com/llvm/llvm-project/commit/fea20cb99087208d589d81bb7bbbc84198c7ffa4.diff

LOG: [Flang] Lower the sqrt intrinsics

The intrinsic computes the square root for real and complex numbers. By
default they are lowered to runtime calls to libpgmath. With the llvm
option, it can be lowered to llvm intrinsics (not all types .eg. complex
are supported for llvm 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: schweitz

Differential Revision: https://reviews.llvm.org/D122018

Co-authored-by: Eric Schweitz <eschweitz at nvidia.com>
Co-authored-by: Jean Perier <jperier at nvidia.com>

Added: 
    flang/test/Lower/sqrt.f90

Modified: 
    flang/lib/Lower/IntrinsicCall.cpp
    flang/test/Lower/llvm-math.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/IntrinsicCall.cpp b/flang/lib/Lower/IntrinsicCall.cpp
index efc4f5132794b..d364453387f17 100644
--- a/flang/lib/Lower/IntrinsicCall.cpp
+++ b/flang/lib/Lower/IntrinsicCall.cpp
@@ -1036,6 +1036,8 @@ static constexpr RuntimeFunction llvmIntrinsics[] = {
     {"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
index fe2c67c20cdb0..efe4394804c0e 100644
--- a/flang/test/Lower/llvm-math.f90
+++ b/flang/test/Lower/llvm-math.f90
@@ -88,4 +88,24 @@ SUBROUTINE LOG10F_WRAPPER(IN, OUT)
 ! 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
index 0000000000000..fe36e86db1a99
--- /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


        


More information about the flang-commits mailing list