Skip to content

Commit 3928e41

Browse files
authored
[NFC][Driver] Simplify -fsycl-targets handling (#19413)
Remove useless variables HasSYCLTargetsOption, GpuInitHasErrors and ShouldAddDefaultTriple. This also flips the return value of initializeGpuArchMap to return `true` when initialization is successful.
1 parent c30ff80 commit 3928e41

File tree

1 file changed

+103
-109
lines changed

1 file changed

+103
-109
lines changed

clang/lib/Driver/Driver.cpp

Lines changed: 103 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -6053,7 +6053,8 @@ class OffloadingActionBuilder final {
60536053

60546054
/// Initialize the GPU architecture list from arguments - this populates
60556055
/// `GpuArchList` from `--offload-arch` flags. Only relevant if compiling to
6056-
/// CUDA or AMDGCN. Return true if any initialization errors are found.
6056+
/// CUDA or AMDGCN.
6057+
/// \return true if any initialization is successful.
60576058
/// FIXME: "offload-arch" and the BoundArch mechanism should also be
60586059
// used in the SYCLToolChain for SPIR-V AOT to track the offload
60596060
// architecture instead of the Triple sub-arch it currently uses.
@@ -6139,11 +6140,11 @@ class OffloadingActionBuilder final {
61396140
})) {
61406141
C.getDriver().Diag(clang::diag::err_drv_sycl_missing_amdgpu_arch)
61416142
<< (SYCLTripleList.size() > 1) << Triple.str();
6142-
return true;
6143+
return false;
61436144
}
61446145
}
61456146

6146-
return false;
6147+
return true;
61476148
}
61486149

