-
Notifications
You must be signed in to change notification settings - Fork 14.7k
[HLSL][DirectX] Add the Qdx-rootsignature-strip
driver option
#152196
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
- adds the driver option to the `Clang` and `CC1` driver options - adds the DXC compatible `Qstrip-rootsignature` driver option as an alias
- this commit proposes to store the metadata information as the first operand of the named `dx.rootsignature` metadata
@llvm/pr-subscribers-hlsl @llvm/pr-subscribers-backend-directx Author: Finn Plummer (inbelic) ChangesThis pr adds the It implements this by storing the flag information as part of the named The other option is to have a separate named metadata like Relevant added tests are:
All other test modifications are just to account for changes in metadata format. Resolves: #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:
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]
|
@llvm/pr-subscribers-clang-driver Author: Finn Plummer (inbelic) ChangesThis pr adds the It implements this by storing the flag information as part of the named The other option is to have a separate named metadata like Relevant added tests are:
All other test modifications are just to account for changes in metadata format. Resolves: #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:
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]
|
From discussion, turning this back into a draft to investigate if we could have a |
This pr adds the
Qdx-rootsignature-strip
to theClang
andCC1
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 todx.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: #150275.