[llvm] [SPIRV] Change how to detect OpenCL/Vulkan Env and update tests accordingly. (PR #129689)
Steven Perron via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 11 12:48:06 PST 2025
================
@@ -267,14 +267,37 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
static SPIRV::ExecutionModel::ExecutionModel
getExecutionModel(const SPIRVSubtarget &STI, const Function &F) {
- if (STI.isOpenCLEnv())
+ if (STI.isKernel())
return SPIRV::ExecutionModel::Kernel;
+ if (STI.isShader()) {
+ auto attribute = F.getFnAttribute("hlsl.shader");
+ if (!attribute.isValid()) {
+ report_fatal_error(
+ "This entry point lacks mandatory hlsl.shader attribute.");
+ }
+
+ const auto value = attribute.getValueAsString();
+ if (value == "compute")
+ return SPIRV::ExecutionModel::GLCompute;
+
+ report_fatal_error(
+ "This HLSL entry point is not supported by this backend.");
+ }
+
+ assert(STI.getEnv() == SPIRVSubtarget::Unknown);
+ // "hlsl.shader" attribute is mandatory for Vulkan, so we can set Env to
+ // Shader whenever we find it, and to Kernel otherwise.
+
+ // We will now change the Env based on the attribute, so we need to strip
+ // `const` out of the ref to STI.
+ SPIRVSubtarget *NonConstSTI = const_cast<SPIRVSubtarget *>(&STI);
auto attribute = F.getFnAttribute("hlsl.shader");
if (!attribute.isValid()) {
- report_fatal_error(
- "This entry point lacks mandatory hlsl.shader attribute.");
+ NonConstSTI->setEnv(SPIRVSubtarget::Kernel);
+ return SPIRV::ExecutionModel::Kernel;
}
+ NonConstSTI->setEnv(SPIRVSubtarget::Shader);
----------------
s-perron wrote:
I just notice this causes the result of isShader to change part way through the compilation. This can cause inconsistent results. I've opened issue https://github.com/llvm/llvm-project/issues/171898 to follow up on this.
https://github.com/llvm/llvm-project/pull/129689
More information about the llvm-commits
mailing list