[flang] add fveclib flag (#71734)
-fveclib= allows users to choose a vectorized libm so that loops containing math functions are vectorized. This is implemented as much as possible in the same way as in clang. The driver test in veclib.f90 is copied from the clang test.
This commit is contained in:
@@ -426,7 +426,7 @@ ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NormalInlining)
|
||||
VALUE_CODEGENOPT(InlineMaxStackSize, 32, UINT_MAX)
|
||||
|
||||
// Vector functions library to use.
|
||||
ENUM_CODEGENOPT(VecLib, VectorLibrary, 3, NoLibrary)
|
||||
ENUM_CODEGENOPT(VecLib, llvm::driver::VectorLibrary, 3, llvm::driver::VectorLibrary::NoLibrary)
|
||||
|
||||
/// The default TLS model to use.
|
||||
ENUM_CODEGENOPT(DefaultTLSModel, TLSModel, 2, GeneralDynamicTLSModel)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "clang/Basic/XRayInstr.h"
|
||||
#include "llvm/ADT/FloatingPointMode.h"
|
||||
#include "llvm/Frontend/Debug/Options.h"
|
||||
#include "llvm/Frontend/Driver/CodeGenOptions.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/Regex.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
@@ -58,17 +59,6 @@ public:
|
||||
OnlyAlwaysInlining // Only run the always inlining pass.
|
||||
};
|
||||
|
||||
enum VectorLibrary {
|
||||
NoLibrary, // Don't use any vector library.
|
||||
Accelerate, // Use the Accelerate framework.
|
||||
LIBMVEC, // GLIBC vector math library.
|
||||
MASSV, // IBM MASS vector library.
|
||||
SVML, // Intel short vector math library.
|
||||
SLEEF, // SLEEF SIMD Library for Evaluating Elementary Functions.
|
||||
Darwin_libsystem_m, // Use Darwin's libsytem_m vector functions.
|
||||
ArmPL // Arm Performance Libraries.
|
||||
};
|
||||
|
||||
enum ObjCDispatchMethodKind {
|
||||
Legacy = 0,
|
||||
NonLegacy = 1,
|
||||
|
||||
@@ -3126,10 +3126,10 @@ def fno_global_isel : Flag<["-"], "fno-global-isel">, Group<f_clang_Group>,
|
||||
def fno_experimental_isel : Flag<["-"], "fno-experimental-isel">, Group<f_clang_Group>,
|
||||
Alias<fno_global_isel>;
|
||||
def fveclib : Joined<["-"], "fveclib=">, Group<f_Group>,
|
||||
Visibility<[ClangOption, CC1Option]>,
|
||||
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
|
||||
HelpText<"Use the given vector functions library">,
|
||||
Values<"Accelerate,libmvec,MASSV,SVML,SLEEF,Darwin_libsystem_m,ArmPL,none">,
|
||||
NormalizedValuesScope<"CodeGenOptions">,
|
||||
NormalizedValuesScope<"llvm::driver::VectorLibrary">,
|
||||
NormalizedValues<["Accelerate", "LIBMVEC", "MASSV", "SVML", "SLEEF",
|
||||
"Darwin_libsystem_m", "ArmPL", "NoLibrary"]>,
|
||||
MarshallingInfoEnum<CodeGenOpts<"VecLib">, "NoLibrary">;
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "llvm/CodeGen/RegAllocRegistry.h"
|
||||
#include "llvm/CodeGen/SchedulerRegistry.h"
|
||||
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
||||
#include "llvm/Frontend/Driver/CodeGenOptions.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DebugInfo.h"
|
||||
#include "llvm/IR/LegacyPassManager.h"
|
||||
@@ -264,45 +265,6 @@ static bool asanUseGlobalsGC(const Triple &T, const CodeGenOptions &CGOpts) {
|
||||
return false;
|
||||
}
|
||||
|
||||
static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple,
|
||||
const CodeGenOptions &CodeGenOpts) {
|
||||
TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple);
|
||||
|
||||
switch (CodeGenOpts.getVecLib()) {
|
||||
case CodeGenOptions::Accelerate:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate,
|
||||
TargetTriple);
|
||||
break;
|
||||
case CodeGenOptions::LIBMVEC:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::LIBMVEC_X86,
|
||||
TargetTriple);
|
||||
break;
|
||||
case CodeGenOptions::MASSV:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::MASSV,
|
||||
TargetTriple);
|
||||
break;
|
||||
case CodeGenOptions::SVML:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML,
|
||||
TargetTriple);
|
||||
break;
|
||||
case CodeGenOptions::SLEEF:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SLEEFGNUABI,
|
||||
TargetTriple);
|
||||
break;
|
||||
case CodeGenOptions::Darwin_libsystem_m:
|
||||
TLII->addVectorizableFunctionsFromVecLib(
|
||||
TargetLibraryInfoImpl::DarwinLibSystemM, TargetTriple);
|
||||
break;
|
||||
case CodeGenOptions::ArmPL:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::ArmPL,
|
||||
TargetTriple);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TLII;
|
||||
}
|
||||
|
||||
static std::optional<llvm::CodeModel::Model>
|
||||
getCodeModel(const CodeGenOptions &CodeGenOpts) {
|
||||
unsigned CodeModel = llvm::StringSwitch<unsigned>(CodeGenOpts.CodeModel)
|
||||
@@ -590,7 +552,7 @@ bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses,
|
||||
raw_pwrite_stream *DwoOS) {
|
||||
// Add LibraryInfo.
|
||||
std::unique_ptr<TargetLibraryInfoImpl> TLII(
|
||||
createTLII(TargetTriple, CodeGenOpts));
|
||||
llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
|
||||
CodeGenPasses.add(new TargetLibraryInfoWrapperPass(*TLII));
|
||||
|
||||
// Normal mode, emit a .s or .o file by running the code generator. Note,
|
||||
@@ -923,7 +885,7 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
|
||||
// Register the target library analysis directly and give it a customized
|
||||
// preset TLI.
|
||||
std::unique_ptr<TargetLibraryInfoImpl> TLII(
|
||||
createTLII(TargetTriple, CodeGenOpts));
|
||||
llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
|
||||
FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); });
|
||||
|
||||
// Register all the basic analyses with the managers.
|
||||
|
||||
@@ -9,6 +9,7 @@ set(LLVM_LINK_COMPONENTS
|
||||
Coverage
|
||||
Demangle
|
||||
Extensions
|
||||
FrontendDriver
|
||||
FrontendHLSL
|
||||
FrontendOpenMP
|
||||
FrontendOffloading
|
||||
|
||||
@@ -233,6 +233,40 @@ void Flang::addTargetOptions(const ArgList &Args,
|
||||
break;
|
||||
}
|
||||
|
||||
if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
|
||||
StringRef Name = A->getValue();
|
||||
if (Name == "SVML") {
|
||||
if (Triple.getArch() != llvm::Triple::x86 &&
|
||||
Triple.getArch() != llvm::Triple::x86_64)
|
||||
D.Diag(diag::err_drv_unsupported_opt_for_target)
|
||||
<< Name << Triple.getArchName();
|
||||
} else if (Name == "LIBMVEC-X86") {
|
||||
if (Triple.getArch() != llvm::Triple::x86 &&
|
||||
Triple.getArch() != llvm::Triple::x86_64)
|
||||
D.Diag(diag::err_drv_unsupported_opt_for_target)
|
||||
<< Name << Triple.getArchName();
|
||||
} else if (Name == "SLEEF" || Name == "ArmPL") {
|
||||
if (Triple.getArch() != llvm::Triple::aarch64 &&
|
||||
Triple.getArch() != llvm::Triple::aarch64_be)
|
||||
D.Diag(diag::err_drv_unsupported_opt_for_target)
|
||||
<< Name << Triple.getArchName();
|
||||
}
|
||||
|
||||
if (Triple.isOSDarwin()) {
|
||||
// flang doesn't currently suport nostdlib, nodefaultlibs. Adding these
|
||||
// here incase they are added someday
|
||||
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
|
||||
if (A->getValue() == StringRef{"Accelerate"}) {
|
||||
CmdArgs.push_back("-framework");
|
||||
CmdArgs.push_back("Accelerate");
|
||||
A->render(Args, CmdArgs);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
A->render(Args, CmdArgs);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Add target specific flags, ABI, mtune option etc.
|
||||
}
|
||||
|
||||
|
||||
@@ -111,7 +111,7 @@ int main(int argc, const char **argv) {
|
||||
|
||||
auto Files = llvm::makeIntrusiveRefCnt<FileManager>(FileSystemOptions(), OFS);
|
||||
|
||||
auto Driver = std::make_unique<driver::Driver>(
|
||||
auto Driver = std::make_unique<clang::driver::Driver>(
|
||||
"clang", llvm::sys::getDefaultTargetTriple(), Diagnostics,
|
||||
"ast-api-dump-tool", OFS);
|
||||
|
||||
@@ -121,14 +121,14 @@ int main(int argc, const char **argv) {
|
||||
return 1;
|
||||
|
||||
const auto &Jobs = Comp->getJobs();
|
||||
if (Jobs.size() != 1 || !isa<driver::Command>(*Jobs.begin())) {
|
||||
if (Jobs.size() != 1 || !isa<clang::driver::Command>(*Jobs.begin())) {
|
||||
SmallString<256> error_msg;
|
||||
llvm::raw_svector_ostream error_stream(error_msg);
|
||||
Jobs.Print(error_stream, "; ", true);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const auto &Cmd = cast<driver::Command>(*Jobs.begin());
|
||||
const auto &Cmd = cast<clang::driver::Command>(*Jobs.begin());
|
||||
const llvm::opt::ArgStringList &CC1Args = Cmd.getArguments();
|
||||
|
||||
auto Invocation = std::make_unique<CompilerInvocation>();
|
||||
|
||||
@@ -37,6 +37,7 @@ CODEGENOPT(AliasAnalysis, 1, 0) ///< Enable alias analysis pass
|
||||
CODEGENOPT(Underscoring, 1, 1)
|
||||
ENUM_CODEGENOPT(RelocationModel, llvm::Reloc::Model, 3, llvm::Reloc::PIC_) ///< Name of the relocation model to use.
|
||||
ENUM_CODEGENOPT(DebugInfo, llvm::codegenoptions::DebugInfoKind, 4, llvm::codegenoptions::NoDebugInfo) ///< Level of debug info to generate
|
||||
ENUM_CODEGENOPT(VecLib, llvm::driver::VectorLibrary, 3, llvm::driver::VectorLibrary::NoLibrary) ///< Vector functions library to use
|
||||
|
||||
#undef CODEGENOPT
|
||||
#undef ENUM_CODEGENOPT
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#define LLVM_CLANG_BASIC_CODEGENOPTIONS_H
|
||||
|
||||
#include "llvm/Frontend/Debug/Options.h"
|
||||
#include "llvm/Frontend/Driver/CodeGenOptions.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/Regex.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
|
||||
@@ -52,6 +52,7 @@ add_flang_library(flangFrontend
|
||||
Support
|
||||
Target
|
||||
TargetParser
|
||||
FrontendDriver
|
||||
FrontendOpenACC
|
||||
FrontendOpenMP
|
||||
|
||||
|
||||
@@ -153,6 +153,34 @@ static bool parseDebugArgs(Fortran::frontend::CodeGenOptions &opts,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool parseVectorLibArg(Fortran::frontend::CodeGenOptions &opts,
|
||||
llvm::opt::ArgList &args,
|
||||
clang::DiagnosticsEngine &diags) {
|
||||
llvm::opt::Arg *arg = args.getLastArg(clang::driver::options::OPT_fveclib);
|
||||
if (!arg)
|
||||
return true;
|
||||
|
||||
using VectorLibrary = llvm::driver::VectorLibrary;
|
||||
std::optional<VectorLibrary> val =
|
||||
llvm::StringSwitch<std::optional<VectorLibrary>>(arg->getValue())
|
||||
.Case("Accelerate", VectorLibrary::Accelerate)
|
||||
.Case("LIBMVEC", VectorLibrary::LIBMVEC)
|
||||
.Case("MASSV", VectorLibrary::MASSV)
|
||||
.Case("SVML", VectorLibrary::SVML)
|
||||
.Case("SLEEF", VectorLibrary::SLEEF)
|
||||
.Case("Darwin_libsystem_m", VectorLibrary::Darwin_libsystem_m)
|
||||
.Case("ArmPL", VectorLibrary::ArmPL)
|
||||
.Case("NoLibrary", VectorLibrary::NoLibrary)
|
||||
.Default(std::nullopt);
|
||||
if (!val.has_value()) {
|
||||
diags.Report(clang::diag::err_drv_invalid_value)
|
||||
<< arg->getAsString(args) << arg->getValue();
|
||||
return false;
|
||||
}
|
||||
opts.setVecLib(val.value());
|
||||
return true;
|
||||
}
|
||||
|
||||
// Generate an OptRemark object containing info on if the -Rgroup
|
||||
// specified is enabled or not.
|
||||
static CodeGenOptions::OptRemark
|
||||
@@ -1116,6 +1144,7 @@ bool CompilerInvocation::createFromArgs(
|
||||
parsePreprocessorArgs(res.getPreprocessorOpts(), args);
|
||||
parseCodeGenArgs(res.getCodeGenOpts(), args, diags);
|
||||
success &= parseDebugArgs(res.getCodeGenOpts(), args, diags);
|
||||
success &= parseVectorLibArg(res.getCodeGenOpts(), args, diags);
|
||||
success &= parseSemaArgs(res, args, diags);
|
||||
success &= parseDialectArgs(res, args, diags);
|
||||
success &= parseDiagArgs(res, args, diags);
|
||||
|
||||
@@ -850,11 +850,13 @@ getOutputStream(CompilerInstance &ci, llvm::StringRef inFile,
|
||||
/// \param [in] tm Target machine to aid the code-gen pipeline set-up
|
||||
/// \param [in] act Backend act to run (assembly vs machine-code generation)
|
||||
/// \param [in] llvmModule LLVM module to lower to assembly/machine-code
|
||||
/// \param [in] codeGenOpts options configuring codegen pipeline
|
||||
/// \param [out] os Output stream to emit the generated code to
|
||||
static void generateMachineCodeOrAssemblyImpl(clang::DiagnosticsEngine &diags,
|
||||
llvm::TargetMachine &tm,
|
||||
BackendActionTy act,
|
||||
llvm::Module &llvmModule,
|
||||
const CodeGenOptions &codeGenOpts,
|
||||
llvm::raw_pwrite_stream &os) {
|
||||
assert(((act == BackendActionTy::Backend_EmitObj) ||
|
||||
(act == BackendActionTy::Backend_EmitAssembly)) &&
|
||||
@@ -868,9 +870,8 @@ static void generateMachineCodeOrAssemblyImpl(clang::DiagnosticsEngine &diags,
|
||||
createTargetTransformInfoWrapperPass(tm.getTargetIRAnalysis()));
|
||||
|
||||
llvm::Triple triple(llvmModule.getTargetTriple());
|
||||
std::unique_ptr<llvm::TargetLibraryInfoImpl> tlii =
|
||||
std::make_unique<llvm::TargetLibraryInfoImpl>(triple);
|
||||
assert(tlii && "Failed to create TargetLibraryInfo");
|
||||
llvm::TargetLibraryInfoImpl *tlii =
|
||||
llvm::driver::createTLII(triple, codeGenOpts.getVecLib());
|
||||
codeGenPasses.add(new llvm::TargetLibraryInfoWrapperPass(*tlii));
|
||||
|
||||
llvm::CodeGenFileType cgft = (act == BackendActionTy::Backend_EmitAssembly)
|
||||
@@ -923,6 +924,13 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
|
||||
get##Ext##PluginInfo().RegisterPassBuilderCallbacks(pb);
|
||||
#include "llvm/Support/Extension.def"
|
||||
|
||||
// Register the target library analysis directly and give it a customized
|
||||
// preset TLI depending on -fveclib
|
||||
llvm::Triple triple(llvmModule->getTargetTriple());
|
||||
llvm::TargetLibraryInfoImpl *tlii =
|
||||
llvm::driver::createTLII(triple, opts.getVecLib());
|
||||
fam.registerPass([&] { return llvm::TargetLibraryAnalysis(*tlii); });
|
||||
|
||||
// Register all the basic analyses with the managers.
|
||||
pb.registerModuleAnalyses(mam);
|
||||
pb.registerCGSCCAnalyses(cgam);
|
||||
@@ -1227,7 +1235,7 @@ void CodeGenAction::executeAction() {
|
||||
if (action == BackendActionTy::Backend_EmitAssembly ||
|
||||
action == BackendActionTy::Backend_EmitObj) {
|
||||
generateMachineCodeOrAssemblyImpl(
|
||||
diags, *tm, action, *llvmModule,
|
||||
diags, *tm, action, *llvmModule, codeGenOpts,
|
||||
ci.isOutputStreamNull() ? *os : ci.getOutputStream());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
! CHECK-NEXT: -fstack-arrays Attempt to allocate array temporaries on the stack, no matter their size
|
||||
! CHECK-NEXT: -fsyntax-only Run the preprocessor, parser and semantic analysis stages
|
||||
! CHECK-NEXT: -funderscoring Appends one trailing underscore to external names
|
||||
! CHECK-NEXT: -fveclib=<value> Use the given vector functions library
|
||||
! CHECK-NEXT: -fversion-loops-for-stride
|
||||
! CHECK-NEXT: Create unit-strided versions of loops
|
||||
! CHECK-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV.
|
||||
|
||||
@@ -88,6 +88,7 @@
|
||||
! HELP-NEXT: -fstack-arrays Attempt to allocate array temporaries on the stack, no matter their size
|
||||
! HELP-NEXT: -fsyntax-only Run the preprocessor, parser and semantic analysis stages
|
||||
! HELP-NEXT: -funderscoring Appends one trailing underscore to external names
|
||||
! HELP-NEXT: -fveclib=<value> Use the given vector functions library
|
||||
! HELP-NEXT: -fversion-loops-for-stride
|
||||
! HELP-NEXT: Create unit-strided versions of loops
|
||||
! HELP-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV.
|
||||
@@ -222,6 +223,7 @@
|
||||
! HELP-FC1-NEXT: -fstack-arrays Attempt to allocate array temporaries on the stack, no matter their size
|
||||
! HELP-FC1-NEXT: -fsyntax-only Run the preprocessor, parser and semantic analysis stages
|
||||
! HELP-FC1-NEXT: -funderscoring Appends one trailing underscore to external names
|
||||
! HELP-FC1-NEXT: -fveclib=<value> Use the given vector functions library
|
||||
! HELP-FC1-NEXT: -fversion-loops-for-stride
|
||||
! HELP-FC1-NEXT: Create unit-strided versions of loops
|
||||
! HELP-FC1-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV.
|
||||
|
||||
15
flang/test/Driver/fveclib-codegen.f90
Normal file
15
flang/test/Driver/fveclib-codegen.f90
Normal file
@@ -0,0 +1,15 @@
|
||||
! test that -fveclib= is passed to the backend
|
||||
! -target aarch64 so that ArmPL is available
|
||||
! RUN: %flang -S -Ofast -fveclib=LIBMVEC -o - %s | FileCheck %s
|
||||
! RUN: %flang -S -Ofast -fveclib=NoLibrary -o - %s | FileCheck %s --check-prefix=NOLIB
|
||||
|
||||
subroutine sb(a, b)
|
||||
real :: a(:), b(:)
|
||||
integer :: i
|
||||
do i=1,100
|
||||
! check that we used a vectorized call to powf()
|
||||
! CHECK: _ZGVbN4vv_powf
|
||||
! NOLIB: powf
|
||||
a(i) = a(i) ** b(i)
|
||||
end do
|
||||
end subroutine
|
||||
30
flang/test/Driver/fveclib.f90
Normal file
30
flang/test/Driver/fveclib.f90
Normal file
@@ -0,0 +1,30 @@
|
||||
! RUN: %flang -### -c -fveclib=none %s 2>&1 | FileCheck -check-prefix CHECK-NOLIB %s
|
||||
! RUN: %flang -### -c -fveclib=Accelerate %s 2>&1 | FileCheck -check-prefix CHECK-ACCELERATE %s
|
||||
! RUN: %flang -### -c -fveclib=libmvec %s 2>&1 | FileCheck -check-prefix CHECK-libmvec %s
|
||||
! RUN: %flang -### -c -fveclib=MASSV %s 2>&1 | FileCheck -check-prefix CHECK-MASSV %s
|
||||
! RUN: %flang -### -c -fveclib=Darwin_libsystem_m %s 2>&1 | FileCheck -check-prefix CHECK-DARWIN_LIBSYSTEM_M %s
|
||||
! RUN: %flang -### -c --target=aarch64-none-none -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-SLEEF %s
|
||||
! RUN: %flang -### -c --target=aarch64-none-none -fveclib=ArmPL %s 2>&1 | FileCheck -check-prefix CHECK-ARMPL %s
|
||||
! RUN: not %flang -c -fveclib=something %s 2>&1 | FileCheck -check-prefix CHECK-INVALID %s
|
||||
|
||||
! CHECK-NOLIB: "-fveclib=none"
|
||||
! CHECK-ACCELERATE: "-fveclib=Accelerate"
|
||||
! CHECK-libmvec: "-fveclib=libmvec"
|
||||
! CHECK-MASSV: "-fveclib=MASSV"
|
||||
! CHECK-DARWIN_LIBSYSTEM_M: "-fveclib=Darwin_libsystem_m"
|
||||
! CHECK-SLEEF: "-fveclib=SLEEF"
|
||||
! CHECK-ARMPL: "-fveclib=ArmPL"
|
||||
|
||||
! CHECK-INVALID: error: invalid value 'something' in '-fveclib=something'
|
||||
|
||||
! RUN: not %flang --target=x86-none-none -c -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
|
||||
! RUN: not %flang --target=x86-none-none -c -fveclib=ArmPL %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
|
||||
! RUN: not %flang --target=aarch64-none-none -c -fveclib=LIBMVEC-X86 %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
|
||||
! RUN: not %flang --target=aarch64-none-none -c -fveclib=SVML %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
|
||||
! CHECK-ERROR: unsupported option {{.*}} for target
|
||||
|
||||
! RUN: %flang -fveclib=Accelerate %s -target arm64-apple-ios8.0.0 -### 2>&1 | FileCheck --check-prefix=CHECK-LINK %s
|
||||
! CHECK-LINK: "-framework" "Accelerate"
|
||||
|
||||
! TODO: if we add support for -nostdlib or -nodefaultlibs we need to test that
|
||||
! these prevent "-framework Accelerate" being added on Darwin
|
||||
40
llvm/include/llvm/Frontend/Driver/CodeGenOptions.h
Normal file
40
llvm/include/llvm/Frontend/Driver/CodeGenOptions.h
Normal file
@@ -0,0 +1,40 @@
|
||||
//===--- CodeGenOptions.h ---------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines frontend codegen options common to clang and flang
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_FRONTEND_DRIVER_CODEGENOPTIONS_H
|
||||
#define LLVM_FRONTEND_DRIVER_CODEGENOPTIONS_H
|
||||
|
||||
namespace llvm {
|
||||
class Triple;
|
||||
class TargetLibraryInfoImpl;
|
||||
} // namespace llvm
|
||||
|
||||
namespace llvm::driver {
|
||||
|
||||
/// Vector library option used with -fveclib=
|
||||
enum class VectorLibrary {
|
||||
NoLibrary, // Don't use any vector library.
|
||||
Accelerate, // Use the Accelerate framework.
|
||||
LIBMVEC, // GLIBC vector math library.
|
||||
MASSV, // IBM MASS vector library.
|
||||
SVML, // Intel short vector math library.
|
||||
SLEEF, // SLEEF SIMD Library for Evaluating Elementary Functions.
|
||||
Darwin_libsystem_m, // Use Darwin's libsystem_m vector functions.
|
||||
ArmPL // Arm Performance Libraries.
|
||||
};
|
||||
|
||||
TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple,
|
||||
VectorLibrary Veclib);
|
||||
|
||||
} // end namespace llvm::driver
|
||||
|
||||
#endif
|
||||
@@ -1,3 +1,4 @@
|
||||
add_subdirectory(Driver)
|
||||
add_subdirectory(HLSL)
|
||||
add_subdirectory(OpenACC)
|
||||
add_subdirectory(OpenMP)
|
||||
|
||||
15
llvm/lib/Frontend/Driver/CMakeLists.txt
Normal file
15
llvm/lib/Frontend/Driver/CMakeLists.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
add_llvm_component_library(LLVMFrontendDriver
|
||||
CodeGenOptions.cpp
|
||||
|
||||
ADDITIONAL_HEADER_DIRS
|
||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend/Driver
|
||||
|
||||
DEPENDS
|
||||
LLVMAnalysis
|
||||
LLVMTargetParser
|
||||
|
||||
LINK_COMPONENTS
|
||||
Core
|
||||
Support
|
||||
Analysis
|
||||
)
|
||||
55
llvm/lib/Frontend/Driver/CodeGenOptions.cpp
Normal file
55
llvm/lib/Frontend/Driver/CodeGenOptions.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
//===--- CodeGenOptions.cpp - Shared codegen option handling --------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Frontend/Driver/CodeGenOptions.h"
|
||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||
#include "llvm/TargetParser/Triple.h"
|
||||
|
||||
namespace llvm::driver {
|
||||
|
||||
TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple,
|
||||
driver::VectorLibrary Veclib) {
|
||||
TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple);
|
||||
|
||||
using VectorLibrary = llvm::driver::VectorLibrary;
|
||||
switch (Veclib) {
|
||||
case VectorLibrary::Accelerate:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate,
|
||||
TargetTriple);
|
||||
break;
|
||||
case VectorLibrary::LIBMVEC:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::LIBMVEC_X86,
|
||||
TargetTriple);
|
||||
break;
|
||||
case VectorLibrary::MASSV:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::MASSV,
|
||||
TargetTriple);
|
||||
break;
|
||||
case VectorLibrary::SVML:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML,
|
||||
TargetTriple);
|
||||
break;
|
||||
case VectorLibrary::SLEEF:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SLEEFGNUABI,
|
||||
TargetTriple);
|
||||
break;
|
||||
case VectorLibrary::Darwin_libsystem_m:
|
||||
TLII->addVectorizableFunctionsFromVecLib(
|
||||
TargetLibraryInfoImpl::DarwinLibSystemM, TargetTriple);
|
||||
break;
|
||||
case VectorLibrary::ArmPL:
|
||||
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::ArmPL,
|
||||
TargetTriple);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TLII;
|
||||
}
|
||||
|
||||
} // namespace llvm::driver
|
||||
Reference in New Issue
Block a user