Skip to content

Commit 63f3e57

Browse files
committed
Transfer opt level to clang target options
1 parent 97aba91 commit 63f3e57

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

clang/lib/Driver/ToolChains/Cuda.cpp

+30-6
Original file line numberDiff line numberDiff line change
@@ -517,8 +517,9 @@ void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
517517

518518
static bool shouldIncludePTX(const ArgList &Args, StringRef InputArch) {
519519
// The new driver does not include PTX by default to avoid overhead.
520-
bool includePTX = !Args.hasFlag(options::OPT_offload_new_driver,
521-
options::OPT_no_offload_new_driver, false); // INTEL
520+
bool includePTX =
521+
!Args.hasFlag(options::OPT_offload_new_driver,
522+
options::OPT_no_offload_new_driver, false); // INTEL
522523
for (Arg *A : Args.filtered(options::OPT_cuda_include_ptx_EQ,
523524
options::OPT_no_cuda_include_ptx_EQ)) {
524525
A->claim();
@@ -614,8 +615,7 @@ void NVPTX::OpenMPLinker::ConstructJob(Compilation &C, const JobAction &JA,
614615
if (Args.hasArg(options::OPT_v))
615616
CmdArgs.push_back("-v");
616617

617-
StringRef GPUArch =
618-
Args.getLastArgValue(options::OPT_march_EQ);
618+
StringRef GPUArch = Args.getLastArgValue(options::OPT_march_EQ);
619619
assert(!GPUArch.empty() && "At least one GPU Arch required for ptxas.");
620620

621621
CmdArgs.push_back("-arch");
@@ -948,7 +948,8 @@ void CudaToolChain::addClangTargetOptions(
948948
assert((DeviceOffloadingKind == Action::OFK_OpenMP ||
949949
DeviceOffloadingKind == Action::OFK_SYCL ||
950950
DeviceOffloadingKind == Action::OFK_Cuda) &&
951-
"Only OpenMP, SYCL or CUDA offloading kinds are supported for NVIDIA GPUs.");
951+
"Only OpenMP, SYCL or CUDA offloading kinds are supported for NVIDIA "
952+
"GPUs.");
952953

953954
// If we are compiling SYCL kernels for Nvidia GPUs, we do not support Cuda
954955
// device code compatability, hence we do not set Cuda mode in that instance.
@@ -984,14 +985,37 @@ void CudaToolChain::addClangTargetOptions(
984985
CC1Args.append({"-std=c++17", "-fsycl-is-host"});
985986
}
986987

988+
StringRef OOpt = "3";
989+
if (Arg *A = DriverArgs.getLastArg(options::OPT_O_Group)) {
990+
if (A->getOption().matches(options::OPT_O4) ||
991+
A->getOption().matches(options::OPT_Ofast))
992+
OOpt = "3";
993+
else if (A->getOption().matches(options::OPT_O0))
994+
OOpt = "0";
995+
else if (A->getOption().matches(options::OPT_O)) {
996+
// -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
997+
OOpt = llvm::StringSwitch<const char *>(A->getValue())
998+
.Case("1", "1")
999+
.Case("2", "2")
1000+
.Case("3", "3")
1001+
.Case("s", "2")
1002+
.Case("z", "2")
1003+
.Default("2");
1004+
}
1005+
}
1006+
CC1Args.push_back(DriverArgs.MakeArgString(llvm::Twine("-O") + OOpt));
1007+
9871008
auto NoLibSpirv = DriverArgs.hasArg(options::OPT_fno_sycl_libspirv) ||
9881009
getDriver().offloadDeviceOnly();
9891010
if (DeviceOffloadingKind == Action::OFK_SYCL && !NoLibSpirv) {
9901011
std::string LibSpirvFile;
9911012

9921013
if (DriverArgs.hasArg(clang::driver::options::OPT_fsycl_libspirv_path_EQ)) {
9931014
auto ProvidedPath =
994-
DriverArgs.getLastArgValue(clang::driver::options::OPT_fsycl_libspirv_path_EQ).str();
1015+
DriverArgs
1016+
.getLastArgValue(
1017+
clang::driver::options::OPT_fsycl_libspirv_path_EQ)
1018+
.str();
9951019
if (llvm::sys::fs::exists(ProvidedPath))
9961020
LibSpirvFile = ProvidedPath;
9971021
} else {

0 commit comments

Comments
 (0)