@@ -190,8 +190,8 @@ Error asyncMemCopy(bool UseMultipleSdmaEngines, void *Dst, hsa_agent_t DstAgent,
190190#endif
191191}
192192
193- Expected<std::string> getTargetTripleAndFeatures (hsa_agent_t Agent) {
194- std::string Target;
193+ Error getTargetTripleAndFeatures (hsa_agent_t Agent,
194+ SmallVector< std::string> &Targets) {
195195 auto Err = hsa_utils::iterateAgentISAs (Agent, [&](hsa_isa_t ISA) {
196196 uint32_t Length;
197197 hsa_status_t Status;
@@ -205,13 +205,16 @@ Expected<std::string> getTargetTripleAndFeatures(hsa_agent_t Agent) {
205205 return Status;
206206
207207 llvm::StringRef TripleTarget (ISAName.begin (), Length);
208- if (TripleTarget.consume_front (" amdgcn-amd-amdhsa" ))
209- Target = TripleTarget.ltrim (' -' ).rtrim (' \0 ' ).str ();
210- return HSA_STATUS_INFO_BREAK;
208+ if (TripleTarget.consume_front (" amdgcn-amd-amdhsa" )) {
209+ auto Target = TripleTarget.ltrim (' -' ).rtrim (' \0 ' ).str ();
210+ if (Target.find (" generic" ) != std::string::npos)
211+ Targets.push_back (Target);
212+ else
213+ Targets[0 ] = Target;
214+ }
215+ return HSA_STATUS_SUCCESS;
211216 });
212- if (Err)
213- return Err;
214- return Target;
217+ return Err;
215218}
216219} // namespace hsa_utils
217220
@@ -1988,12 +1991,11 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy {
19881991 return Err;
19891992
19901993 // Detect if XNACK is enabled
1991- auto TargeTripleAndFeaturesOrError =
1992- hsa_utils::getTargetTripleAndFeatures (Agent);
1993- if (!TargeTripleAndFeaturesOrError)
1994- return TargeTripleAndFeaturesOrError.takeError ();
1995- if (static_cast <StringRef>(*TargeTripleAndFeaturesOrError)
1996- .contains (" xnack+" ))
1994+ SmallVector<std::string> Targets;
1995+ Targets.push_back (" " );
1996+ if (auto Err = hsa_utils::getTargetTripleAndFeatures (Agent, Targets))
1997+ return Err;
1998+ if (Targets[0 ].find (" xnack+" ) != std::string::npos)
19971999 IsXnackEnabled = true ;
19982000
19992001 // detect if device is an APU.
@@ -3207,13 +3209,17 @@ struct AMDGPUPluginTy final : public GenericPluginTy {
32073209 if (!Processor)
32083210 return false ;
32093211
3210- auto TargeTripleAndFeaturesOrError =
3211- hsa_utils::getTargetTripleAndFeatures (getKernelAgent (DeviceId));
3212- if (!TargeTripleAndFeaturesOrError)
3213- return TargeTripleAndFeaturesOrError.takeError ();
3214- return offloading::amdgpu::isImageCompatibleWithEnv (
3215- Processor ? *Processor : " " , ElfOrErr->getPlatformFlags (),
3216- *TargeTripleAndFeaturesOrError);
3212+ SmallVector<std::string> Targets;
3213+ Targets.push_back (" " );
3214+ if (auto Err = hsa_utils::getTargetTripleAndFeatures (
3215+ getKernelAgent (DeviceId), Targets))
3216+ return Err;
3217+ for (auto &Target : Targets)
3218+ if (offloading::amdgpu::isImageCompatibleWithEnv (
3219+ Processor ? *Processor : " " , ElfOrErr->getPlatformFlags (),
3220+ Target))
3221+ return true ;
3222+ return false ;
32173223 }
32183224
32193225 bool isDataExchangable (int32_t SrcDeviceId, int32_t DstDeviceId) override {
0 commit comments