================ @@ -54,22 +55,67 @@ void GPUToSPIRVPass::runOnOperation() { SmallVector<Operation *, 1> gpuModules; OpBuilder builder(context); + + auto getTargetEnvFromGPUModuleOp = [*this](gpu::GPUModuleOp moduleOp) { + Operation *gpuModule = moduleOp.getOperation(); + auto targetAttr = spirv::lookupTargetEnvOrDefault(gpuModule); + std::unique_ptr<ConversionTarget> target = + SPIRVConversionTarget::get(targetAttr); + + SPIRVConversionOptions options; + options.use64bitIndex = this->use64bitIndex; + SPIRVTypeConverter typeConverter(targetAttr, options); + const spirv::TargetEnv &targetEnv = typeConverter.getTargetEnv(); + return targetEnv; + }; + module.walk([&](gpu::GPUModuleOp moduleOp) { // Clone each GPU kernel module for conversion, given that the GPU // launch op still needs the original GPU kernel module. - builder.setInsertionPoint(moduleOp.getOperation()); + // SPIRV module insertion point by is after original GPU module. + // This works fine for Vulkan shader that has a dedicated runner. + // But OpenCL kernel needs SPIRV module placed inside original GPU module as + // OpenCL uses GPU compilation pipeline. + const mlir::spirv::TargetEnv &targetEnv = + getTargetEnvFromGPUModuleOp(moduleOp); + FailureOr<spirv::MemoryModel> memoryModel = ---------------- silee2 wrote:
That is a great idea. Thanks! Updated the lambda. https://github.com/llvm/llvm-project/pull/69941 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits