[clang] [llvm] [HLSL] Add allresourcesbound option to DXC driver and set corresponding module flag (PR #173411)
Joshua Batista via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 23 14:17:30 PST 2025
https://github.com/bob80905 updated https://github.com/llvm/llvm-project/pull/173411
>From 75465515be659ed46ede310c91b6cfe29176bc1c Mon Sep 17 00:00:00 2001
From: Joshua Batista <jbatista at microsoft.com>
Date: Mon, 22 Dec 2025 12:04:01 -0800
Subject: [PATCH 1/4] options work!
---
clang/include/clang/Options/Options.td | 6 ++++++
clang/lib/Driver/ToolChains/Clang.cpp | 1 +
clang/lib/Driver/ToolChains/HLSL.cpp | 6 ++++++
clang/test/Options/all_resources_bound.hlsl | 10 ++++++++++
4 files changed, 23 insertions(+)
create mode 100644 clang/test/Options/all_resources_bound.hlsl
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 8cd31a3be109a..8a032317a71c4 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -9612,6 +9612,12 @@ class DXCJoinedOrSeparate<string name> : Option<["/", "-"], name,
KIND_JOINED_OR_SEPARATE>, Group<dxc_Group>,
Visibility<[DXCOption]>;
+def dxc_all_resources_bound : DXCFlag<"all-resources-bound">,
+ HelpText<"Enables agressive flattening">;
+def hlsl_all_resources_bound : Option<["-"], "hlsl-all-resources-bound", KIND_SEPARATE>,
+ Group<dxc_Group>,
+ Visibility<[ClangOption, CC1Option]>,
+ HelpText<"Enables agressive flattening">;
def dxc_col_major : DXCFlag<"Zpc">, HelpText<"Pack matrices in column-major order">;
def dxc_row_major : DXCFlag<"Zpr">, HelpText<"Pack matrices in row-major order">;
def dxc_no_stdinc : DXCFlag<"hlsl-no-stdinc">,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 310f3b58a211e..2721bac473070 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -3699,6 +3699,7 @@ static void RenderOpenCLOptions(const ArgList &Args, ArgStringList &CmdArgs,
static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs,
types::ID InputType) {
const unsigned ForwardedArguments[] = {
+ options::OPT_hlsl_all_resources_bound,
options::OPT_dxil_validator_version,
options::OPT_res_may_alias,
options::OPT_D,
diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index b76a3d7287975..587481b5623e1 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -417,6 +417,12 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
getDriver().Diag(diag::err_drv_dxc_invalid_matrix_layout);
for (Arg *A : Args) {
+ if (A->getOption().getID() == options::OPT_dxc_all_resources_bound) {
+ DAL->AddFlagArg(nullptr,
+ Opts.getOption(options::OPT_hlsl_all_resources_bound));
+ A->claim();
+ continue;
+ }
if (A->getOption().getID() == options::OPT_dxil_validator_version) {
StringRef ValVerStr = A->getValue();
if (!isLegalValidatorVersion(ValVerStr, getDriver()))
diff --git a/clang/test/Options/all_resources_bound.hlsl b/clang/test/Options/all_resources_bound.hlsl
new file mode 100644
index 0000000000000..2dc1795bfb286
--- /dev/null
+++ b/clang/test/Options/all_resources_bound.hlsl
@@ -0,0 +1,10 @@
+// RUN: %clang_dxc -T lib_6_4 -all-resources-bound %s 2>&1 -### | FileCheck -check-prefix=ARB %s
+// RUN: %clang_dxc -T lib_6_4 %s 2>&1 -### | FileCheck -check-prefix=NO_ARB %s
+
+// ARB: "-hlsl-all-resources-bound"
+// NO_ARB-NOT: "-hlsl-all-resources-bound"
+// assert expected CC1 option is present
+float4 main(float4 a : A) : SV_TARGET
+{
+ return -a.yxxx;
+}
>From bd4883659723b1c150622c9b0b7e3d4b8778b564 Mon Sep 17 00:00:00 2001
From: Joshua Batista <jbatista at microsoft.com>
Date: Tue, 23 Dec 2025 11:05:44 -0800
Subject: [PATCH 2/4] add shader module flag setting logic
---
clang/include/clang/Basic/CodeGenOptions.def | 3 +++
clang/include/clang/Options/Options.td | 5 ++--
clang/lib/CodeGen/CGHLSLRuntime.cpp | 4 ++-
.../test/CodeGenHLSL/all-resources-bound.hlsl | 7 ++++++
llvm/lib/Target/DirectX/DXILShaderFlags.cpp | 7 ++++++
.../ShaderFlags/all-resources-bound.ll | 25 +++++++++++++++++++
6 files changed, 48 insertions(+), 3 deletions(-)
create mode 100644 clang/test/CodeGenHLSL/all-resources-bound.hlsl
create mode 100644 llvm/test/CodeGen/DirectX/ShaderFlags/all-resources-bound.ll
diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def
index a059803c433e3..06e3e4cd564b1 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -488,6 +488,9 @@ CODEGENOPT(StaticClosure, 1, 0, Benign)
/// Assume that UAVs/SRVs may alias
CODEGENOPT(ResMayAlias, 1, 0, Benign)
+/// Assume that not all resources are bound
+CODEGENOPT(AllResourcesBound, 1, 0, Benign)
+
/// Controls how unwind v2 (epilog) information should be generated for x64
/// Windows.
ENUM_CODEGENOPT(WinX64EHUnwindV2, WinX64EHUnwindV2Mode,
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 8a032317a71c4..04756ce486eaf 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -9614,10 +9614,11 @@ class DXCJoinedOrSeparate<string name> : Option<["/", "-"], name,
def dxc_all_resources_bound : DXCFlag<"all-resources-bound">,
HelpText<"Enables agressive flattening">;
-def hlsl_all_resources_bound : Option<["-"], "hlsl-all-resources-bound", KIND_SEPARATE>,
+def hlsl_all_resources_bound : Option<["/", "-"], "hlsl-all-resources-bound", KIND_FLAG>,
Group<dxc_Group>,
Visibility<[ClangOption, CC1Option]>,
- HelpText<"Enables agressive flattening">;
+ HelpText<"Enables agressive flattening">,
+ MarshallingInfoFlag<CodeGenOpts<"AllResourcesBound">>;
def dxc_col_major : DXCFlag<"Zpc">, HelpText<"Pack matrices in column-major order">;
def dxc_row_major : DXCFlag<"Zpr">, HelpText<"Pack matrices in row-major order">;
def dxc_no_stdinc : DXCFlag<"hlsl-no-stdinc">,
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp
index 2e9602d1b3793..4c0349d4be7bf 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.cpp
+++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp
@@ -483,7 +483,9 @@ void CGHLSLRuntime::finishCodeGen() {
addDxilValVersion(TargetOpts.DxilValidatorVersion, M);
if (CodeGenOpts.ResMayAlias)
M.setModuleFlag(llvm::Module::ModFlagBehavior::Error, "dx.resmayalias", 1);
-
+ if (CodeGenOpts.AllResourcesBound)
+ M.setModuleFlag(llvm::Module::ModFlagBehavior::Error,
+ "dx.allresourcesbound", 1);
// NativeHalfType corresponds to the -fnative-half-type clang option which is
// aliased by clang-dxc's -enable-16bit-types option. This option is used to
// set the UseNativeLowPrecision DXIL module flag in the DirectX backend
diff --git a/clang/test/CodeGenHLSL/all-resources-bound.hlsl b/clang/test/CodeGenHLSL/all-resources-bound.hlsl
new file mode 100644
index 0000000000000..22703cc6eb0e5
--- /dev/null
+++ b/clang/test/CodeGenHLSL/all-resources-bound.hlsl
@@ -0,0 +1,7 @@
+// RUN: %clang_dxc -all-resources-bound -T lib_6_3 -HV 202x -Vd -Xclang -emit-llvm %s | FileCheck %s --check-prefix=FLAG
+// RUN: %clang_dxc -T lib_6_3 -HV 202x -Xclang -emit-llvm %s | FileCheck %s --check-prefix=NOFLAG
+
+// FLAG-DAG: ![[ARB:.*]] = !{i32 1, !"dx.allresourcesbound", i32 1}
+// FLAG-DAG: !llvm.module.flags = !{{{.*}}![[ARB]]{{.*}}}
+
+// NOFLAG-NOT: dx.allresourcesbound
diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
index e0049dc75c0db..a4320209c53d6 100644
--- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
+++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
@@ -287,6 +287,13 @@ ModuleShaderFlags::gatherGlobalModuleFlags(const Module &M,
if (CanSetResMayNotAlias && MMDI.ValidatorVersion < VersionTuple(1, 8))
CSF.ResMayNotAlias = !DRM.uavs().empty();
+ // The command line option -all-resources-bound will set the
+ // dx.allresourcesbound module flag to 1
+ if (auto *AllResourcesBound = mdconst::extract_or_null<ConstantInt>(
+ M.getModuleFlag("dx.allresourcesbound")))
+ if (AllResourcesBound->getValue().getBoolValue())
+ CSF.AllResourcesBound = true;
+
return CSF;
}
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/all-resources-bound.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/all-resources-bound.ll
new file mode 100644
index 0000000000000..14ddcfafdf5de
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/all-resources-bound.ll
@@ -0,0 +1,25 @@
+; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
+
+; This test checks to ensure that setting the LLVM module flag
+; "dx.allresourcesbound" to 1 sets the corresponding DXIL shader flag
+
+target triple = "dxil-pc-shadermodel6.8-library"
+
+; CHECK: Combined Shader Flags for Module
+; CHECK-NEXT: Shader Flags Value: 0x00000100
+
+; CHECK: Note: shader requires additional functionality:
+; CHECK-NEXT: extra DXIL module flags:
+; CHECK-NEXT: All resources bound for the duration of shader execution
+
+
+; CHECK: Function main : 0x00000100
+define float @main() #0 {
+ ret float 0.0
+}
+
+!llvm.module.flags = !{!0}
+
+!0 = !{i32 1, !"dx.allresourcesbound", i32 1}
+
+attributes #0 = { convergent norecurse nounwind "hlsl.export"}
>From d7c48b48dce66296c724067da7cbbcd6f28edfa2 Mon Sep 17 00:00:00 2001
From: Joshua Batista <jbatista at microsoft.com>
Date: Tue, 23 Dec 2025 13:49:13 -0800
Subject: [PATCH 3/4] remove - because sometimes it's /
---
clang/test/Options/all_resources_bound.hlsl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/test/Options/all_resources_bound.hlsl b/clang/test/Options/all_resources_bound.hlsl
index 2dc1795bfb286..7ac70fddf1aa8 100644
--- a/clang/test/Options/all_resources_bound.hlsl
+++ b/clang/test/Options/all_resources_bound.hlsl
@@ -1,8 +1,8 @@
// RUN: %clang_dxc -T lib_6_4 -all-resources-bound %s 2>&1 -### | FileCheck -check-prefix=ARB %s
// RUN: %clang_dxc -T lib_6_4 %s 2>&1 -### | FileCheck -check-prefix=NO_ARB %s
-// ARB: "-hlsl-all-resources-bound"
-// NO_ARB-NOT: "-hlsl-all-resources-bound"
+// ARB: "hlsl-all-resources-bound"
+// NO_ARB-NOT: "hlsl-all-resources-bound"
// assert expected CC1 option is present
float4 main(float4 a : A) : SV_TARGET
{
>From 8443a392a10a99b404c2cef1755d374f9bbd9afd Mon Sep 17 00:00:00 2001
From: Joshua Batista <jbatista at microsoft.com>
Date: Tue, 23 Dec 2025 14:17:13 -0800
Subject: [PATCH 4/4] remove the double quotes
---
clang/test/Options/all_resources_bound.hlsl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/test/Options/all_resources_bound.hlsl b/clang/test/Options/all_resources_bound.hlsl
index 7ac70fddf1aa8..4c8fe7124f3be 100644
--- a/clang/test/Options/all_resources_bound.hlsl
+++ b/clang/test/Options/all_resources_bound.hlsl
@@ -1,8 +1,8 @@
// RUN: %clang_dxc -T lib_6_4 -all-resources-bound %s 2>&1 -### | FileCheck -check-prefix=ARB %s
// RUN: %clang_dxc -T lib_6_4 %s 2>&1 -### | FileCheck -check-prefix=NO_ARB %s
-// ARB: "hlsl-all-resources-bound"
-// NO_ARB-NOT: "hlsl-all-resources-bound"
+// ARB: hlsl-all-resources-bound
+// NO_ARB-NOT: hlsl-all-resources-bound
// assert expected CC1 option is present
float4 main(float4 a : A) : SV_TARGET
{
More information about the llvm-commits
mailing list