@@ -802,6 +802,19 @@ static bool addSYCLDefaultTriple(Compilation &C,
802
802
return true ;
803
803
}
804
804
805
+ // Prefix for Intel GPU specific targets used for -fsycl-targets
806
+ constexpr char IntelGPU[] = " intel_gpu_" ;
807
+
808
+ static llvm::Optional<StringRef> isIntelGPUTarget (StringRef Target) {
809
+ // Handle target specifications that resemble 'intel_gpu_*' here. These are
810
+ // 'spir64_gen' based.
811
+ if (Target.startswith (IntelGPU)) {
812
+ return tools::SYCL::gen::resolveGenDevice (
813
+ Target.drop_front (sizeof (IntelGPU) - 1 ));
814
+ }
815
+ return llvm::None;
816
+ }
817
+
805
818
void Driver::CreateOffloadingDeviceToolChains (Compilation &C,
806
819
InputList &Inputs) {
807
820
@@ -1086,8 +1099,17 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
1086
1099
<< SYCLForceTarget->getAsString (C.getInputArgs ());
1087
1100
1088
1101
for (StringRef Val : SYCLTargetsValues->getValues ()) {
1102
+ StringRef UserTargetName (Val);
1103
+ if (auto Device = isIntelGPUTarget (Val)) {
1104
+ if (Device->empty ()) {
1105
+ Diag (clang::diag::err_drv_invalid_sycl_target) << Val;
1106
+ continue ;
1107
+ }
1108
+ UserTargetName = " spir64_gen" ;
1109
+ }
1110
+
1089
1111
llvm::Triple TT (MakeSYCLDeviceTriple (Val));
1090
- if (!isValidSYCLTriple (TT )) {
1112
+ if (!isValidSYCLTriple (MakeSYCLDeviceTriple (UserTargetName) )) {
1091
1113
Diag (clang::diag::err_drv_invalid_sycl_target) << Val;
1092
1114
continue ;
1093
1115
}
@@ -1125,7 +1147,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
1125
1147
// Store the current triple so that we can check for duplicates in
1126
1148
// the following iterations.
1127
1149
FoundNormalizedTriples[NormalizedName] = Val;
1128
- UniqueSYCLTriplesVec.push_back (TT );
1150
+ UniqueSYCLTriplesVec.push_back (MakeSYCLDeviceTriple (UserTargetName) );
1129
1151
}
1130
1152
addSYCLDefaultTriple (C, UniqueSYCLTriplesVec);
1131
1153
} else
@@ -3576,8 +3598,16 @@ void Driver::checkForOffloadMismatch(Compilation &C,
3576
3598
// each target individually.
3577
3599
SmallVector<StringRef, 4 > Targets;
3578
3600
if (const Arg *A = Args.getLastArg (options::OPT_fsycl_targets_EQ)) {
3579
- for (const char *Val : A->getValues ())
3601
+ for (StringRef Val : A->getValues ()) {
3602
+ if (auto ValidDevice = isIntelGPUTarget (Val)) {
3603
+ if (!ValidDevice->empty ())
3604
+ Targets.push_back (Args.MakeArgString (
3605
+ C.getDriver ().MakeSYCLDeviceTriple (" spir64_gen" ).str () + " -" +
3606
+ *ValidDevice));
3607
+ continue ;
3608
+ }
3580
3609
Targets.push_back (Val);
3610
+ }
3581
3611
} else { // Implied targets
3582
3612
// No -fsycl-targets given, check based on -fintelfpga or default device
3583
3613
bool SYCLfpga = C.getInputArgs ().hasArg (options::OPT_fintelfpga);
@@ -4722,7 +4752,7 @@ class OffloadingActionBuilder final {
4722
4752
llvm::function_ref<void (const char *)> Op) {
4723
4753
for (auto &A : GpuArchList) {
4724
4754
if (TC->getTriple () == A.first ) {
4725
- Op (Args.MakeArgString (A.second ));
4755
+ Op (A. second ? Args.MakeArgString (A.second ) : nullptr );
4726
4756
return ;
4727
4757
}
4728
4758
}
@@ -5500,10 +5530,12 @@ class OffloadingActionBuilder final {
5500
5530
auto *DeviceWrappingAction = C.MakeAction <OffloadWrapperJobAction>(
5501
5531
WrapperInputs, types::TY_Object);
5502
5532
5503
- if (isSpirvAOT)
5504
- DA.add (*DeviceWrappingAction, *TC, /* BoundArch=*/ nullptr ,
5533
+ if (isSpirvAOT) {
5534
+ bool AddBA = (TT.getSubArch () == llvm::Triple::SPIRSubArch_gen &&
5535
+ BoundArch != nullptr );
5536
+ DA.add (*DeviceWrappingAction, *TC, AddBA ? BoundArch : nullptr ,
5505
5537
Action::OFK_SYCL);
5506
- else
5538
+ } else
5507
5539
withBoundArchForToolChain (TC, [&](const char *BoundArch) {
5508
5540
DA.add (*DeviceWrappingAction, *TC, BoundArch, Action::OFK_SYCL);
5509
5541
});
@@ -5675,7 +5707,17 @@ class OffloadingActionBuilder final {
5675
5707
Arg *SYCLTargetsValues = SYCLTargets ? SYCLTargets : SYCLLinkTargets;
5676
5708
// Fill SYCLTripleList
5677
5709
llvm::StringMap<StringRef> FoundNormalizedTriples;
5678
- for (const char *Val : SYCLTargetsValues->getValues ()) {
5710
+ for (StringRef Val : SYCLTargetsValues->getValues ()) {
5711
+ StringRef UserTargetName (Val);
5712
+ if (auto ValidDevice = isIntelGPUTarget (Val)) {
5713
+ if (ValidDevice->empty ())
5714
+ // Unrecognized, we have already diagnosed this earlier; skip.
5715
+ continue ;
5716
+ // Add the proper -device value to the list.
5717
+ GpuArchList.emplace_back (C.getDriver ().MakeSYCLDeviceTriple (
5718
+ " spir64_gen" ), ValidDevice->data ());
5719
+ UserTargetName = " spir64_gen" ;
5720
+ }
5679
5721
llvm::Triple TT (C.getDriver ().MakeSYCLDeviceTriple (Val));
5680
5722
std::string NormalizedName = TT.normalize ();
5681
5723
@@ -5688,9 +5730,14 @@ class OffloadingActionBuilder final {
5688
5730
// the following iterations.
5689
5731
FoundNormalizedTriples[NormalizedName] = Val;
5690
5732
5691
- SYCLTripleList.push_back (TT);
5733
+ SYCLTripleList.push_back (
5734
+ C.getDriver ().MakeSYCLDeviceTriple (UserTargetName));
5692
5735
if (TT.getSubArch () == llvm::Triple::SPIRSubArch_fpga)
5693
5736
SYCLfpgaTriple = true ;
5737
+ // For user specified spir64_gen, add an empty device value as a
5738
+ // placeholder.
5739
+ if (TT.getSubArch () == llvm::Triple::SPIRSubArch_gen)
5740
+ GpuArchList.emplace_back (TT, nullptr );
5694
5741
}
5695
5742
5696
5743
// Fill GpuArchList, end if there are issues in initializingGpuArchMap
@@ -5705,9 +5752,20 @@ class OffloadingActionBuilder final {
5705
5752
ToolChains, [&](auto &TC) { return TT == TC->getTriple (); });
5706
5753
assert (TCIt != ToolChains.end () &&
5707
5754
" Toolchain was not created for this platform" );
5708
- if (!TT.isNVPTX () && !TT.isAMDGCN ())
5755
+ if (!TT.isNVPTX () && !TT.isAMDGCN ()) {
5756
+ // When users specify the target as 'intel_gpu_*', the proper
5757
+ // triple is 'spir64_gen'. The given string from intel_gpu_*
5758
+ // is the target device.
5759
+ if (TT.isSPIR () &&
5760
+ TT.getSubArch () == llvm::Triple::SPIRSubArch_gen) {
5761
+ StringRef Device (GpuArchList[I].second );
5762
+ SYCLTargetInfoList.emplace_back (
5763
+ *TCIt, Device.empty () ? nullptr : Device.data ());
5764
+ ++I;
5765
+ continue ;
5766
+ }
5709
5767
SYCLTargetInfoList.emplace_back (*TCIt, nullptr );
5710
- else {
5768
+ } else {
5711
5769
SYCLTargetInfoList.emplace_back (*TCIt, GpuArchList[I].second );
5712
5770
++I;
5713
5771
}
@@ -5731,6 +5789,9 @@ class OffloadingActionBuilder final {
5731
5789
// populate the AOT binary inputs vector.
5732
5790
SYCLAOTInputs.push_back (std::make_pair (TT, TF));
5733
5791
ShouldAddDefaultTriple = false ;
5792
+ // Add an empty entry to the Device list
5793
+ if (TT.getSubArch () == llvm::Triple::SPIRSubArch_gen)
5794
+ GpuArchList.emplace_back (TT, nullptr );
5734
5795
}
5735
5796
}
5736
5797
} else if (HasValidSYCLRuntime) {
0 commit comments