Skip to content

Commit bdecf07

Browse files
committed
1 parent 546a783 commit bdecf07

File tree

4 files changed

+59
-0
lines changed

4 files changed

+59
-0
lines changed

clang/include/clang/Basic/DiagnosticDriverKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ def err_drv_amdgpu_ieee_without_no_honor_nans : Error<
207207
"invalid argument '-mno-amdgpu-ieee' only allowed with relaxed NaN handling">;
208208
def err_drv_argument_not_allowed_with : Error<
209209
"invalid argument '%0' not allowed with '%1'">;
210+
def warn_drv_argument_not_allowed_with : Warning<
211+
"invalid argument '%0' not allowed with '%1'">,
212+
InGroup<OptionIgnored>;
210213
def err_drv_cannot_open_randomize_layout_seed_file : Error<
211214
"cannot read randomize layout seed file '%0'">;
212215
def err_drv_invalid_version_number : Error<

clang/include/clang/Driver/Options.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9218,6 +9218,10 @@ def : CLFlag<"Qscatter-">, Alias<mno_scatter>,
92189218

92199219
def _SLASH_arch : CLCompileJoined<"arch:">,
92209220
HelpText<"Set architecture for code generation">;
9221+
def _SLASH_vlen : CLCompileJoined<"vlen">,
9222+
HelpText<"Set vector length for autovectorization and other optimizations">;
9223+
def _SLASH_vlen_default : CLFlag<"vlen">,
9224+
HelpText<"Set default vector length for autovectorization and other optimizations">;
92219225

92229226
def _SLASH_M_Group : OptionGroup<"</M group>">, Group<cl_compile_Group>;
92239227
def _SLASH_volatile_Group : OptionGroup<"</volatile group>">,

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8266,6 +8266,37 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
82668266
<< "/kernel";
82678267
}
82688268

8269+
if (Args.hasArg(options::OPT__SLASH_vlen_default)) {
8270+
// Override /vlen= options.
8271+
for (const Arg *A : Args.filtered(options::OPT__SLASH_vlen))
8272+
A->claim();
8273+
// Nothing to do for AVX512F/AVX512.
8274+
} else if (const Arg *A = Args.getLastArg(options::OPT__SLASH_vlen)) {
8275+
StringRef VLen = A->getValue();
8276+
llvm::SmallSet<std::string, 4> Arch512 = {"AVX512F", "AVX512"};
8277+
llvm::SmallSet<std::string, 4> Arch256 = {"AVX", "AVX2"};
8278+
8279+
StringRef Arch = Args.getLastArgValue(options::OPT__SLASH_arch);
8280+
if (Arch != "") {
8281+
if (VLen == "=512") {
8282+
if (Arch512.contains(Arch.str()))
8283+
CmdArgs.push_back("-mprefer-vector-width=512");
8284+
else
8285+
D.Diag(diag::warn_drv_argument_not_allowed_with)
8286+
<< "/vlen=512" << std::string("/arch:").append(Arch);
8287+
} else if (VLen == "=256") {
8288+
if (Arch512.contains(Arch.str()))
8289+
CmdArgs.push_back("-mprefer-vector-width=256");
8290+
else if (!Arch256.contains(Arch.str()))
8291+
D.Diag(diag::warn_drv_argument_not_allowed_with)
8292+
<< "/vlen=256" << std::string("/arch:").append(Arch);
8293+
} else {
8294+
D.Diag(diag::warn_drv_unknown_argument_clang_cl)
8295+
<< std::string("/vlen").append(VLen);
8296+
}
8297+
}
8298+
}
8299+
82698300
Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
82708301
Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
82718302
if (MostGeneralArg && BestCaseArg)

clang/test/Driver/cl-x86-flags.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,27 @@
133133
// tune: "-target-cpu" "sandybridge"
134134
// tune-SAME: "-tune-cpu" "haswell"
135135

136+
// RUN: %clang_cl -m64 -arch:AVX512 -vlen=512 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen512 %s
137+
// vlen512: "-mprefer-vector-width=512"
138+
139+
// RUN: %clang_cl -m64 -arch:AVX512 -vlen=256 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s
140+
// vlen256: "-mprefer-vector-width=256"
141+
142+
// RUN: %clang_cl -m64 -arch:AVX512 -vlen=512 -vlen --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=noprefer %s
143+
// noprefer-NOT: -mprefer-vector-width
144+
145+
// RUN: %clang_cl -m64 -arch:AVX2 -vlen=512 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx2vlen512 %s
146+
// avx2vlen512: invalid argument '/vlen=512' not allowed with '/arch:AVX2'
147+
148+
// RUN: %clang_cl -m64 -arch:AVX2 -vlen=256 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx2vlen256 %s
149+
// avx2vlen256-NOT: invalid argument
150+
151+
// RUN: %clang_cl -m32 -arch:SSE2 -vlen=256 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=sse2vlen256 %s
152+
// sse2vlen256: invalid argument '/vlen=256' not allowed with '/arch:SSE2'
153+
154+
// RUN: %clang_cl -m64 -arch:AVX -vlen256 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avxvlen256 %s
155+
// avxvlen256: unknown argument ignored in clang-cl: '/vlen256'
156+
136157
void f(void) {
137158
}
138159

0 commit comments

Comments
 (0)