Skip to content

[NFC][HLSL] Rename ResourceBinding Types #134165

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

Merged
merged 3 commits into from
Apr 4, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 19 additions & 23 deletions llvm/include/llvm/Analysis/DXILResource.h
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@ class ResourceTypeInfo {

//===----------------------------------------------------------------------===//

class ResourceBindingInfo {
class ResourceInfo {
public:
struct ResourceBinding {
uint32_t RecordID;
Expand All @@ -353,9 +353,9 @@ class ResourceBindingInfo {
GlobalVariable *Symbol = nullptr;

public:
ResourceBindingInfo(uint32_t RecordID, uint32_t Space, uint32_t LowerBound,
uint32_t Size, TargetExtType *HandleTy,
GlobalVariable *Symbol = nullptr)
ResourceInfo(uint32_t RecordID, uint32_t Space, uint32_t LowerBound,
uint32_t Size, TargetExtType *HandleTy,
GlobalVariable *Symbol = nullptr)
: Binding{RecordID, Space, LowerBound, Size}, HandleTy(HandleTy),
Symbol(Symbol) {}

Expand All @@ -372,14 +372,12 @@ class ResourceBindingInfo {
std::pair<uint32_t, uint32_t>
getAnnotateProps(Module &M, dxil::ResourceTypeInfo &RTI) const;

bool operator==(const ResourceBindingInfo &RHS) const {
bool operator==(const ResourceInfo &RHS) const {
return std::tie(Binding, HandleTy, Symbol) ==
std::tie(RHS.Binding, RHS.HandleTy, RHS.Symbol);
}
bool operator!=(const ResourceBindingInfo &RHS) const {
return !(*this == RHS);
}
bool operator<(const ResourceBindingInfo &RHS) const {
bool operator!=(const ResourceInfo &RHS) const { return !(*this == RHS); }
bool operator<(const ResourceInfo &RHS) const {
return Binding < RHS.Binding;
}

Expand Down Expand Up @@ -441,7 +439,7 @@ ModulePass *createDXILResourceTypeWrapperPassPass();
//===----------------------------------------------------------------------===//

class DXILBindingMap {
SmallVector<dxil::ResourceBindingInfo> Infos;
SmallVector<dxil::ResourceInfo> Infos;
DenseMap<CallInst *, unsigned> CallMap;
unsigned FirstUAV = 0;
unsigned FirstCBuffer = 0;
Expand All @@ -451,8 +449,8 @@ class DXILBindingMap {
void populate(Module &M, DXILResourceTypeMap &DRTM);

public:
using iterator = SmallVector<dxil::ResourceBindingInfo>::iterator;
using const_iterator = SmallVector<dxil::ResourceBindingInfo>::const_iterator;
using iterator = SmallVector<dxil::ResourceInfo>::iterator;
using const_iterator = SmallVector<dxil::ResourceInfo>::const_iterator;

iterator begin() { return Infos.begin(); }
const_iterator begin() const { return Infos.begin(); }
Expand All @@ -466,12 +464,12 @@ class DXILBindingMap {
return Pos == CallMap.end() ? Infos.end() : (Infos.begin() + Pos->second);
}

/// Resolves a resource handle into a vector of ResourceBindingInfos that
/// Resolves a resource handle into a vector of ResourceInfos that
/// represent the possible unique creations of the handle. Certain cases are
/// ambiguous so multiple creation instructions may be returned. The resulting
/// ResourceBindingInfo can be used to depuplicate unique handles that
/// ResourceInfo can be used to depuplicate unique handles that
/// reference the same resource
SmallVector<dxil::ResourceBindingInfo> findByUse(const Value *Key) const;
SmallVector<dxil::ResourceInfo> findByUse(const Value *Key) const;

const_iterator find(const CallInst *Key) const {
auto Pos = CallMap.find(Key);
Expand Down Expand Up @@ -521,13 +519,12 @@ class DXILBindingMap {
void print(raw_ostream &OS, DXILResourceTypeMap &DRTM,
const DataLayout &DL) const;

friend class DXILResourceBindingAnalysis;
friend class DXILResourceAnalysis;
friend class DXILResourceBindingWrapperPass;
};

class DXILResourceBindingAnalysis
: public AnalysisInfoMixin<DXILResourceBindingAnalysis> {
friend AnalysisInfoMixin<DXILResourceBindingAnalysis>;
class DXILResourceAnalysis : public AnalysisInfoMixin<DXILResourceAnalysis> {
friend AnalysisInfoMixin<DXILResourceAnalysis>;

static AnalysisKey Key;

Expand All @@ -538,13 +535,12 @@ class DXILResourceBindingAnalysis
DXILBindingMap run(Module &M, ModuleAnalysisManager &AM);
};

/// Printer pass for the \c DXILResourceBindingAnalysis results.
class DXILResourceBindingPrinterPass
: public PassInfoMixin<DXILResourceBindingPrinterPass> {
/// Printer pass for the \c DXILResourceAnalysis results.
class DXILResourcePrinterPass : public PassInfoMixin<DXILResourcePrinterPass> {
raw_ostream &OS;

public:
explicit DXILResourceBindingPrinterPass(raw_ostream &OS) : OS(OS) {}
explicit DXILResourcePrinterPass(raw_ostream &OS) : OS(OS) {}

PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);

Expand Down
65 changes: 31 additions & 34 deletions llvm/lib/Analysis/DXILResource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -531,17 +531,17 @@ void ResourceTypeInfo::print(raw_ostream &OS, const DataLayout &DL) const {
}
}

GlobalVariable *ResourceBindingInfo::createSymbol(Module &M, StructType *Ty,
StringRef Name) {
GlobalVariable *ResourceInfo::createSymbol(Module &M, StructType *Ty,
StringRef Name) {
assert(!Symbol && "Symbol has already been created");
Symbol = new GlobalVariable(M, Ty, /*isConstant=*/true,
GlobalValue::ExternalLinkage,
/*Initializer=*/nullptr, Name);
return Symbol;
}

MDTuple *ResourceBindingInfo::getAsMetadata(Module &M,
dxil::ResourceTypeInfo &RTI) const {
MDTuple *ResourceInfo::getAsMetadata(Module &M,
dxil::ResourceTypeInfo &RTI) const {
LLVMContext &Ctx = M.getContext();
const DataLayout &DL = M.getDataLayout();

Expand Down Expand Up @@ -610,8 +610,7 @@ MDTuple *ResourceBindingInfo::getAsMetadata(Module &M,
}

std::pair<uint32_t, uint32_t>
ResourceBindingInfo::getAnnotateProps(Module &M,
dxil::ResourceTypeInfo &RTI) const {
ResourceInfo::getAnnotateProps(Module &M, dxil::ResourceTypeInfo &RTI) const {
const DataLayout &DL = M.getDataLayout();

uint32_t ResourceKind = llvm::to_underlying(RTI.getResourceKind());
Expand Down Expand Up @@ -658,8 +657,8 @@ ResourceBindingInfo::getAnnotateProps(Module &M,
return {Word0, Word1};
}

void ResourceBindingInfo::print(raw_ostream &OS, dxil::ResourceTypeInfo &RTI,
const DataLayout &DL) const {
void ResourceInfo::print(raw_ostream &OS, dxil::ResourceTypeInfo &RTI,
const DataLayout &DL) const {
if (Symbol) {
OS << " Symbol: ";
Symbol->printAsOperand(OS);
Expand Down Expand Up @@ -687,8 +686,7 @@ bool DXILResourceTypeMap::invalidate(Module &M, const PreservedAnalyses &PA,
//===----------------------------------------------------------------------===//

void DXILBindingMap::populate(Module &M, DXILResourceTypeMap &DRTM) {
SmallVector<std::tuple<CallInst *, ResourceBindingInfo, ResourceTypeInfo>>
CIToInfos;
SmallVector<std::tuple<CallInst *, ResourceInfo, ResourceTypeInfo>> CIToInfos;

for (Function &F : M.functions()) {
if (!F.isDeclaration())
Expand All @@ -711,10 +709,10 @@ void DXILBindingMap::populate(Module &M, DXILResourceTypeMap &DRTM) {
cast<ConstantInt>(CI->getArgOperand(1))->getZExtValue();
uint32_t Size =
cast<ConstantInt>(CI->getArgOperand(2))->getZExtValue();
ResourceBindingInfo RBI = ResourceBindingInfo{
/*RecordID=*/0, Space, LowerBound, Size, HandleTy};
ResourceInfo RI =
ResourceInfo{/*RecordID=*/0, Space, LowerBound, Size, HandleTy};

CIToInfos.emplace_back(CI, RBI, RTI);
CIToInfos.emplace_back(CI, RI, RTI);
}

break;
Expand All @@ -723,18 +721,18 @@ void DXILBindingMap::populate(Module &M, DXILResourceTypeMap &DRTM) {
}

llvm::stable_sort(CIToInfos, [](auto &LHS, auto &RHS) {
const auto &[LCI, LRBI, LRTI] = LHS;
const auto &[RCI, RRBI, RRTI] = RHS;
const auto &[LCI, LRI, LRTI] = LHS;
const auto &[RCI, RRI, RRTI] = RHS;
// Sort by resource class first for grouping purposes, and then by the
// binding and type so we can remove duplicates.
ResourceClass LRC = LRTI.getResourceClass();
ResourceClass RRC = RRTI.getResourceClass();

return std::tie(LRC, LRBI, LRTI) < std::tie(RRC, RRBI, RRTI);
return std::tie(LRC, LRI, LRTI) < std::tie(RRC, RRI, RRTI);
});
for (auto [CI, RBI, RTI] : CIToInfos) {
if (Infos.empty() || RBI != Infos.back())
Infos.push_back(RBI);
for (auto [CI, RI, RTI] : CIToInfos) {
if (Infos.empty() || RI != Infos.back())
Infos.push_back(RI);
CallMap[CI] = Infos.size() - 1;
}

Expand All @@ -743,8 +741,8 @@ void DXILBindingMap::populate(Module &M, DXILResourceTypeMap &DRTM) {
FirstUAV = FirstCBuffer = FirstSampler = Size;
uint32_t NextID = 0;
for (unsigned I = 0, E = Size; I != E; ++I) {
ResourceBindingInfo &RBI = Infos[I];
ResourceTypeInfo &RTI = DRTM[RBI.getHandleTy()];
ResourceInfo &RI = Infos[I];
ResourceTypeInfo &RTI = DRTM[RI.getHandleTy()];
if (RTI.isUAV() && FirstUAV == Size) {
FirstUAV = I;
NextID = 0;
Expand All @@ -762,16 +760,16 @@ void DXILBindingMap::populate(Module &M, DXILResourceTypeMap &DRTM) {
FirstUAV = std::min({FirstUAV, FirstCBuffer});

// Adjust the resource binding to use the next ID.
RBI.setBindingID(NextID++);
RI.setBindingID(NextID++);
}
}

void DXILBindingMap::print(raw_ostream &OS, DXILResourceTypeMap &DRTM,
const DataLayout &DL) const {
for (unsigned I = 0, E = Infos.size(); I != E; ++I) {
OS << "Binding " << I << ":\n";
const dxil::ResourceBindingInfo &RBI = Infos[I];
RBI.print(OS, DRTM[RBI.getHandleTy()], DL);
const dxil::ResourceInfo &RI = Infos[I];
RI.print(OS, DRTM[RI.getHandleTy()], DL);
OS << "\n";
}

Expand All @@ -782,10 +780,10 @@ void DXILBindingMap::print(raw_ostream &OS, DXILResourceTypeMap &DRTM,
}
}

SmallVector<dxil::ResourceBindingInfo>
SmallVector<dxil::ResourceInfo>
DXILBindingMap::findByUse(const Value *Key) const {
if (const PHINode *Phi = dyn_cast<PHINode>(Key)) {
SmallVector<dxil::ResourceBindingInfo> Children;
SmallVector<dxil::ResourceInfo> Children;
for (const Value *V : Phi->operands()) {
Children.append(findByUse(V));
}
Expand All @@ -810,7 +808,7 @@ DXILBindingMap::findByUse(const Value *Key) const {
// Check if any of the parameters are the resource we are following. If so
// keep searching. If none of them are return an empty list
const Type *UseType = CI->getType();
SmallVector<dxil::ResourceBindingInfo> Children;
SmallVector<dxil::ResourceInfo> Children;
for (const Value *V : CI->args()) {
if (V->getType() != UseType)
continue;
Expand All @@ -824,19 +822,18 @@ DXILBindingMap::findByUse(const Value *Key) const {
//===----------------------------------------------------------------------===//

AnalysisKey DXILResourceTypeAnalysis::Key;
AnalysisKey DXILResourceBindingAnalysis::Key;
AnalysisKey DXILResourceAnalysis::Key;

DXILBindingMap DXILResourceBindingAnalysis::run(Module &M,
ModuleAnalysisManager &AM) {
DXILBindingMap DXILResourceAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
DXILBindingMap Data;
DXILResourceTypeMap &DRTM = AM.getResult<DXILResourceTypeAnalysis>(M);
Data.populate(M, DRTM);
return Data;
}

PreservedAnalyses
DXILResourceBindingPrinterPass::run(Module &M, ModuleAnalysisManager &AM) {
DXILBindingMap &DBM = AM.getResult<DXILResourceBindingAnalysis>(M);
PreservedAnalyses DXILResourcePrinterPass::run(Module &M,
ModuleAnalysisManager &AM) {
DXILBindingMap &DBM = AM.getResult<DXILResourceAnalysis>(M);
DXILResourceTypeMap &DRTM = AM.getResult<DXILResourceTypeAnalysis>(M);

DBM.print(OS, DRTM, M.getDataLayout());
Expand Down Expand Up @@ -895,7 +892,7 @@ LLVM_DUMP_METHOD
void DXILResourceBindingWrapperPass::dump() const { print(dbgs(), nullptr); }
#endif

INITIALIZE_PASS(DXILResourceBindingWrapperPass, "dxil-resource-binding",
INITIALIZE_PASS(DXILResourceBindingWrapperPass, "dxil-resource",
"DXIL Resource Binding Analysis", false, true)
char DXILResourceBindingWrapperPass::ID = 0;

Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/Passes/PassRegistry.def
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ MODULE_ANALYSIS("callgraph", CallGraphAnalysis())
MODULE_ANALYSIS("collector-metadata", CollectorMetadataAnalysis())
MODULE_ANALYSIS("ctx-prof-analysis", CtxProfAnalysis())
MODULE_ANALYSIS("dxil-metadata", DXILMetadataAnalysis())
MODULE_ANALYSIS("dxil-resource-binding", DXILResourceBindingAnalysis())
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure that it matters but it could be argued that this change invalidates the NFC status of this PR.

It technically changes the CLI API for the shader compiler but only for explicitly listing the pass names.

MODULE_ANALYSIS("dxil-resource", DXILResourceAnalysis())
MODULE_ANALYSIS("dxil-resource-type", DXILResourceTypeAnalysis())
MODULE_ANALYSIS("inline-advisor", InlineAdvisorAnalysis())
MODULE_ANALYSIS("ir-similarity", IRSimilarityAnalysis())
Expand Down Expand Up @@ -128,8 +128,8 @@ MODULE_PASS("print-must-be-executed-contexts",
MODULE_PASS("print-profile-summary", ProfileSummaryPrinterPass(errs()))
MODULE_PASS("print-stack-safety", StackSafetyGlobalPrinterPass(errs()))
MODULE_PASS("print<dxil-metadata>", DXILMetadataAnalysisPrinterPass(errs()))
MODULE_PASS("print<dxil-resource-binding>",
DXILResourceBindingPrinterPass(errs()))
MODULE_PASS("print<dxil-resource>",
DXILResourcePrinterPass(errs()))
MODULE_PASS("print<inline-advisor>", InlineAdvisorAnalysisPrinterPass(errs()))
MODULE_PASS("print<module-debuginfo>", ModuleDebugInfoPrinterPass(errs()))
MODULE_PASS("print<reg-usage>", PhysicalRegisterUsageInfoPrinterPass(errs()))
Expand Down
26 changes: 11 additions & 15 deletions llvm/lib/Target/DirectX/DXContainerGlobals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ void DXContainerGlobals::addResourcesForPSV(Module &M, PSVRuntimeInfo &PSV) {
getAnalysis<DXILResourceTypeWrapperPass>().getResourceTypeMap();

auto MakeBinding =
[](const dxil::ResourceBindingInfo::ResourceBinding &Binding,
[](const dxil::ResourceInfo::ResourceBinding &Binding,
const dxbc::PSV::ResourceType Type, const dxil::ResourceKind Kind,
const dxbc::PSV::ResourceFlags Flags = dxbc::PSV::ResourceFlags()) {
dxbc::PSV::v2::ResourceBindInfo BindInfo;
Expand All @@ -200,24 +200,21 @@ void DXContainerGlobals::addResourcesForPSV(Module &M, PSVRuntimeInfo &PSV) {
return BindInfo;
};

for (const dxil::ResourceBindingInfo &RBI : DBM.cbuffers()) {
const dxil::ResourceBindingInfo::ResourceBinding &Binding =
RBI.getBinding();
for (const dxil::ResourceInfo &RI : DBM.cbuffers()) {
const dxil::ResourceInfo::ResourceBinding &Binding = RI.getBinding();
PSV.Resources.push_back(MakeBinding(Binding, dxbc::PSV::ResourceType::CBV,
dxil::ResourceKind::CBuffer));
}
for (const dxil::ResourceBindingInfo &RBI : DBM.samplers()) {
const dxil::ResourceBindingInfo::ResourceBinding &Binding =
RBI.getBinding();
for (const dxil::ResourceInfo &RI : DBM.samplers()) {
const dxil::ResourceInfo::ResourceBinding &Binding = RI.getBinding();
PSV.Resources.push_back(MakeBinding(Binding,
dxbc::PSV::ResourceType::Sampler,
dxil::ResourceKind::Sampler));
}
for (const dxil::ResourceBindingInfo &RBI : DBM.srvs()) {
const dxil::ResourceBindingInfo::ResourceBinding &Binding =
RBI.getBinding();
for (const dxil::ResourceInfo &RI : DBM.srvs()) {
const dxil::ResourceInfo::ResourceBinding &Binding = RI.getBinding();

dxil::ResourceTypeInfo &TypeInfo = DRTM[RBI.getHandleTy()];
dxil::ResourceTypeInfo &TypeInfo = DRTM[RI.getHandleTy()];
dxbc::PSV::ResourceType ResType;
if (TypeInfo.isStruct())
ResType = dxbc::PSV::ResourceType::SRVStructured;
Expand All @@ -229,11 +226,10 @@ void DXContainerGlobals::addResourcesForPSV(Module &M, PSVRuntimeInfo &PSV) {
PSV.Resources.push_back(
MakeBinding(Binding, ResType, TypeInfo.getResourceKind()));
}
for (const dxil::ResourceBindingInfo &RBI : DBM.uavs()) {
const dxil::ResourceBindingInfo::ResourceBinding &Binding =
RBI.getBinding();
for (const dxil::ResourceInfo &RI : DBM.uavs()) {
const dxil::ResourceInfo::ResourceBinding &Binding = RI.getBinding();

dxil::ResourceTypeInfo &TypeInfo = DRTM[RBI.getHandleTy()];
dxil::ResourceTypeInfo &TypeInfo = DRTM[RI.getHandleTy()];
dxbc::PSV::ResourceType ResType;
if (TypeInfo.getUAV().HasCounter)
ResType = dxbc::PSV::ResourceType::UAVStructuredWithCounter;
Expand Down
Loading
Loading