[clang] [llvm] [HLSL][DirectX] Add the `Qdx-rootsignature-strip` driver option (PR #152196)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 5 13:30:46 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
@llvm/pr-subscribers-backend-directx
Author: Finn Plummer (inbelic)
<details>
<summary>Changes</summary>
This pr adds the `Qdx-rootsignature-strip` to the `Clang` and `CC1` driver options.
It also adds `Qstrip-rootsignature` as the DXC compatible alias.
It implements this by storing the flag information as part of the named `dx.rootsignature` metadata as the first operand. This allows us to contain all root signature associated metadata field in a single node. Given the nature of its construction this will also be easily extendible to any other root signature specific metadata in the future.
The other option is to have a separate named metadata like `dx.striprootsignature`, similar to `dx.resmayalias`. But this becomes significantly less handy if any more options are added.
Relevant added tests are:
- `clang/test/CodeGenHLSL/dx-rootsignature-strip.hlsl`
- `clang/test/Driver/dxc_Qstrip-rootsignature.hlsl`
- `llvm/test/Analysis/DXILMetadataAnalysis/keep-rootsignature.ll`
- `llvm/test/Analysis/DXILMetadataAnalysis/strip-rootsignature.ll`
- `llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Stripped.ll`
All other test modifications are just to account for changes in metadata format.
Resolves: https://github.com/llvm/llvm-project/issues/150275.
---
Patch is 62.20 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/152196.diff
73 Files Affected:
- (modified) clang/include/clang/Basic/CodeGenOptions.def (+3)
- (modified) clang/include/clang/Driver/Options.td (+10)
- (modified) clang/lib/CodeGen/CGHLSLRuntime.cpp (+12-3)
- (modified) clang/lib/Driver/ToolChains/Clang.cpp (+12-12)
- (modified) clang/lib/Driver/ToolChains/HLSL.cpp (+6)
- (modified) clang/test/CodeGenHLSL/RootSignature.hlsl (+3-1)
- (added) clang/test/CodeGenHLSL/dx-rootsignature-strip.hlsl (+15)
- (added) clang/test/Driver/dxc_Qstrip-rootsignature.hlsl (+17)
- (modified) llvm/include/llvm/Analysis/DXILMetadataAnalysis.h (+1)
- (modified) llvm/lib/Analysis/DXILMetadataAnalysis.cpp (+13)
- (modified) llvm/lib/Target/DirectX/DXContainerGlobals.cpp (+4)
- (modified) llvm/lib/Target/DirectX/DXILRootSignature.cpp (+10-1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.0.ll (+1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.8.ll (+1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/entry-properties.ll (+1)
- (added) llvm/test/Analysis/DXILMetadataAnalysis/keep-rootsignature.ll (+24)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-as.ll (+1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs-val-ver-0.0.ll (+1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs.ll (+1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-gs.ll (+1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-hs.ll (+1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ms.ll (+1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ps.ll (+1)
- (modified) llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-vs.ll (+1)
- (added) llvm/test/Analysis/DXILMetadataAnalysis/strip-rootsignature.ll (+24)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinations.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-NumDescriptors.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-function.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-value.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-no-root-element-list.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-root-element-not-mdnode.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-NullFunction-Error.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll (+5-4)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Multiple-Flags.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootFlags-VisibilityValidationError.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxAnisotropy.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxLod.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLod.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLopBias.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-RegisterSpace.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderRegister.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderVisibility.ll (+2-1)
- (modified) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll (+2-1)
- (added) llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Stripped.ll (+31)
- (modified) llvm/test/CodeGen/DirectX/strip-rootsignatures.ll (+2-1)
``````````diff
diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def
index e137738102544..6411d71633fd2 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -478,6 +478,9 @@ CODEGENOPT(StaticClosure, 1, 0, Benign)
/// Assume that UAVs/SRVs may alias
CODEGENOPT(ResMayAlias, 1, 0, Benign)
+/// Omit the root signature from produced DXContainer
+CODEGENOPT(HLSLRootSigStrip, 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/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 916400efdb449..a27d143f3216c 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -9354,6 +9354,16 @@ def res_may_alias : Option<["/", "-"], "res-may-alias", KIND_FLAG>,
Visibility<[DXCOption, ClangOption, CC1Option]>,
HelpText<"Assume that UAVs/SRVs may alias">,
MarshallingInfoFlag<CodeGenOpts<"ResMayAlias">>;
+def Qdx_rootsignature_strip : Option<["-"], "Qdx-rootsignature-strip", KIND_FLAG>,
+ Group<dxc_Group>,
+ Visibility<[ClangOption, CC1Option]>,
+ HelpText<"Omit the root signature from produced DXContainer">,
+ MarshallingInfoFlag<CodeGenOpts<"HLSLRootSigStrip">>;
+def dxc_Qstrip_rootsignature :
+ Option<["/", "-"], "Qstrip-rootsignature", KIND_FLAG>,
+ Alias<Qdx_rootsignature_strip>,
+ Group<dxc_Group>,
+ Visibility<[DXCOption]>;
def target_profile : DXCJoinedOrSeparate<"T">, MetaVarName<"<profile>">,
HelpText<"Set target profile">,
Values<"ps_6_0, ps_6_1, ps_6_2, ps_6_3, ps_6_4, ps_6_5, ps_6_6, ps_6_7,"
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp
index a47d1cc22980d..0e9061e1a27f2 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.cpp
+++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp
@@ -68,7 +68,8 @@ void addDxilValVersion(StringRef ValVersionStr, llvm::Module &M) {
void addRootSignature(llvm::dxbc::RootSignatureVersion RootSigVer,
ArrayRef<llvm::hlsl::rootsig::RootElement> Elements,
- llvm::Function *Fn, llvm::Module &M) {
+ llvm::Function *Fn, llvm::Module &M,
+ bool StripRootSignature) {
auto &Ctx = M.getContext();
llvm::hlsl::rootsig::MetadataBuilder RSBuilder(Ctx, Elements);
@@ -80,7 +81,14 @@ void addRootSignature(llvm::dxbc::RootSignatureVersion RootSigVer,
MDNode::get(Ctx, {ValueAsMetadata::get(Fn), RootSignature, Version});
StringRef RootSignatureValKey = "dx.rootsignatures";
- auto *RootSignatureValMD = M.getOrInsertNamedMetadata(RootSignatureValKey);
+ NamedMDNode *RootSignatureValMD = M.getNamedMetadata(RootSignatureValKey);
+ if (!RootSignatureValMD) {
+ IRBuilder<> Builder(Ctx);
+ RootSignatureValMD = M.getOrInsertNamedMetadata(RootSignatureValKey);
+ MDNode *InfoMD = MDNode::get(
+ Ctx, {ConstantAsMetadata::get(Builder.getInt1(StripRootSignature))});
+ RootSignatureValMD->addOperand(InfoMD);
+ }
RootSignatureValMD->addOperand(MDVals);
}
@@ -479,11 +487,12 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
B.CreateRetVoid();
// Add and identify root signature to function, if applicable
+ auto &CodeGenOpts = CGM.getCodeGenOpts();
for (const Attr *Attr : FD->getAttrs()) {
if (const auto *RSAttr = dyn_cast<RootSignatureAttr>(Attr)) {
auto *RSDecl = RSAttr->getSignatureDecl();
addRootSignature(RSDecl->getVersion(), RSDecl->getRootElements(), EntryFn,
- M);
+ M, CodeGenOpts.HLSLRootSigStrip);
}
}
}
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 7d0c142ecd061..07dc985c210b1 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -3790,18 +3790,18 @@ static void RenderOpenCLOptions(const ArgList &Args, ArgStringList &CmdArgs,
static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs,
types::ID InputType) {
- const unsigned ForwardedArguments[] = {
- options::OPT_dxil_validator_version,
- options::OPT_res_may_alias,
- options::OPT_D,
- options::OPT_I,
- options::OPT_O,
- options::OPT_emit_llvm,
- options::OPT_emit_obj,
- options::OPT_disable_llvm_passes,
- options::OPT_fnative_half_type,
- options::OPT_hlsl_entrypoint,
- options::OPT_fdx_rootsignature_version};
+ const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version,
+ options::OPT_res_may_alias,
+ options::OPT_D,
+ options::OPT_I,
+ options::OPT_O,
+ options::OPT_emit_llvm,
+ options::OPT_emit_obj,
+ options::OPT_disable_llvm_passes,
+ options::OPT_fnative_half_type,
+ options::OPT_hlsl_entrypoint,
+ options::OPT_fdx_rootsignature_version,
+ options::OPT_Qdx_rootsignature_strip};
if (!types::isHLSL(InputType))
return;
for (const auto &Arg : ForwardedArguments)
diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 38f4643abad98..d4e175b8faa53 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -304,6 +304,12 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
A->claim();
continue;
}
+ if (A->getOption().getID() == options::OPT_dxc_Qstrip_rootsignature) {
+ DAL->AddFlagArg(nullptr,
+ Opts.getOption(options::OPT_Qdx_rootsignature_strip));
+ A->claim();
+ continue;
+ }
if (A->getOption().getID() == options::OPT__SLASH_O) {
StringRef OStr = A->getValue();
if (OStr == "d") {
diff --git a/clang/test/CodeGenHLSL/RootSignature.hlsl b/clang/test/CodeGenHLSL/RootSignature.hlsl
index bc40bdd79ce59..9aa786310198d 100644
--- a/clang/test/CodeGenHLSL/RootSignature.hlsl
+++ b/clang/test/CodeGenHLSL/RootSignature.hlsl
@@ -1,8 +1,10 @@
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -o - %s | FileCheck %s
-// CHECK: !dx.rootsignatures = !{![[#EMPTY_ENTRY:]], ![[#DT_ENTRY:]],
+// CHECK: !dx.rootsignatures = !{![[#LOWER_INFO:]], ![[#EMPTY_ENTRY:]], ![[#DT_ENTRY:]],
// CHECK-SAME: ![[#RF_ENTRY:]], ![[#RC_ENTRY:]], ![[#RD_ENTRY:]], ![[#SS_ENTRY:]]}
+// CHECK: ![[#LOWER_INFO]] = !{i1 false}
+
// CHECK: ![[#EMPTY_ENTRY]] = !{ptr @EmptyEntry, ![[#EMPTY:]], i32 2}
// CHECK: ![[#EMPTY]] = !{}
diff --git a/clang/test/CodeGenHLSL/dx-rootsignature-strip.hlsl b/clang/test/CodeGenHLSL/dx-rootsignature-strip.hlsl
new file mode 100644
index 0000000000000..c8b34ec6e1c00
--- /dev/null
+++ b/clang/test/CodeGenHLSL/dx-rootsignature-strip.hlsl
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -Qdx-rootsignature-strip -triple dxil-pc-shadermodel6.3-compute -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,FLAG
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-compute -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,NOFLAG
+
+// CHECK: !dx.rootsignatures = !{![[#LOWER_INFO:]], ![[#EMPTY_ENTRY:]]}
+// FLAG: ![[#LOWER_INFO]] = !{i1 true}
+// NOFLAG: ![[#LOWER_INFO]] = !{i1 false}
+
+// Ensure root signature metadata is still generated in either case
+// CHECK: ![[#EMPTY_ENTRY]] = !{ptr @EmptyEntry, ![[#EMPTY:]], i32 2}
+// CHECK: ![[#EMPTY]] = !{}
+
+[shader("compute"), RootSignature("")]
+[numthreads(1,1,1)]
+void EmptyEntry() {}
+
diff --git a/clang/test/Driver/dxc_Qstrip-rootsignature.hlsl b/clang/test/Driver/dxc_Qstrip-rootsignature.hlsl
new file mode 100644
index 0000000000000..dc38a646ce444
--- /dev/null
+++ b/clang/test/Driver/dxc_Qstrip-rootsignature.hlsl
@@ -0,0 +1,17 @@
+// RUN: %clang_dxc -Qstrip-rootsignature -T cs_6_3 -HV 202x -Vd -Xclang -emit-llvm %s | FileCheck %s --check-prefixes=CHECK,FLAG
+// RUN: %clang_dxc -T cs_6_3 -HV 202x -Vd -Xclang -emit-llvm %s | FileCheck %s --check-prefixes=CHECK,NOFLAG
+
+// Test to demonstrate that we can specify when to strip the root signature
+// in its metadata
+
+// CHECK: !dx.rootsignatures = !{![[#LOWER_INFO:]], ![[#EMPTY_ENTRY:]]}
+// FLAG: ![[#LOWER_INFO]] = !{i1 true}
+// NOFLAG: ![[#LOWER_INFO]] = !{i1 false}
+
+// Ensure root signature metadata is still generated in either case
+// CHECK: ![[#EMPTY_ENTRY]] = !{ptr @EmptyEntry, ![[#EMPTY:]], i32 2}
+// CHECK: ![[#EMPTY]] = !{}
+
+[shader("compute"), RootSignature("")]
+[numthreads(1,1,1)]
+void EmptyEntry() {}
diff --git a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
index cb535ac14f1c6..be894ec39ed5a 100644
--- a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
+++ b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
@@ -37,6 +37,7 @@ struct ModuleMetadataInfo {
Triple::EnvironmentType ShaderProfile{Triple::UnknownEnvironment};
VersionTuple ValidatorVersion{};
SmallVector<EntryProperties> EntryPropertyVec{};
+ bool StripRootSignature{true};
void print(raw_ostream &OS) const;
};
diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index 23f1aa82ae8a3..63868d26d2316 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -68,6 +68,18 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
}
MMDAI.EntryPropertyVec.push_back(EFP);
}
+ NamedMDNode *RootSignaturesNode = M.getNamedMetadata("dx.rootsignatures");
+ if (RootSignaturesNode) {
+ // Only insert any extra root signature lowering info on insert
+ MDNode *InfoMD = RootSignaturesNode->getOperand(0);
+ [[maybe_unused]] bool HasStripMD =
+ mdconst::hasa<ConstantInt>(InfoMD->getOperand(0));
+ assert(HasStripMD && "Failed to parse Strip Root Signature component");
+ auto *StripRootSignature =
+ mdconst::dyn_extract<ConstantInt>(InfoMD->getOperand(0));
+ if (StripRootSignature)
+ MMDAI.StripRootSignature = StripRootSignature->getZExtValue();
+ }
return MMDAI;
}
@@ -84,6 +96,7 @@ void ModuleMetadataInfo::print(raw_ostream &OS) const {
OS << " NumThreads: " << EP.NumThreadsX << "," << EP.NumThreadsY << ","
<< EP.NumThreadsZ << "\n";
}
+ OS << "Strip Root Signature: " << StripRootSignature << "\n";
}
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index b6e8ce7d78b23..8889d281cee45 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -154,6 +154,10 @@ void DXContainerGlobals::addRootSignature(Module &M,
dxil::ModuleMetadataInfo &MMI =
getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
+ // Compiler flag denotes to not output the root signature part (RTS0)
+ if (MMI.StripRootSignature)
+ return;
+
// Root Signature in Library don't compile to DXContainer.
if (MMI.ShaderProfile == llvm::Triple::Library)
return;
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index dfc81626da01f..60beb4d0c5d5b 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -527,8 +527,17 @@ analyzeModule(Module &M) {
NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
if (RootSignatureNode == nullptr)
return RSDMap;
+ if (RootSignatureNode->getNumOperands() == 0) {
+ reportError(Ctx, "Invalid Root Signature metadata - expected lowering "
+ "info and then Root Signature operands.");
+ return RSDMap;
+ }
+
+ // Ignore the lowering info metadata
+ auto Begin = std::next(RootSignatureNode->op_begin());
+ auto RSNodes = iterator_range(Begin, RootSignatureNode->op_end());
- for (const auto &RSDefNode : RootSignatureNode->operands()) {
+ for (const auto &RSDefNode : RSNodes) {
if (RSDefNode->getNumOperands() != 3) {
reportError(Ctx, "Invalid Root Signature metadata - expected function, "
"signature, and version.");
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.0.ll b/llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.0.ll
index 75c05d86dc781..116554bda4cae 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.0.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.0.ll
@@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.0-vertex"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : vertex
; CHECK-NEXT: NumThreads: 0,0,0
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.8.ll b/llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.8.ll
index 7a2cb51f9c819..0540621e455ae 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.8.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/dxilVer-1.8.ll
@@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.8-compute"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,2,1
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/entry-properties.ll b/llvm/test/Analysis/DXILMetadataAnalysis/entry-properties.ll
index a2c6c3a7952d4..c6f78fb32a185 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/entry-properties.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/entry-properties.ll
@@ -14,6 +14,7 @@ target triple = "dxil-pc-shadermodel6.8-library"
; CHECK-NEXT: entry_cs
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,2,1
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry_as() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/keep-rootsignature.ll b/llvm/test/Analysis/DXILMetadataAnalysis/keep-rootsignature.ll
new file mode 100644
index 0000000000000..6a58b5eac80dd
--- /dev/null
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/keep-rootsignature.ll
@@ -0,0 +1,24 @@
+; RUN: opt -S -passes="print<dxil-metadata>" -disable-output %s 2>&1 | FileCheck %s
+target triple = "dxil-pc-shadermodel6.0-compute"
+
+; CHECK: Shader Model Version : 6.0
+; CHECK-NEXT: DXIL Version : 1.0
+; CHECK-NEXT: Shader Stage : compute
+; CHECK-NEXT: Validator Version : 0
+; CHECK-NEXT: entry
+; CHECK-NEXT: Function Shader Stage : compute
+; CHECK-NEXT: NumThreads: 1,1,1
+; CHECK-NEXT: Strip Root Signature: 0
+; CHECK-EMPTY:
+
+define void @entry() #0 {
+entry:
+ ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+!dx.rootsignatures = !{!0, !2} ; list of function/root signature pairs
+!0 = !{i1 false} ; don't strip root signature
+!2 = !{ ptr @entry, !3, i32 2 } ; function, root signature, version
+!3 = !{} ; empty root signature
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-as.ll b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-as.ll
index 6a8496bf731a3..36ed69e6c1fbb 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-as.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-as.ll
@@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6-amplification"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : amplification
; CHECK-NEXT: NumThreads: 0,0,0
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs-val-ver-0.0.ll b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs-val-ver-0.0.ll
index e09f4fc411433..8370a4231834a 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs-val-ver-0.0.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs-val-ver-0.0.ll
@@ -20,4 +20,5 @@ attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,2,1
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs.ll b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs.ll
index 4d6d696e6b29e..0f0a0a0f2b77a 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-cs.ll
@@ -9,6 +9,7 @@ target triple = "dxil-pc-shadermodel6.6-compute"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : compute
; CHECK-NEXT: NumThreads: 1,2,1
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-gs.ll b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-gs.ll
index e28438901bdfe..2bb555e0be868 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-gs.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-gs.ll
@@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.6-geometry"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : geometry
; CHECK-NEXT: NumThreads: 0,0,0
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-hs.ll b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-hs.ll
index fdec1d857118b..f70833a5e8615 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-hs.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-hs.ll
@@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.6-hull"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : hull
; CHECK-NEXT: NumThreads: 0,0,0
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ms.ll b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ms.ll
index 77bc3bbd85f9f..234c9cc6235f3 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ms.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ms.ll
@@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel6.6-mesh"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : mesh
; CHECK-NEXT: NumThreads: 0,0,0
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ps.ll b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ps.ll
index a02c56dbe17a2..914c47e45184b 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ps.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-ps.ll
@@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel5.0-pixel"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : pixel
; CHECK-NEXT: NumThreads: 0,0,0
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-vs.ll b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-vs.ll
index 107f9fc1f0a24..d7b499aee2636 100644
--- a/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-vs.ll
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/shaderModel-vs.ll
@@ -8,6 +8,7 @@ target triple = "dxil-pc-shadermodel-vertex"
; CHECK-NEXT: entry
; CHECK-NEXT: Function Shader Stage : vertex
; CHECK-NEXT: NumThreads: 0,0,0
+; CHECK-NEXT: Strip Root Signature: 1
; CHECK-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/Analysis/DXILMetadataAnalysis/strip-rootsignature.ll b/llvm/test/Analysis/DXILMetadataAnalysis/strip-rootsignature.ll
new file mode 100644
index 0000000000000..9a2c87f8e5db4
--- /dev/null
+++ b/llvm/test/Analysis/DXILMetadataAnalysis/strip-rootsignature.ll
@@ -0,0 +1,24 @@
+; RUN: opt -S -passes="print<dxil-metadata>" -disable-output %s 2>&1 | FileCheck %s
+target triple = "dxil-pc-shadermodel6.0-compute"
+
+; CHECK: Shader Model Version : 6.0
+; CHECK-NEXT: DXIL Version : 1.0
+; CHECK-NEXT: Shader Stage : compute
+; CHECK-NEXT: Validator Version : 0
+; CHECK-NEXT: entry
+; CHECK-NEXT: Functi...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/152196
More information about the llvm-commits
mailing list