@@ -59,11 +59,11 @@ kernel_impl::kernel_impl(Managed<ur_kernel_handle_t> &&Kernel,
5959 MKernelBundleImpl(KernelBundleImpl.shared_from_this()),
6060 MIsInterop(MDeviceImageImpl->getOriginMask () & ImageOriginInterop),
6161 MKernelArgMaskPtr{ArgMask}, MCacheMutex{CacheMutex},
62- MOwnsDeviceKernelInfo (MDeviceImageImpl->getOriginMask () &
63- ~ImageOriginSYCLOffline),
62+ MOwnsDeviceKernelInfo (checkOwnsDeviceKernelInfo()),
6463 MDeviceKernelInfo(MOwnsDeviceKernelInfo
6564 ? createCompileTimeKernelInfo(getName())
6665 : createCompileTimeKernelInfo()) {
66+
6767 // Enable USM indirect access for interop and non-sycl-jit source kernels.
6868 // sycl-jit kernels will enable this if needed through the regular kernel
6969 // path.
@@ -123,6 +123,17 @@ std::string_view kernel_impl::getName() const {
123123 return MName;
124124}
125125
126+ bool kernel_impl::checkOwnsDeviceKernelInfo () {
127+ // If the image originates from something other than standard offline
128+ // compilation, this kernel needs to own its info structure.
129+ // We could also have a mixed origin image, in which case the device kernel
130+ // info might reside in program manager.
131+ return MDeviceImageImpl->getOriginMask () != ImageOriginSYCLOffline &&
132+ (!(MDeviceImageImpl->getOriginMask () & ImageOriginSYCLOffline) ||
133+ !ProgramManager::getInstance ().tryGetDeviceKernelInfo (
134+ static_cast <KernelNameStrT>(getName ())));
135+ }
136+
126137bool kernel_impl::isBuiltInKernel (device_impl &Device) const {
127138 auto BuiltInKernels = Device.get_info <info::device::built_in_kernel_ids>();
128139 if (BuiltInKernels.empty ())
0 commit comments