61496150
// Goes through all of the arguments, including inputs expected for the
@@ -6314,119 +6315,112 @@ class OffloadingActionBuilder final {
63146315
C.getInputArgs().getLastArg(options::OPT_fsycl_targets_EQ);
63156316
bool HasValidSYCLRuntime = C.getInputArgs().hasFlag(
63166317
options::OPT_fsycl, options::OPT_fno_sycl, false);
6317-
bool ShouldAddDefaultTriple = true;
6318-
bool GpuInitHasErrors = false;
6319-
bool HasSYCLTargetsOption = SYCLTargets;
6320-
6321-
if (HasSYCLTargetsOption) {
6322-
if (SYCLTargets) {
6323-
Arg *SYCLTargetsValues = SYCLTargets;
6324-
// Fill SYCLTripleList
6325-
llvm::StringMap<StringRef> FoundNormalizedTriples;
6326-
for (StringRef Val : SYCLTargetsValues->getValues()) {
6327-
StringRef UserTargetName(Val);
6328-
if (auto ValidDevice = gen::isGPUTarget<gen::IntelGPU>(Val)) {
6329-
if (ValidDevice->empty())
6330-
// Unrecognized, we have already diagnosed this earlier; skip.
6331-
continue;
6332-
// Add the proper -device value to the list.
6333-
GpuArchList.emplace_back(
6334-
C.getDriver().getSYCLDeviceTriple("spir64_gen"),
6335-
ValidDevice->data());
6336-
UserTargetName = "spir64_gen";
6337-
} else if (auto ValidDevice =
6338-
gen::isGPUTarget<gen::NvidiaGPU>(Val)) {
6339-
if (ValidDevice->empty())
6340-
// Unrecognized, we have already diagnosed this earlier; skip.
6341-
continue;
6342-
// Add the proper -device value to the list.
6343-
GpuArchList.emplace_back(
6344-
C.getDriver().getSYCLDeviceTriple("nvptx64-nvidia-cuda"),
6345-
ValidDevice->data());
6346-
UserTargetName = "nvptx64-nvidia-cuda";
6347-
} else if (auto ValidDevice = gen::isGPUTarget<gen::AmdGPU>(Val)) {
6348-
if (ValidDevice->empty())
6349-
// Unrecognized, we have already diagnosed this earlier; skip.
6350-
continue;
6351-
// Add the proper -device value to the list.
6352-
GpuArchList.emplace_back(
6353-
C.getDriver().getSYCLDeviceTriple("amdgcn-amd-amdhsa"),
6354-
ValidDevice->data());
6355-
UserTargetName = "amdgcn-amd-amdhsa";
6356-
}
6357-
6358-
llvm::Triple TT(
6359-
C.getDriver().getSYCLDeviceTriple(Val, SYCLTargetsValues));
6360-
std::string NormalizedName = TT.normalize();
63616318

6362-
// Make sure we don't have a duplicate triple.
6363-
auto Duplicate = FoundNormalizedTriples.find(NormalizedName);
6364-
if (Duplicate != FoundNormalizedTriples.end())
6319+
if (SYCLTargets) {
6320+
Arg *SYCLTargetsValues = SYCLTargets;
6321+
// Fill SYCLTripleList
6322+
llvm::StringMap<StringRef> FoundNormalizedTriples;
6323+
for (StringRef Val : SYCLTargetsValues->getValues()) {
6324+
StringRef UserTargetName(Val);
6325+
if (auto ValidDevice = gen::isGPUTarget<gen::IntelGPU>(Val)) {
6326+
if (ValidDevice->empty())
6327+
// Unrecognized, we have already diagnosed this earlier; skip.
6328+
continue;
6329+
// Add the proper -device value to the list.
6330+
GpuArchList.emplace_back(
6331+
C.getDriver().getSYCLDeviceTriple("spir64_gen"),
6332+
ValidDevice->data());
6333+
UserTargetName = "spir64_gen";
6334+
} else if (auto ValidDevice = gen::isGPUTarget<gen::NvidiaGPU>(Val)) {
6335+
if (ValidDevice->empty())
6336+
// Unrecognized, we have already diagnosed this earlier; skip.
63656337
continue;
6338+
// Add the proper -device value to the list.
6339+
GpuArchList.emplace_back(
6340+
C.getDriver().getSYCLDeviceTriple("nvptx64-nvidia-cuda"),
6341+
ValidDevice->data());
6342+
UserTargetName = "nvptx64-nvidia-cuda";
6343+
} else if (auto ValidDevice = gen::isGPUTarget<gen::AmdGPU>(Val)) {
6344+
if (ValidDevice->empty())
6345+
// Unrecognized, we have already diagnosed this earlier; skip.
6346+
continue;
6347+
// Add the proper -device value to the list.
6348+
GpuArchList.emplace_back(
6349+
C.getDriver().getSYCLDeviceTriple("amdgcn-amd-amdhsa"),
6350+
ValidDevice->data());
6351+
UserTargetName = "amdgcn-amd-amdhsa";
6352+
}
63666353

6367-
// Store the current triple so that we can check for duplicates in
6368-
// the following iterations.
6369-
FoundNormalizedTriples[NormalizedName] = Val;
6354+
llvm::Triple TT(
6355+
C.getDriver().getSYCLDeviceTriple(Val, SYCLTargetsValues));
6356+
std::string NormalizedName = TT.normalize();
63706357

6371-
SYCLTripleList.push_back(
6372-
C.getDriver().getSYCLDeviceTriple(UserTargetName));
6373-
// For user specified spir64_gen, add an empty device value as a
6374-
// placeholder.
6375-
if (TT.getSubArch() == llvm::Triple::SPIRSubArch_gen)
6376-
GpuArchList.emplace_back(TT, nullptr);
6377-
}
6358+
// Make sure we don't have a duplicate triple.
6359+
auto Duplicate = FoundNormalizedTriples.find(NormalizedName);
6360+
if (Duplicate != FoundNormalizedTriples.end())
6361+
continue;
63786362

6379-
// Fill GpuArchList, end if there are issues in initializingGpuArchMap
6380-
GpuInitHasErrors = initializeGpuArchMap();
6381-
if (GpuInitHasErrors)
6382-
return true;
6363+
// Store the current triple so that we can check for duplicates in
6364+
// the following iterations.
6365+
FoundNormalizedTriples[NormalizedName] = Val;
63836366

6384-
size_t GenIndex = 0;
6385-
// Fill SYCLTargetInfoList
6386-
for (auto &TT : SYCLTripleList) {
6387-
auto TCIt = llvm::find_if(
6388-
ToolChains, [&](auto &TC) { return TT == TC->getTriple(); });
6389-
assert(TCIt != ToolChains.end() &&
6390-
"Toolchain was not created for this platform");
6391-
if (!TT.isNVPTX() && !TT.isAMDGCN()) {
6392-
// When users specify the target as 'intel_gpu_*', the proper
6393-
// triple is 'spir64_gen'. The given string from intel_gpu_*
6394-
// is the target device.
6395-
if (TT.isSPIR() &&
6396-
TT.getSubArch() == llvm::Triple::SPIRSubArch_gen) {
6397-
// Multiple spir64_gen targets are allowed to be used via the
6398-
// -fsycl-targets=spir64_gen and -fsycl-targets=intel_gpu_*
6399-
// specifiers. Using an index through the known GpuArchList
6400-
// values, increment through them accordingly to allow for
6401-
// the multiple settings as well as preventing re-use.
6402-
while (TT != GpuArchList[GenIndex].first &&
6403-
GenIndex < GpuArchList.size())
6404-
++GenIndex;
6405-
if (GpuArchList[GenIndex].first != TT)
6406-
// No match.
6407-
continue;
6408-
StringRef Device(GpuArchList[GenIndex].second);
6409-
SYCLTargetInfoList.emplace_back(
6410-
*TCIt, Device.empty() ? nullptr : Device.data());
6367+
SYCLTripleList.push_back(
6368+
C.getDriver().getSYCLDeviceTriple(UserTargetName));
6369+
// For user specified spir64_gen, add an empty device value as a
6370+
// placeholder.
6371+
if (TT.getSubArch() == llvm::Triple::SPIRSubArch_gen)
6372+
GpuArchList.emplace_back(TT, nullptr);
6373+
}
6374+
6375+
// Fill GpuArchList, end if there are issues in initializingGpuArchMap
6376+
if (!initializeGpuArchMap())
6377+
return true;
6378+
6379+
size_t GenIndex = 0;
6380+
// Fill SYCLTargetInfoList
6381+
for (auto &TT : SYCLTripleList) {
6382+
auto TCIt = llvm::find_if(
6383+
ToolChains, [&](auto &TC) { return TT == TC->getTriple(); });
6384+
assert(TCIt != ToolChains.end() &&
6385+
"Toolchain was not created for this platform");
6386+
if (!TT.isNVPTX() && !TT.isAMDGCN()) {
6387+
// When users specify the target as 'intel_gpu_*', the proper
6388+
// triple is 'spir64_gen'. The given string from intel_gpu_*
6389+
// is the target device.
6390+
if (TT.isSPIR() &&
6391+
TT.getSubArch() == llvm::Triple::SPIRSubArch_gen) {
6392+
// Multiple spir64_gen targets are allowed to be used via the
6393+
// -fsycl-targets=spir64_gen and -fsycl-targets=intel_gpu_*
6394+
// specifiers. Using an index through the known GpuArchList
6395+
// values, increment through them accordingly to allow for
6396+
// the multiple settings as well as preventing re-use.
6397+
while (TT != GpuArchList[GenIndex].first &&
6398+
GenIndex < GpuArchList.size())
64116399
++GenIndex;
6400+
if (GpuArchList[GenIndex].first != TT)
6401+
// No match.
64126402
continue;
6413-
}
6414-
SYCLTargetInfoList.emplace_back(*TCIt, nullptr);
6415-
} else {
6416-
const char *OffloadArch = nullptr;
6417-
for (auto &TargetTripleArchPair : GpuArchList) {
6418-
if (TT == TargetTripleArchPair.first) {
6419-
OffloadArch = TargetTripleArchPair.second;
6420-
// Add an arch to the SYCLTargetInfoList
6421-
// only if it is not already present in the list.
6422-
auto Arch = llvm::find_if(
6423-
SYCLTargetInfoList, [&](auto &DeviceTargetInfo) {
6424-
return OffloadArch == DeviceTargetInfo.BoundArch;
6425-
});
6426-
6427-
if (Arch == SYCLTargetInfoList.end())
6428-
SYCLTargetInfoList.emplace_back(*TCIt, OffloadArch);
6429-
}
6403+
StringRef Device(GpuArchList[GenIndex].second);
6404+
SYCLTargetInfoList.emplace_back(
6405+
*TCIt, Device.empty() ? nullptr : Device.data());
6406+
++GenIndex;
6407+
continue;
6408+
}
6409+
SYCLTargetInfoList.emplace_back(*TCIt, nullptr);
6410+
} else {
6411+
const char *OffloadArch = nullptr;
6412+
for (auto &TargetTripleArchPair : GpuArchList) {
6413+
if (TT == TargetTripleArchPair.first) {
6414+
OffloadArch = TargetTripleArchPair.second;
6415+
// Add an arch to the SYCLTargetInfoList
6416+
// only if it is not already present in the list.
6417+
auto Arch = llvm::find_if(
6418+
SYCLTargetInfoList, [&](auto &DeviceTargetInfo) {
6419+
return OffloadArch == DeviceTargetInfo.BoundArch;
6420+
});
6421+
6422+
if (Arch == SYCLTargetInfoList.end())
6423+
SYCLTargetInfoList.emplace_back(*TCIt, OffloadArch);
64306424
}
64316425
}
64326426
}
@@ -6470,7 +6464,7 @@ class OffloadingActionBuilder final {
64706464
}
64716465
}
64726466

6473-
if (ShouldAddDefaultTriple && addSYCLDefaultTriple(C, SYCLTripleList)) {
6467+
if (addSYCLDefaultTriple(C, SYCLTripleList)) {
64746468
// If a SYCLDefaultTriple is added to SYCLTripleList,
64756469
// add new target to SYCLTargetInfoList
64766470
llvm::Triple TT = SYCLTripleList.front();

0 commit comments

Comments
 (0)