Skip to content

Commit a207e63

Browse files
authored
[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.
1 parent 4cc791b commit a207e63

File tree

20 files changed

+248
-62
lines changed

20 files changed

+248
-62
lines changed

clang/include/clang/Basic/CodeGenOptions.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NormalInlining)
426426
VALUE_CODEGENOPT(InlineMaxStackSize, 32, UINT_MAX)
427427

428428
// Vector functions library to use.
429-
ENUM_CODEGENOPT(VecLib, VectorLibrary, 3, NoLibrary)
429+
ENUM_CODEGENOPT(VecLib, llvm::driver::VectorLibrary, 3, llvm::driver::VectorLibrary::NoLibrary)
430430

431431
/// The default TLS model to use.
432432
ENUM_CODEGENOPT(DefaultTLSModel, TLSModel, 2, GeneralDynamicTLSModel)

clang/include/clang/Basic/CodeGenOptions.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "clang/Basic/XRayInstr.h"
1818
#include "llvm/ADT/FloatingPointMode.h"
1919
#include "llvm/Frontend/Debug/Options.h"
20+
#include "llvm/Frontend/Driver/CodeGenOptions.h"
2021
#include "llvm/Support/CodeGen.h"
2122
#include "llvm/Support/Regex.h"
2223
#include "llvm/Target/TargetOptions.h"
@@ -58,17 +59,6 @@ class CodeGenOptions : public CodeGenOptionsBase {
5859
OnlyAlwaysInlining // Only run the always inlining pass.
5960
};
6061

61-
enum VectorLibrary {
62-
NoLibrary, // Don't use any vector library.
63-
Accelerate, // Use the Accelerate framework.
64-
LIBMVEC, // GLIBC vector math library.
65-
MASSV, // IBM MASS vector library.
66-
SVML, // Intel short vector math library.
67-
SLEEF, // SLEEF SIMD Library for Evaluating Elementary Functions.
68-
Darwin_libsystem_m, // Use Darwin's libsytem_m vector functions.
69-
ArmPL // Arm Performance Libraries.
70-
};
71-
7262
enum ObjCDispatchMethodKind {
7363
Legacy = 0,
7464
NonLegacy = 1,

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3126,10 +3126,10 @@ def fno_global_isel : Flag<["-"], "fno-global-isel">, Group<f_clang_Group>,
31263126
def fno_experimental_isel : Flag<["-"], "fno-experimental-isel">, Group<f_clang_Group>,
31273127
Alias<fno_global_isel>;
31283128
def fveclib : Joined<["-"], "fveclib=">, Group<f_Group>,
3129-
Visibility<[ClangOption, CC1Option]>,
3129+
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
31303130
HelpText<"Use the given vector functions library">,
31313131
Values<"Accelerate,libmvec,MASSV,SVML,SLEEF,Darwin_libsystem_m,ArmPL,none">,
3132-
NormalizedValuesScope<"CodeGenOptions">,
3132+
NormalizedValuesScope<"llvm::driver::VectorLibrary">,
31333133
NormalizedValues<["Accelerate", "LIBMVEC", "MASSV", "SVML", "SLEEF",
31343134
"Darwin_libsystem_m", "ArmPL", "NoLibrary"]>,
31353135
MarshallingInfoEnum<CodeGenOpts<"VecLib">, "NoLibrary">;

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "llvm/CodeGen/RegAllocRegistry.h"
3030
#include "llvm/CodeGen/SchedulerRegistry.h"
3131
#include "llvm/CodeGen/TargetSubtargetInfo.h"
32+
#include "llvm/Frontend/Driver/CodeGenOptions.h"
3233
#include "llvm/IR/DataLayout.h"
3334
#include "llvm/IR/DebugInfo.h"
3435
#include "llvm/IR/LegacyPassManager.h"
@@ -264,45 +265,6 @@ static bool asanUseGlobalsGC(const Triple &T, const CodeGenOptions &CGOpts) {
264265
return false;
265266
}
266267

267-
static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple,
268-
const CodeGenOptions &CodeGenOpts) {
269-
TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple);
270-
271-
switch (CodeGenOpts.getVecLib()) {
272-
case CodeGenOptions::Accelerate:
273-
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate,
274-
TargetTriple);
275-
break;
276-
case CodeGenOptions::LIBMVEC:
277-
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::LIBMVEC_X86,
278-
TargetTriple);
279-
break;
280-
case CodeGenOptions::MASSV:
281-
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::MASSV,
282-
TargetTriple);
283-
break;
284-
case CodeGenOptions::SVML:
285-
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML,
286-
TargetTriple);
287-
break;
288-
case CodeGenOptions::SLEEF:
289-
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SLEEFGNUABI,
290-
TargetTriple);
291-
break;
292-
case CodeGenOptions::Darwin_libsystem_m:
293-
TLII->addVectorizableFunctionsFromVecLib(
294-
TargetLibraryInfoImpl::DarwinLibSystemM, TargetTriple);
295-
break;
296-
case CodeGenOptions::ArmPL:
297-
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::ArmPL,
298-
TargetTriple);
299-
break;
300-
default:
301-
break;
302-
}
303-
return TLII;
304-
}
305-
306268
static std::optional<llvm::CodeModel::Model>
307269
getCodeModel(const CodeGenOptions &CodeGenOpts) {
308270
unsigned CodeModel = llvm::StringSwitch<unsigned>(CodeGenOpts.CodeModel)
@@ -590,7 +552,7 @@ bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses,
590552
raw_pwrite_stream *DwoOS) {
591553
// Add LibraryInfo.
592554
std::unique_ptr<TargetLibraryInfoImpl> TLII(
593-
createTLII(TargetTriple, CodeGenOpts));
555+
llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
594556
CodeGenPasses.add(new TargetLibraryInfoWrapperPass(*TLII));
595557

596558
// Normal mode, emit a .s or .o file by running the code generator. Note,
@@ -923,7 +885,7 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
923885
// Register the target library analysis directly and give it a customized
924886
// preset TLI.
925887
std::unique_ptr<TargetLibraryInfoImpl> TLII(
926-
createTLII(TargetTriple, CodeGenOpts));
888+
llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
927889
FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); });
928890

