Hide ExecutableVariantOp from TargetBackend pipeline factory methods. (#17255)
This will allow us to cache the pipelines based on the
ExecutableTargetAttr in the future as noted in #12095.
diff --git a/compiler/plugins/target/CUDA/CUDATarget.cpp b/compiler/plugins/target/CUDA/CUDATarget.cpp
index 7a008ed..f531d71 100644
--- a/compiler/plugins/target/CUDA/CUDATarget.cpp
+++ b/compiler/plugins/target/CUDA/CUDATarget.cpp
@@ -428,24 +428,14 @@
mlir::registerNVVMDialectTranslation(registry);
}
- void buildConfigurationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
- OpPassManager &passManager) override {
- // For now we disable configuration if the variant has external object
- // files.
- if (variantOp.isExternal())
- return;
-
+ void
+ buildConfigurationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
+ OpPassManager &passManager) override {
buildLLVMGPUCodegenConfigurationPassPipeline(passManager);
}
- void buildTranslationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
+ void buildTranslationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
OpPassManager &passManager) override {
- // For now we disable translation if the variant has external object files.
- // We could instead perform linking with those objects (if they're bitcode
- // ala libdevice.bc, etc).
- if (variantOp.isExternal())
- return;
-
buildLLVMGPUCodegenPassPipeline(passManager, false);
}
diff --git a/compiler/plugins/target/LLVMCPU/LLVMCPUTarget.cpp b/compiler/plugins/target/LLVMCPU/LLVMCPUTarget.cpp
index 864e6f6..960d919 100644
--- a/compiler/plugins/target/LLVMCPU/LLVMCPUTarget.cpp
+++ b/compiler/plugins/target/LLVMCPU/LLVMCPUTarget.cpp
@@ -212,15 +212,15 @@
// clang-format on
}
- void buildConfigurationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
- OpPassManager &passManager) override {
+ void
+ buildConfigurationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
+ OpPassManager &passManager) override {
buildLLVMCPUCodegenConfigurationPassPipeline(passManager);
}
- void buildTranslationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
+ void buildTranslationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
OpPassManager &passManager) override {
- auto target = variantOp.getTarget();
- bool enableAArch64SME = isAArch64(target) && hasSMEFeature(target);
+ bool enableAArch64SME = isAArch64(targetAttr) && hasSMEFeature(targetAttr);
buildLLVMCPUCodegenPassPipeline(passManager, enableAArch64SME);
}
diff --git a/compiler/plugins/target/MetalSPIRV/MetalSPIRVTarget.cpp b/compiler/plugins/target/MetalSPIRV/MetalSPIRVTarget.cpp
index 6622edf..6ea1cbf 100644
--- a/compiler/plugins/target/MetalSPIRV/MetalSPIRVTarget.cpp
+++ b/compiler/plugins/target/MetalSPIRV/MetalSPIRVTarget.cpp
@@ -170,24 +170,14 @@
IREE::Flow::FlowDialect, spirv::SPIRVDialect>();
}
- void buildConfigurationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
- OpPassManager &passManager) override {
- // For now we disable configuration if the variant has external object
- // files.
- if (variantOp.isExternal())
- return;
-
+ void
+ buildConfigurationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
+ OpPassManager &passManager) override {
buildSPIRVCodegenConfigurationPassPipeline(passManager);
}
- void buildTranslationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
+ void buildTranslationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
OpPassManager &passManager) override {
- // For now we disable translation if the variant has external object files.
- // We could instead perform linking with those objects (if they're Metal
- // archives, etc).
- if (variantOp.isExternal())
- return;
-
buildSPIRVCodegenPassPipeline(passManager);
}
diff --git a/compiler/plugins/target/ROCM/ROCMTarget.cpp b/compiler/plugins/target/ROCM/ROCMTarget.cpp
index 5979b5d..270ca01 100644
--- a/compiler/plugins/target/ROCM/ROCMTarget.cpp
+++ b/compiler/plugins/target/ROCM/ROCMTarget.cpp
@@ -207,24 +207,14 @@
registry.insert<amdgpu::AMDGPUDialect>();
}
- void buildConfigurationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
- OpPassManager &passManager) override {
- // For now we disable configuration if the variant has external object
- // files.
- if (variantOp.isExternal())
- return;
-
+ void
+ buildConfigurationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
+ OpPassManager &passManager) override {
buildLLVMGPUCodegenConfigurationPassPipeline(passManager);
}
- void buildTranslationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
+ void buildTranslationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
OpPassManager &passManager) override {
- // For now we disable translation if the variant has external object files.
- // We could instead perform linking with those objects (if they're bitcode
- // ala libdevice.bc, etc).
- if (variantOp.isExternal())
- return;
-
buildLLVMGPUCodegenPassPipeline(passManager, true);
}
diff --git a/compiler/plugins/target/VMVX/VMVXTarget.cpp b/compiler/plugins/target/VMVX/VMVXTarget.cpp
index 7620b5a..2d1d46f 100644
--- a/compiler/plugins/target/VMVX/VMVXTarget.cpp
+++ b/compiler/plugins/target/VMVX/VMVXTarget.cpp
@@ -91,18 +91,19 @@
return vmOptions;
}
- void buildConfigurationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
- OpPassManager &passManager) override {
+ void
+ buildConfigurationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
+ OpPassManager &passManager) override {
IREE::VMVX::buildVMVXConfigurationPassPipeline(passManager);
}
- void buildTranslationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
+ void buildTranslationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
OpPassManager &passManager) override {
IREE::VMVX::buildVMVXTransformPassPipeline(passManager);
OpPassManager &nestedModulePM = passManager.nest<ModuleOp>();
- auto vmOptions = getTargetOptions(variantOp.getTargetAttr());
+ auto vmOptions = getTargetOptions(targetAttr);
IREE::VM::buildVMTransformPassPipeline(nestedModulePM, vmOptions);
}
@@ -215,12 +216,13 @@
.insert<IREE::Codegen::IREECodegenDialect, IREE::VMVX::VMVXDialect>();
}
- void buildConfigurationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
- OpPassManager &passManager) override {
+ void
+ buildConfigurationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
+ OpPassManager &passManager) override {
IREE::VMVX::buildVMVXConfigurationPassPipeline(passManager);
}
- void buildTranslationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
+ void buildTranslationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
OpPassManager &passManager) override {
IREE::VMVX::buildVMVXTransformPassPipeline(passManager);
}
diff --git a/compiler/plugins/target/VulkanSPIRV/VulkanSPIRVTarget.cpp b/compiler/plugins/target/VulkanSPIRV/VulkanSPIRVTarget.cpp
index 4d7a013..49bd44d 100644
--- a/compiler/plugins/target/VulkanSPIRV/VulkanSPIRVTarget.cpp
+++ b/compiler/plugins/target/VulkanSPIRV/VulkanSPIRVTarget.cpp
@@ -160,25 +160,14 @@
spirv::SPIRVDialect, gpu::GPUDialect>();
}
- void buildConfigurationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
- OpPassManager &passManager) override {
- // For now we disable translation if the variant has external object files.
- // We could instead perform linking with those objects (if they're .spv
- // files we could use spirv-link or import them into MLIR and merge here).
- if (variantOp.isExternal())
- return;
-
+ void
+ buildConfigurationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
+ OpPassManager &passManager) override {
buildSPIRVCodegenConfigurationPassPipeline(passManager);
}
- void buildTranslationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
+ void buildTranslationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
OpPassManager &passManager) override {
- // For now we disable translation if the variant has external object files.
- // We could instead perform linking with those objects (if they're .spv
- // files we could use spirv-link or import them into MLIR and merge here).
- if (variantOp.isExternal())
- return;
-
buildSPIRVCodegenPassPipeline(passManager);
}
diff --git a/compiler/plugins/target/WebGPUSPIRV/WebGPUSPIRVTarget.cpp b/compiler/plugins/target/WebGPUSPIRV/WebGPUSPIRVTarget.cpp
index c2dd7c0..8397eb1 100644
--- a/compiler/plugins/target/WebGPUSPIRV/WebGPUSPIRVTarget.cpp
+++ b/compiler/plugins/target/WebGPUSPIRV/WebGPUSPIRVTarget.cpp
@@ -123,22 +123,14 @@
spirv::SPIRVDialect, gpu::GPUDialect>();
}
- void buildConfigurationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
- OpPassManager &passManager) override {
- // For now we disable configuration if the variant has external object
- // files.
- if (variantOp.isExternal())
- return;
-
+ void
+ buildConfigurationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
+ OpPassManager &passManager) override {
buildSPIRVCodegenConfigurationPassPipeline(passManager);
}
- void buildTranslationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
+ void buildTranslationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
OpPassManager &passManager) override {
- // For now we disable translation if the variant has external object files.
- if (variantOp.isExternal())
- return;
-
// WebGPU does not support push constants (yet?), so replace loads from
// push constants with loads from uniform buffers.
// The corresponding runtime code must perform similar emulation, based
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Target/TargetBackend.h b/compiler/src/iree/compiler/Dialect/HAL/Target/TargetBackend.h
index 388fafd..eb01b55 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Target/TargetBackend.h
+++ b/compiler/src/iree/compiler/Dialect/HAL/Target/TargetBackend.h
@@ -151,8 +151,8 @@
// }
// }
virtual void
- buildConfigurationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
- OpPassManager &passManager){};
+ buildConfigurationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
+ OpPassManager &passManager) {}
// Inserts passes used to translate the `hal.executable.variant` op contents.
// The pass manager will be nested on `hal.executable` such that the pipeline
@@ -186,7 +186,7 @@
// }
// }
virtual void
- buildTranslationPassPipeline(IREE::HAL::ExecutableVariantOp variantOp,
+ buildTranslationPassPipeline(IREE::HAL::ExecutableTargetAttr targetAttr,
OpPassManager &passManager) = 0;
// Inserts passes used to link `hal.executable.variant` ops together.
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConfigureExecutables.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConfigureExecutables.cpp
index 9ee5f73..9880ed2 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConfigureExecutables.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConfigureExecutables.cpp
@@ -59,7 +59,8 @@
}
OpPassManager passManager(variantOp.getOperationName());
- targetBackend->buildConfigurationPassPipeline(variantOp, passManager);
+ targetBackend->buildConfigurationPassPipeline(variantOp.getTargetAttr(),
+ passManager);
// This pipeline is optional, and the default is no passes, in which case
// nothing is needed.
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/TranslateExecutables.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/TranslateExecutables.cpp
index 7dfcbe7..b9b1a31 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/TranslateExecutables.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/TranslateExecutables.cpp
@@ -53,6 +53,8 @@
auto variantOp = getOperation();
if (variantOp.getTarget().getBackend().getValue() != target)
return;
+ if (variantOp.isExternal())
+ return;
auto targetBackend = targetRegistry->getTargetBackend(target);
if (!targetBackend) {
@@ -61,7 +63,8 @@
}
OpPassManager passManager(variantOp.getOperationName());
- targetBackend->buildTranslationPassPipeline(variantOp, passManager);
+ targetBackend->buildTranslationPassPipeline(variantOp.getTargetAttr(),
+ passManager);
if (failed(runPipeline(passManager, variantOp))) {
variantOp.emitError() << "failed to run translation of source "
"executable to target executable for backend "