Skip to content

Commit d67013a

Browse files
authored
[Flang][AArch64][VecLib] Add libmvec support for Flang/AArch64 (#146453)
`-fveclib=libmvec` for AArch64 (NEON and SVE) in Clang was supported by #143696. This patch does the same for Flang. Vector functions defined in `libmvec` are used for the following Fortran operator and functions currently. - Power operator (`**`) - Fortran intrinsic functions listed below for `real(kind=4)` and `real(kind=8)` (including their coresponding specific intrinsic functions) - Fortran intrinsic functions which are expanded using functions listed below (for example, `sin` for `complex(kind=8)`) ``` sin tan cos asin acos atan (both atan(x) and atan(y, x)) atan2 cosh tanh asinh acosh atanh erf erfc exp log log10 ``` As with Clang/AArch64, glibc 2.40 or higher is required to use all these functions.
1 parent 31e85f9 commit d67013a

File tree

5 files changed

+18
-3
lines changed

5 files changed

+18
-3
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3489,7 +3489,8 @@ def fno_experimental_isel : Flag<["-"], "fno-experimental-isel">, Group<f_clang_
34893489
Alias<fno_global_isel>;
34903490
def fveclib : Joined<["-"], "fveclib=">, Group<f_Group>,
34913491
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
3492-
HelpText<"Use the given vector functions library">,
3492+
HelpText<"Use the given vector functions library.\n"
3493+
" Note: -fveclib=libmvec on AArch64 requires GLIBC 2.40 or newer.">,
34933494
HelpTextForVariants<[ClangOption, CC1Option],
34943495
"Use the given vector functions library.\n"
34953496
" Note: -fveclib={ArmPL,SLEEF,libmvec} implies -fno-math-errno.\n"

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,11 +484,18 @@ void Flang::addTargetOptions(const ArgList &Args,
484484
Triple.getArch() != llvm::Triple::x86_64)
485485
D.Diag(diag::err_drv_unsupported_opt_for_target)
486486
<< Name << Triple.getArchName();
487-
} else if (Name == "libmvec" || Name == "AMDLIBM") {
487+
} else if (Name == "AMDLIBM") {
488488
if (Triple.getArch() != llvm::Triple::x86 &&
489489
Triple.getArch() != llvm::Triple::x86_64)
490490
D.Diag(diag::err_drv_unsupported_opt_for_target)
491491
<< Name << Triple.getArchName();
492+
} else if (Name == "libmvec") {
493+
if (Triple.getArch() != llvm::Triple::x86 &&
494+
Triple.getArch() != llvm::Triple::x86_64 &&
495+
Triple.getArch() != llvm::Triple::aarch64 &&
496+
Triple.getArch() != llvm::Triple::aarch64_be)
497+
D.Diag(diag::err_drv_unsupported_opt_for_target)
498+
<< Name << Triple.getArchName();
492499
} else if (Name == "SLEEF" || Name == "ArmPL") {
493500
if (Triple.getArch() != llvm::Triple::aarch64 &&
494501
Triple.getArch() != llvm::Triple::aarch64_be)

flang/docs/ReleaseNotes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ page](https://llvm.org/releases/).
3434

3535
* -floop-interchange is now recognized by flang.
3636
* -floop-interchange is enabled by default at -O2 and above.
37+
* -fveclib=libmvec is supported for AArch64 (same as Flang/x86 and
38+
Clang/AArch64) (requires GLIBC 2.40 or newer)
3739

3840
## Windows Support
3941

flang/test/Driver/fveclib-codegen.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
! test that -fveclib= is passed to the backend
22
! RUN: %if aarch64-registered-target %{ %flang -S -Ofast -target aarch64-unknown-linux-gnu -fveclib=SLEEF -o - %s | FileCheck %s --check-prefix=SLEEF %}
33
! RUN: %if x86-registered-target %{ %flang -S -Ofast -target x86_64-unknown-linux-gnu -fveclib=libmvec -o - %s | FileCheck %s %}
4+
! RUN: %if aarch64-registered-target %{ %flang -S -Ofast -target aarch64-unknown-linux-gnu -fveclib=libmvec -march=armv8.2-a+nosve -o - %s | FileCheck %s --check-prefix=LIBMVEC-AARCH64-NEON %}
5+
! RUN: %if aarch64-registered-target %{ %flang -S -Ofast -target aarch64-unknown-linux-gnu -fveclib=libmvec -march=armv8.2-a+sve -o - %s | FileCheck %s --check-prefix=LIBMVEC-AARCH64-SVE %}
46
! RUN: %if x86-registered-target %{ %flang -S -O3 -ffast-math -target x86_64-unknown-linux-gnu -fveclib=AMDLIBM -o - %s | FileCheck %s --check-prefix=AMDLIBM %}
57
! RUN: %flang -S -Ofast -fveclib=NoLibrary -o - %s | FileCheck %s --check-prefix=NOLIB
68

@@ -11,6 +13,8 @@ subroutine sb(a, b)
1113
! check that we used a vectorized call to powf()
1214
! CHECK: _ZGVbN4vv_powf
1315
! SLEEF: _ZGVnN4vv_powf
16+
! LIBMVEC-AARCH64-NEON: _ZGVnN4vv_powf
17+
! LIBMVEC-AARCH64-SVE: _ZGVsMxvv_powf
1418
! AMDLIBM: amd_vrs4_powf
1519
! NOLIB: powf
1620
a(i) = a(i) ** b(i)

flang/test/Driver/fveclib.f90

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
! RUN: %flang -### -c -fveclib=none %s 2>&1 | FileCheck -check-prefix CHECK-NOLIB %s
22
! RUN: %flang -### -c -fveclib=Accelerate %s 2>&1 | FileCheck -check-prefix CHECK-ACCELERATE %s
33
! RUN: %flang -### -c --target=x86_64-unknown-linux-gnu -fveclib=libmvec %s 2>&1 | FileCheck -check-prefix CHECK-libmvec %s
4+
! RUN: %flang -### -c --target=aarch64-unknown-linux-gnu -fveclib=libmvec %s 2>&1 | FileCheck -check-prefix CHECK-libmvec %s
45
! RUN: %flang -### -c -fveclib=MASSV %s 2>&1 | FileCheck -check-prefix CHECK-MASSV %s
56
! RUN: %flang -### -c -fveclib=Darwin_libsystem_m %s 2>&1 | FileCheck -check-prefix CHECK-DARWIN_LIBSYSTEM_M %s
67
! RUN: %flang -### -c --target=aarch64-none-none -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-SLEEF %s
@@ -23,7 +24,7 @@
2324

2425
! RUN: not %flang --target=x86-none-none -c -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
2526
! RUN: not %flang --target=x86-none-none -c -fveclib=ArmPL %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
26-
! RUN: not %flang --target=aarch64-none-none -c -fveclib=libmvec %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
27+
! RUN: not %flang --target=riscv64-none-none -c -fveclib=libmvec %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
2728
! RUN: not %flang --target=aarch64-none-none -c -fveclib=SVML %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
2829
! RUN: not %flang --target=aarch64-none-none -c -fveclib=AMDLIBM %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
2930
! CHECK-ERROR: unsupported option {{.*}} for target

0 commit comments

Comments
 (0)