929891
// Register all the basic analyses with the managers.

clang/lib/CodeGen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ set(LLVM_LINK_COMPONENTS
99
Coverage
1010
Demangle
1111
Extensions
12+
FrontendDriver
1213
FrontendHLSL
1314
FrontendOpenMP
1415
FrontendOffloading

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,40 @@ void Flang::addTargetOptions(const ArgList &Args,
233233
break;
234234
}
235235

236+
if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
237+
StringRef Name = A->getValue();
238+
if (Name == "SVML") {
239+
if (Triple.getArch() != llvm::Triple::x86 &&
240+
Triple.getArch() != llvm::Triple::x86_64)
241+
D.Diag(diag::err_drv_unsupported_opt_for_target)
242+
<< Name << Triple.getArchName();
243+
} else if (Name == "LIBMVEC-X86") {
244+
if (Triple.getArch() != llvm::Triple::x86 &&
245+
Triple.getArch() != llvm::Triple::x86_64)
246+
D.Diag(diag::err_drv_unsupported_opt_for_target)
247+
<< Name << Triple.getArchName();
248+
} else if (Name == "SLEEF" || Name == "ArmPL") {
249+
if (Triple.getArch() != llvm::Triple::aarch64 &&
250+
Triple.getArch() != llvm::Triple::aarch64_be)
251+
D.Diag(diag::err_drv_unsupported_opt_for_target)
252+
<< Name << Triple.getArchName();
253+
}
254+
255+
if (Triple.isOSDarwin()) {
256+
// flang doesn't currently suport nostdlib, nodefaultlibs. Adding these
257+
// here incase they are added someday
258+
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
259+
if (A->getValue() == StringRef{"Accelerate"}) {
260+
CmdArgs.push_back("-framework");
261+
CmdArgs.push_back("Accelerate");
262+
A->render(Args, CmdArgs);
263+
}
264+
}
265+
} else {
266+
A->render(Args, CmdArgs);
267+
}
268+
}
269+
236270
// TODO: Add target specific flags, ABI, mtune option etc.
237271
}
238272

