[spirv] Dump spirv.module for Metal and WebGPU targets (#14066)
When given `--iree-hal-dump-executable-intermediates-to=`,
to be consistent with Vulkan side:
https://github.com/openxla/iree/pull/14058.
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Target/MetalSPIRV/MetalSPIRVTarget.cpp b/compiler/src/iree/compiler/Dialect/HAL/Target/MetalSPIRV/MetalSPIRVTarget.cpp
index 6ec44ae..f62d15c 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Target/MetalSPIRV/MetalSPIRVTarget.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Target/MetalSPIRV/MetalSPIRVTarget.cpp
@@ -124,6 +124,13 @@
OpBuilder &executableBuilder) override {
ModuleOp innerModuleOp = variantOp.getInnerModule();
auto spvModuleOp = *innerModuleOp.getOps<spirv::ModuleOp>().begin();
+ if (!options.dumpIntermediatesPath.empty()) {
+ std::string assembly;
+ llvm::raw_string_ostream os(assembly);
+ spvModuleOp.print(os, OpPrintingFlags().useLocalScope());
+ dumpDataToPath(options.dumpIntermediatesPath, options.dumpBaseName,
+ variantOp.getName(), ".mlir", assembly);
+ }
// The runtime use ordinals instead of names but Metal requires function
// names for constructing pipeline states. Get an ordered list of the entry
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Target/WebGPU/WebGPUTarget.cpp b/compiler/src/iree/compiler/Dialect/HAL/Target/WebGPU/WebGPUTarget.cpp
index 0aee9c3..fdbc616 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Target/WebGPU/WebGPUTarget.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Target/WebGPU/WebGPUTarget.cpp
@@ -132,7 +132,15 @@
return variantOp.emitError()
<< "should only contain exactly one spirv.module op";
}
+
auto spvModuleOp = *spirvModuleOps.begin();
+ if (!options.dumpIntermediatesPath.empty()) {
+ std::string assembly;
+ llvm::raw_string_ostream os(assembly);
+ spvModuleOp.print(os, OpPrintingFlags().useLocalScope());
+ dumpDataToPath(options.dumpIntermediatesPath, options.dumpBaseName,
+ variantOp.getName(), ".mlir", assembly);
+ }
// The schema expects each shader module to have entry points named "dN",
// where N is the entry point ordinal.