[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