clang/lib/Tooling/DumpTool/ClangSrcLocDump.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ int main(int argc, const char **argv) {
111111

112112
auto Files = llvm::makeIntrusiveRefCnt<FileManager>(FileSystemOptions(), OFS);
113113

114-
auto Driver = std::make_unique<driver::Driver>(
114+
auto Driver = std::make_unique<clang::driver::Driver>(
115115
"clang", llvm::sys::getDefaultTargetTriple(), Diagnostics,
116116
"ast-api-dump-tool", OFS);
117117

@@ -121,14 +121,14 @@ int main(int argc, const char **argv) {
121121
return 1;
122122

123123
const auto &Jobs = Comp->getJobs();
124-
if (Jobs.size() != 1 || !isa<driver::Command>(*Jobs.begin())) {
124+
if (Jobs.size() != 1 || !isa<clang::driver::Command>(*Jobs.begin())) {
125125
SmallString<256> error_msg;
126126
llvm::raw_svector_ostream error_stream(error_msg);
127127
Jobs.Print(error_stream, "; ", true);
128128
return 1;
129129
}
130130

131-
const auto &Cmd = cast<driver::Command>(*Jobs.begin());
131+
const auto &Cmd = cast<clang::driver::Command>(*Jobs.begin());
132132
const llvm::opt::ArgStringList &CC1Args = Cmd.getArguments();
133133

134134
auto Invocation = std::make_unique<CompilerInvocation>();

flang/include/flang/Frontend/CodeGenOptions.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ CODEGENOPT(AliasAnalysis, 1, 0) ///< Enable alias analysis pass
3737
CODEGENOPT(Underscoring, 1, 1)
3838
ENUM_CODEGENOPT(RelocationModel, llvm::Reloc::Model, 3, llvm::Reloc::PIC_) ///< Name of the relocation model to use.
3939
ENUM_CODEGENOPT(DebugInfo, llvm::codegenoptions::DebugInfoKind, 4, llvm::codegenoptions::NoDebugInfo) ///< Level of debug info to generate
40+
ENUM_CODEGENOPT(VecLib, llvm::driver::VectorLibrary, 3, llvm::driver::VectorLibrary::NoLibrary) ///< Vector functions library to use
4041

4142
#undef CODEGENOPT
4243
#undef ENUM_CODEGENOPT

flang/include/flang/Frontend/CodeGenOptions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define LLVM_CLANG_BASIC_CODEGENOPTIONS_H
1717

1818
#include "llvm/Frontend/Debug/Options.h"
19+
#include "llvm/Frontend/Driver/CodeGenOptions.h"
1920
#include "llvm/Support/CodeGen.h"
2021
#include "llvm/Support/Regex.h"
2122
#include "llvm/Target/TargetOptions.h"

flang/lib/Frontend/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ add_flang_library(flangFrontend
5252
Support
5353
Target
5454
TargetParser
55+
FrontendDriver
5556
FrontendOpenACC
5657
FrontendOpenMP
5758

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,34 @@ static bool parseDebugArgs(Fortran::frontend::CodeGenOptions &opts,
153153
return true;
154154
}
155155

156+
static bool parseVectorLibArg(Fortran::frontend::CodeGenOptions &opts,
157+
llvm::opt::ArgList &args,
158+
clang::DiagnosticsEngine &diags) {
159+
llvm::opt::Arg *arg = args.getLastArg(clang::driver::options::OPT_fveclib);
160+
if (!arg)
161+
return true;
162+
163+
using VectorLibrary = llvm::driver::VectorLibrary;
164+
std::optional<VectorLibrary> val =
165+
llvm::StringSwitch<std::optional<VectorLibrary>>(arg->getValue())
166+
.Case("Accelerate", VectorLibrary::Accelerate)
167+
.Case("LIBMVEC", VectorLibrary::LIBMVEC)
168+
.Case("MASSV", VectorLibrary::MASSV)
169+
.Case("SVML", VectorLibrary::SVML)
170+
.Case("SLEEF", VectorLibrary::SLEEF)
171+
.Case("Darwin_libsystem_m", VectorLibrary::Darwin_libsystem_m)
172+
.Case("ArmPL", VectorLibrary::ArmPL)
173+
.Case("NoLibrary", VectorLibrary::NoLibrary)
174+
.Default(std::nullopt);
175+
if (!val.has_value()) {
176+
diags.Report(clang::diag::err_drv_invalid_value)
177+
<< arg->getAsString(args) << arg->getValue();
178+
return false;
179+
}
180+
opts.setVecLib(val.value());
181+
return true;
182+
}
183+
156184
// Generate an OptRemark object containing info on if the -Rgroup
157185
// specified is enabled or not.
158186
static CodeGenOptions::OptRemark
@@ -1116,6 +1144,7 @@ bool CompilerInvocation::createFromArgs(
11161144
parsePreprocessorArgs(res.getPreprocessorOpts(), args);
11171145
parseCodeGenArgs(res.getCodeGenOpts(), args, diags);
11181146
success &= parseDebugArgs(res.getCodeGenOpts(), args, diags);
1147+
success &= parseVectorLibArg(res.getCodeGenOpts(), args, diags);
11191148
success &= parseSemaArgs(res, args, diags);
11201149
success &= parseDialectArgs(res, args, diags);
11211150
success &= parseDiagArgs(res, args, diags);

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -850,11 +850,13 @@ getOutputStream(CompilerInstance &ci, llvm::StringRef inFile,
850850
/// \param [in] tm Target machine to aid the code-gen pipeline set-up
851851
/// \param [in] act Backend act to run (assembly vs machine-code generation)
852852
/// \param [in] llvmModule LLVM module to lower to assembly/machine-code
853+
/// \param [in] codeGenOpts options configuring codegen pipeline
853854
/// \param [out] os Output stream to emit the generated code to
854855
static void generateMachineCodeOrAssemblyImpl(clang::DiagnosticsEngine &diags,
855856
llvm::TargetMachine &tm,
856857
BackendActionTy act,
857858
llvm::Module &llvmModule,
859+
const CodeGenOptions &codeGenOpts,
858860
llvm::raw_pwrite_stream &os) {
859861
assert(((act == BackendActionTy::Backend_EmitObj) ||
860862
(act == BackendActionTy::Backend_EmitAssembly)) &&
@@ -868,9 +870,8 @@ static void generateMachineCodeOrAssemblyImpl(clang::DiagnosticsEngine &diags,
868870
createTargetTransformInfoWrapperPass(tm.getTargetIRAnalysis()));
869871

870872
llvm::Triple triple(llvmModule.getTargetTriple());
871-
std::unique_ptr<llvm::TargetLibraryInfoImpl> tlii =
872-
std::make_unique<llvm::TargetLibraryInfoImpl>(triple);
873-
assert(tlii && "Failed to create TargetLibraryInfo");
873+
llvm::TargetLibraryInfoImpl *tlii =
874+
llvm::driver::createTLII(triple, codeGenOpts.getVecLib());
874875
codeGenPasses.add(new llvm::TargetLibraryInfoWrapperPass(*tlii));
875876

876877
llvm::CodeGenFileType cgft = (act == BackendActionTy::Backend_EmitAssembly)
@@ -923,6 +924,13 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
923924
get##Ext##PluginInfo().RegisterPassBuilderCallbacks(pb);
924925
#include "llvm/Support/Extension.def"
925926

927+
// Register the target library analysis directly and give it a customized
928+
// preset TLI depending on -fveclib
929+
llvm::Triple triple(llvmModule->getTargetTriple());
930+
llvm::TargetLibraryInfoImpl *tlii =
931+
llvm::driver::createTLII(triple, opts.getVecLib());
932+
fam.registerPass([&] { return llvm::TargetLibraryAnalysis(*tlii); });
933+
926934
// Register all the basic analyses with the managers.
927935
pb.registerModuleAnalyses(mam);
928936
pb.registerCGSCCAnalyses(cgam);
@@ -1227,7 +1235,7 @@ void CodeGenAction::executeAction() {
12271235
if (action == BackendActionTy::Backend_EmitAssembly ||
12281236
action == BackendActionTy::Backend_EmitObj) {
12291237
generateMachineCodeOrAssemblyImpl(
1230-
diags, *tm, action, *llvmModule,
1238+
diags, *tm, action, *llvmModule, codeGenOpts,
12311239
ci.isOutputStreamNull() ? *os : ci.getOutputStream());
12321240
return;
12331241
}

flang/test/Driver/driver-help-hidden.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
! CHECK-NEXT: -fstack-arrays Attempt to allocate array temporaries on the stack, no matter their size
103103
! CHECK-NEXT: -fsyntax-only Run the preprocessor, parser and semantic analysis stages
104104
! CHECK-NEXT: -funderscoring Appends one trailing underscore to external names
105+
! CHECK-NEXT: -fveclib=<value> Use the given vector functions library
105106
! CHECK-NEXT: -fversion-loops-for-stride
106107
! CHECK-NEXT: Create unit-strided versions of loops
107108
! CHECK-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV.

flang/test/Driver/driver-help.f90

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
! HELP-NEXT: -fstack-arrays Attempt to allocate array temporaries on the stack, no matter their size
8989
! HELP-NEXT: -fsyntax-only Run the preprocessor, parser and semantic analysis stages
9090
! HELP-NEXT: -funderscoring Appends one trailing underscore to external names
91+
! HELP-NEXT: -fveclib=<value> Use the given vector functions library
9192
! HELP-NEXT: -fversion-loops-for-stride
9293
! HELP-NEXT: Create unit-strided versions of loops
9394
! HELP-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV.
@@ -222,6 +223,7 @@
222223
! HELP-FC1-NEXT: -fstack-arrays Attempt to allocate array temporaries on the stack, no matter their size
223224
! HELP-FC1-NEXT: -fsyntax-only Run the preprocessor, parser and semantic analysis stages
224225
! HELP-FC1-NEXT: -funderscoring Appends one trailing underscore to external names
226+
! HELP-FC1-NEXT: -fveclib=<value> Use the given vector functions library
225227
! HELP-FC1-NEXT: -fversion-loops-for-stride
226228
! HELP-FC1-NEXT: Create unit-strided versions of loops
227229
! HELP-FC1-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV.

flang/test/Driver/fveclib-codegen.f90

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
! test that -fveclib= is passed to the backend
2+
! -target aarch64 so that ArmPL is available
3+
! RUN: %flang -S -Ofast -fveclib=LIBMVEC -o - %s | FileCheck %s
4+
! RUN: %flang -S -Ofast -fveclib=NoLibrary -o - %s | FileCheck %s --check-prefix=NOLIB
5+
6+
subroutine sb(a, b)
7+
real :: a(:), b(:)
8+
integer :: i
9+
do i=1,100
10+
! check that we used a vectorized call to powf()
11+
! CHECK: _ZGVbN4vv_powf
12+
! NOLIB: powf
13+
a(i) = a(i) ** b(i)
14+
end do
15+
end subroutine

flang/test/Driver/fveclib.f90

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
! RUN: %flang -### -c -fveclib=none %s 2>&1 | FileCheck -check-prefix CHECK-NOLIB %s
2+
! RUN: %flang -### -c -fveclib=Accelerate %s 2>&1 | FileCheck -check-prefix CHECK-ACCELERATE %s
3+
! RUN: %flang -### -c -fveclib=libmvec %s 2>&1 | FileCheck -check-prefix CHECK-libmvec %s
4+
! RUN: %flang -### -c -fveclib=MASSV %s 2>&1 | FileCheck -check-prefix CHECK-MASSV %s
5+
! RUN: %flang -### -c -fveclib=Darwin_libsystem_m %s 2>&1 | FileCheck -check-prefix CHECK-DARWIN_LIBSYSTEM_M %s
6+
! RUN: %flang -### -c --target=aarch64-none-none -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-SLEEF %s
7+
! RUN: %flang -### -c --target=aarch64-none-none -fveclib=ArmPL %s 2>&1 | FileCheck -check-prefix CHECK-ARMPL %s
8+
! RUN: not %flang -c -fveclib=something %s 2>&1 | FileCheck -check-prefix CHECK-INVALID %s
9+
10+
! CHECK-NOLIB: "-fveclib=none"
11+
! CHECK-ACCELERATE: "-fveclib=Accelerate"
12+
! CHECK-libmvec: "-fveclib=libmvec"
13+
! CHECK-MASSV: "-fveclib=MASSV"
14+
! CHECK-DARWIN_LIBSYSTEM_M: "-fveclib=Darwin_libsystem_m"
15+
! CHECK-SLEEF: "-fveclib=SLEEF"
16+
! CHECK-ARMPL: "-fveclib=ArmPL"
17+
18+
! CHECK-INVALID: error: invalid value 'something' in '-fveclib=something'
19+
20+
! RUN: not %flang --target=x86-none-none -c -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
21+
! RUN: not %flang --target=x86-none-none -c -fveclib=ArmPL %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
22+
! RUN: not %flang --target=aarch64-none-none -c -fveclib=LIBMVEC-X86 %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
23+
! RUN: not %flang --target=aarch64-none-none -c -fveclib=SVML %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s
24+
! CHECK-ERROR: unsupported option {{.*}} for target
25+
26+
! RUN: %flang -fveclib=Accelerate %s -target arm64-apple-ios8.0.0 -### 2>&1 | FileCheck --check-prefix=CHECK-LINK %s
27+
! CHECK-LINK: "-framework" "Accelerate"
28+
29+
! TODO: if we add support for -nostdlib or -nodefaultlibs we need to test that
30+
! these prevent "-framework Accelerate" being added on Darwin

0 commit comments

Comments
 (0)