diff --git a/llvm/lib/SYCLLowerIR/LowerESIMD.cpp b/llvm/lib/SYCLLowerIR/LowerESIMD.cpp index 84480484abfc0..a95e75eb9b39a 100644 --- a/llvm/lib/SYCLLowerIR/LowerESIMD.cpp +++ b/llvm/lib/SYCLLowerIR/LowerESIMD.cpp @@ -1127,6 +1127,7 @@ void SYCLLowerESIMDLegacyPass::generateKernelMetadata(Module &M) { SmallVector ArgTypeDescs; auto *KernelArgTypes = F.getMetadata("kernel_arg_type"); + auto *KernelArgAccPtrs = F.getMetadata("kernel_arg_accessor_ptr"); unsigned Idx = 0; // Iterate argument list to gather argument kinds and generate argument @@ -1139,14 +1140,29 @@ void SYCLLowerESIMDLegacyPass::generateKernelMetadata(Module &M) { if (ArgType.find("image1d_t") != std::string::npos || ArgType.find("image2d_t") != std::string::npos || - ArgType.find("image3d_t") != std::string::npos || - ArgType.find("image1d_buffer_t") != std::string::npos) { + ArgType.find("image3d_t") != std::string::npos) { Kind = AK_SURFACE; ArgTypeDescs.push_back(MDString::get(Ctx, ArgType)); } else { StringRef ArgDesc = ""; - if (Arg.getType()->isPointerTy()) - ArgDesc = "svmptr_t"; + + if (Arg.getType()->isPointerTy()) { + const auto *IsAccMD = + KernelArgAccPtrs + ? cast(KernelArgAccPtrs->getOperand(Idx)) + : nullptr; + unsigned IsAcc = + IsAccMD + ? static_cast(cast(IsAccMD->getValue()) + ->getValue() + .getZExtValue()) + : 0; + if (IsAcc) { + ArgDesc = "buffer_t"; + Kind = AK_SURFACE; + } else + ArgDesc = "svmptr_t"; + } ArgTypeDescs.push_back(MDString::get(Ctx, ArgDesc)); }