Skip to content

Commit c377ce1

Browse files
authored
[AArch64][VecLib] Add libmvec support for AArch64 targets (#143696)
This patch adds support for the `libmvec` vector library on AArch64 targets. Currently, all `libmvec` functions in GLIBC version 2.40 are supported. The full list of math functions enabled can be found [here](https://github.com/bminor/glibc/blob/96abd59bf2a11ddd4e7ccaac840ec13c0b62d3ba/sysdeps/aarch64/fpu/Versions) (up to GLIBC 2.40). Previously, `libmvec` was only supported on x86_64 targets. Attempts to use it on AArch64 resulted in the following error from Clang: `unsupported option 'libmvec' for target 'aarch64'`.
1 parent 7eda827 commit c377ce1

File tree

11 files changed

+3243
-9
lines changed

11 files changed

+3243
-9
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,8 @@ Modified Compiler Flags
359359

360360
- The ``-fchar8_t`` flag is no longer considered in non-C++ languages modes. (#GH55373)
361361

362+
- The ``-fveclib=libmvec`` option now supports AArch64 targets (requires GLIBC 2.40 or newer).
363+
362364
Removed Compiler Flags
363365
-------------------------
364366

clang/include/clang/Driver/Options.td

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3479,8 +3479,9 @@ def fveclib : Joined<["-"], "fveclib=">, Group<f_Group>,
34793479
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
34803480
HelpText<"Use the given vector functions library">,
34813481
HelpTextForVariants<[ClangOption, CC1Option],
3482-
"Use the given vector functions library. "
3483-
"Note: -fveclib={ArmPL,SLEEF} implies -fno-math-errno">,
3482+
"Use the given vector functions library.\n"
3483+
" Note: -fveclib={ArmPL,SLEEF,libmvec} implies -fno-math-errno.\n"
3484+
" Note: -fveclib=libmvec on AArch64 requires GLIBC 2.40 or newer.">,
34843485
Values<"Accelerate,libmvec,MASSV,SVML,SLEEF,Darwin_libsystem_m,ArmPL,AMDLIBM,none">,
34853486
NormalizedValuesScope<"llvm::driver::VectorLibrary">,
34863487
NormalizedValues<["Accelerate", "LIBMVEC", "MASSV", "SVML", "SLEEF",

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5702,11 +5702,18 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
57025702
Triple.getArch() != llvm::Triple::x86_64)
57035703
D.Diag(diag::err_drv_unsupported_opt_for_target)
57045704
<< Name << Triple.getArchName();
5705-
} else if (Name == "libmvec" || Name == "AMDLIBM") {
5705+
} else if (Name == "AMDLIBM") {
57065706
if (Triple.getArch() != llvm::Triple::x86 &&
57075707
Triple.getArch() != llvm::Triple::x86_64)
57085708
D.Diag(diag::err_drv_unsupported_opt_for_target)
57095709
<< Name << Triple.getArchName();
5710+
} else if (Name == "libmvec") {
5711+
if (Triple.getArch() != llvm::Triple::x86 &&
5712+
Triple.getArch() != llvm::Triple::x86_64 &&
5713+
Triple.getArch() != llvm::Triple::aarch64 &&
5714+
Triple.getArch() != llvm::Triple::aarch64_be)
5715+
D.Diag(diag::err_drv_unsupported_opt_for_target)
5716+
<< Name << Triple.getArchName();
57105717
} else if (Name == "SLEEF" || Name == "ArmPL") {
57115718
if (Triple.getArch() != llvm::Triple::aarch64 &&
57125719
Triple.getArch() != llvm::Triple::aarch64_be &&

clang/test/Driver/fveclib.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// RUN: %clang -### -c -fveclib=none %s 2>&1 | FileCheck --check-prefix=CHECK-NOLIB %s
22
// RUN: %clang -### -c -fveclib=Accelerate %s 2>&1 | FileCheck --check-prefix=CHECK-ACCELERATE %s
33
// RUN: %clang -### -c --target=x86_64-unknown-linux-gnu -fveclib=libmvec %s 2>&1 | FileCheck --check-prefix=CHECK-libmvec %s
4+
// RUN: %clang -### -c --target=aarch64-linux-gnu -fveclib=libmvec %s 2>&1 | FileCheck --check-prefix=CHECK-LIBMVEC-AARCH64 %s
45
// RUN: %clang -### -c --target=x86_64-unknown-linux-gnu -fveclib=AMDLIBM %s 2>&1 | FileCheck --check-prefix=CHECK-AMDLIBM %s
56
// RUN: %clang -### -c -fveclib=MASSV %s 2>&1 | FileCheck --check-prefix=CHECK-MASSV %s
67
// RUN: %clang -### -c -fveclib=Darwin_libsystem_m %s 2>&1 | FileCheck --check-prefix=CHECK-DARWIN_LIBSYSTEM_M %s
@@ -12,6 +13,7 @@
1213
// CHECK-NOLIB: "-fveclib=none"
1314
// CHECK-ACCELERATE: "-fveclib=Accelerate"
1415
// CHECK-libmvec: "-fveclib=libmvec"
16+
// CHECK-LIBMVEC-AARCH64: "-fveclib=libmvec"
1517
// CHECK-AMDLIBM: "-fveclib=AMDLIBM"
1618
// CHECK-MASSV: "-fveclib=MASSV"
1719
// CHECK-DARWIN_LIBSYSTEM_M: "-fveclib=Darwin_libsystem_m"
@@ -23,7 +25,6 @@
2325

2426
// RUN: not %clang --target=x86 -c -fveclib=SLEEF %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
2527
// RUN: not %clang --target=x86 -c -fveclib=ArmPL %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
26-
// RUN: not %clang --target=aarch64 -c -fveclib=libmvec %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
2728
// RUN: not %clang --target=aarch64 -c -fveclib=SVML %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
2829
// RUN: not %clang --target=aarch64 -c -fveclib=AMDLIBM %s 2>&1 | FileCheck --check-prefix=CHECK-ERROR %s
2930
// CHECK-ERROR: unsupported option {{.*}} for target
@@ -43,6 +44,9 @@
4344
// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fveclib=libmvec -flto %s 2>&1 | FileCheck --check-prefix=CHECK-LTO-LIBMVEC %s
4445
// CHECK-LTO-LIBMVEC: "-plugin-opt=-vector-library=LIBMVEC"
4546

47+
// RUN: %clang -### --target=aarch64-linux-gnu -fveclib=libmvec -flto %s 2>&1 | FileCheck --check-prefix=CHECK-LTO-LIBMVEC-AARCH64 %s
48+
// CHECK-LTO-LIBMVEC-AARCH64: "-plugin-opt=-vector-library=LIBMVEC"
49+
4650
// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fveclib=AMDLIBM -flto %s 2>&1 | FileCheck --check-prefix=CHECK-LTO-AMDLIBM %s
4751
// CHECK-LTO-AMDLIBM: "-plugin-opt=-vector-library=AMDLIBM"
4852

@@ -68,6 +72,10 @@
6872
// CHECK-ERRNO-LIBMVEC: "-fveclib=libmvec"
6973
// CHECK-ERRNO-LIBMVEC-SAME: "-fmath-errno"
7074

75+
// RUN: %clang -### --target=aarch64-linux-gnu -fveclib=libmvec %s 2>&1 | FileCheck --check-prefix=CHECK-ERRNO-LIBMVEC-AARCH64 %s
76+
// CHECK-ERRNO-LIBMVEC-AARCH64: "-fveclib=libmvec"
77+
// CHECK-ERRNO-LIBMVEC-AARCH64-SAME: "-fmath-errno"
78+
7179
// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fveclib=AMDLIBM %s 2>&1 | FileCheck --check-prefix=CHECK-ERRNO-AMDLIBM %s
7280
// CHECK-ERRNO-AMDLIBM: "-fveclib=AMDLIBM"
7381
// CHECK-ERRNO-AMDLIBM-SAME: "-fmath-errno"

0 commit comments

Comments
 (0)