[llvm-branch-commits] [clang] [llvm] [DirectX] Add Range Overlap validation to `DXILPostOptimizationValidation.cpp` (PR #148919)
Joshua Batista via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Jul 17 11:29:36 PDT 2025
================
@@ -260,6 +260,93 @@ getRootSignature(RootSignatureBindingInfo &RSBI,
return RootSigDesc;
}
+static void
+reportOverlappingRegisters(Module &M,
+ llvm::hlsl::rootsig::OverlappingRanges Overlap) {
+ const llvm::hlsl::rootsig::RangeInfo *Info = Overlap.A;
+ const llvm::hlsl::rootsig::RangeInfo *OInfo = Overlap.B;
+ SmallString<128> Message;
+ raw_svector_ostream OS(Message);
+ OS << "register " << ResourceClassToString(Info->Class)
+ << " (space=" << Info->Space << ", register=" << Info->LowerBound << ")"
+ << " is overlapping with"
+ << " register " << ResourceClassToString(OInfo->Class)
+ << " (space=" << OInfo->Space << ", register=" << OInfo->LowerBound << ")"
+ << ", verify your root signature definition";
+
+ M.getContext().diagnose(DiagnosticInfoGeneric(Message));
+}
+
+static bool reportOverlappingRanges(Module &M,
+ const mcdxbc::RootSignatureDesc &RSD) {
+ using namespace llvm::hlsl::rootsig;
+
+ llvm::SmallVector<RangeInfo> Infos;
+
+ for (size_t I = 0; I < RSD.ParametersContainer.size(); I++) {
+ const auto &[Type, Loc] =
+ RSD.ParametersContainer.getTypeAndLocForParameter(I);
+ const auto &Header = RSD.ParametersContainer.getHeader(I);
+ switch (Type) {
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
+ dxbc::RTS0::v1::RootConstants Const =
+ RSD.ParametersContainer.getConstant(Loc);
+
+ RangeInfo Info;
+ Info.Space = Const.RegisterSpace;
+ Info.LowerBound = Const.ShaderRegister;
+ Info.UpperBound = Info.LowerBound;
+ Info.Class = ParameterToResourceClass(Type);
+ Info.Visibility = (dxbc::ShaderVisibility)Header.ShaderVisibility;
+
+ Infos.push_back(Info);
+ break;
+ }
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ case llvm::to_underlying(dxbc::RootParameterType::CBV): {
+ dxbc::RTS0::v2::RootDescriptor Desc =
+ RSD.ParametersContainer.getRootDescriptor(Loc);
+
+ RangeInfo Info;
+ Info.Space = Desc.RegisterSpace;
+ Info.LowerBound = Desc.ShaderRegister;
+ Info.UpperBound = Info.LowerBound;
+ Info.Class = ParameterToResourceClass(Type);
+ Info.Visibility = (dxbc::ShaderVisibility)Header.ShaderVisibility;
+
+ Infos.push_back(Info);
+ break;
+ }
+ case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+ const mcdxbc::DescriptorTable &Table =
+ RSD.ParametersContainer.getDescriptorTable(Loc);
+
+ for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
+ RangeInfo Info;
+ Info.Space = Range.RegisterSpace;
+ Info.LowerBound = Range.BaseShaderRegister;
+ Info.UpperBound = Info.LowerBound + ((Range.NumDescriptors == ~0U)
+ ? Range.NumDescriptors
+ : Range.NumDescriptors - 1);
+ Info.Visibility = (dxbc::ShaderVisibility)Header.ShaderVisibility;
+ Info.Class = RangeToResourceClass(Range.RangeType);
----------------
bob80905 wrote:
Nit: it looks like class should be assigned before visibility for consistency
https://github.com/llvm/llvm-project/pull/148919
More information about the llvm-branch-commits
mailing list