[llvm] d723587 - [HLSL] Explicitly set the SPIR-V version with spv-target-env (#121961)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 9 06:40:00 PST 2025
Author: Steven Perron
Date: 2025-01-09T09:39:56-05:00
New Revision: d7235876867dd21b636868e242400271cca15109
URL: https://github.com/llvm/llvm-project/commit/d7235876867dd21b636868e242400271cca15109
DIFF: https://github.com/llvm/llvm-project/commit/d7235876867dd21b636868e242400271cca15109.diff
LOG: [HLSL] Explicitly set the SPIR-V version with spv-target-env (#121961)
In DXC, setting the vulkan version automatically sets the target spir-v
version to the maximum spir-v version that the vulkan version must
support. So for Vulkan 1.2, we set the spir-v version to spirv 1.5
because every implementation of Vulkan 1.2 must support spirv 1.5, but
not spir-v 1.6.
Added:
Modified:
clang/lib/Driver/Driver.cpp
clang/test/Driver/dxc_spirv.hlsl
llvm/lib/TargetParser/Triple.cpp
Removed:
################################################################################
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 528b7d1a9c7b17..04f2664ffeaddb 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1503,9 +1503,14 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
// Set specific Vulkan version if applicable.
if (const Arg *A = Args.getLastArg(options::OPT_fspv_target_env_EQ)) {
- const llvm::StringSet<> ValidValues = {"vulkan1.2", "vulkan1.3"};
- if (ValidValues.contains(A->getValue())) {
- T.setOSName(A->getValue());
+ const llvm::StringMap<llvm::Triple::SubArchType> ValidTargets = {
+ {"vulkan1.2", llvm::Triple::SPIRVSubArch_v15},
+ {"vulkan1.3", llvm::Triple::SPIRVSubArch_v16}};
+
+ auto TargetInfo = ValidTargets.find(A->getValue());
+ if (TargetInfo != ValidTargets.end()) {
+ T.setOSName(TargetInfo->getKey());
+ T.setArch(llvm::Triple::spirv, TargetInfo->getValue());
} else {
Diag(diag::err_drv_invalid_value)
<< A->getAsString(Args) << A->getValue();
diff --git a/clang/test/Driver/dxc_spirv.hlsl b/clang/test/Driver/dxc_spirv.hlsl
index c087ea4b0d709f..e6624e5f1b3f6f 100644
--- a/clang/test/Driver/dxc_spirv.hlsl
+++ b/clang/test/Driver/dxc_spirv.hlsl
@@ -6,8 +6,8 @@
// CHECK: "-triple" "spirv-unknown-vulkan-compute"
// CHECK-SAME: "-x" "hlsl"
-// CHECK-VULKAN12: "-triple" "spirv-unknown-vulkan1.2-compute"
+// CHECK-VULKAN12: "-triple" "spirv1.5-unknown-vulkan1.2-compute"
-// CHECK-VULKAN13: "-triple" "spirv-unknown-vulkan1.3-compute"
+// CHECK-VULKAN13: "-triple" "spirv1.6-unknown-vulkan1.3-compute"
// CHECK-ERROR: error: invalid value 'vulkan1.0' in '-fspv-target-env=vulkan1.0'
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 7e040688dc1a7b..4c1de09e91f21c 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -113,6 +113,26 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) {
if (SubArch == AArch64SubArch_arm64e)
return "arm64e";
break;
+ case Triple::spirv:
+ switch (SubArch) {
+ case Triple::SPIRVSubArch_v10:
+ return "spirv1.0";
+ case Triple::SPIRVSubArch_v11:
+ return "spirv1.1";
+ case Triple::SPIRVSubArch_v12:
+ return "spirv1.2";
+ case Triple::SPIRVSubArch_v13:
+ return "spirv1.3";
+ case Triple::SPIRVSubArch_v14:
+ return "spirv1.4";
+ case Triple::SPIRVSubArch_v15:
+ return "spirv1.5";
+ case Triple::SPIRVSubArch_v16:
+ return "spirv1.6";
+ default:
+ break;
+ }
+ break;
case Triple::dxil:
switch (SubArch) {
case Triple::NoSubArch:
More information about the llvm-commits
mailing list