================ @@ -951,6 +952,108 @@ void SemaHLSL::emitLogicalOperatorFixIt(Expr *LHS, Expr *RHS, << NewFnName << FixItHint::CreateReplacement(FullRange, OS.str()); } +namespace { + +// A resource range overlaps with another resource range if they have: +// - equivalent ResourceClass (SRV, UAV, CBuffer, Sampler) +// - equivalent resource space +// - overlapping visbility +class ResourceRanges { +public: + // KeyT: 32-lsb denotes resource space, and 32-msb denotes resource type enum + using KeyT = uint64_t; + + static const unsigned NumVisEnums = + (unsigned)llvm::hlsl::rootsig::ShaderVisibility::NumEnums; + +private: + llvm::hlsl::rootsig::ResourceRange::IMap::Allocator Allocator; + + // Denotes a mapping of a unique combination of ResourceClass and register + // space to a ResourceRange + using MapT = llvm::SmallDenseMap<KeyT, llvm::hlsl::rootsig::ResourceRange>; + + // Denotes a mapping for each unique visibility + MapT RangeMaps[NumVisEnums]; + + constexpr static KeyT getKey(const llvm::hlsl::rootsig::RangeInfo &Info) { + uint64_t SpacePacked = (uint64_t)Info.Space; + uint64_t ClassPacked = (uint64_t)llvm::to_underlying(Info.Class); + return (ClassPacked << 32) | SpacePacked; + } + +public: + // Returns std::nullopt if there was no collision. Otherwise, it will + // return the RangeInfo of the collision + std::optional<const llvm::hlsl::rootsig::RangeInfo *> + addRange(const llvm::hlsl::rootsig::RangeInfo &Info) { + MapT &VisRangeMap = RangeMaps[llvm::to_underlying(Info.Vis)]; + auto [It, _] = VisRangeMap.insert( + {getKey(Info), llvm::hlsl::rootsig::ResourceRange(Allocator)}); + auto Res = It->second.insert(Info); + if (Res.has_value()) + return Res; + + MutableArrayRef<MapT> Maps = ---------------- Icohedron wrote:
Perhaps a comment here would be helpful to explain more clearly what this and the following loop are doing. https://github.com/llvm/llvm-project/pull/140962 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits