Skip to content

Commit 372ddcd

Browse files
authored
[DXIL][Analysis] Boilerplate for DXILResourceAnalysis pass
Broke this out into its own commit to make the next one easier to review. Pull Request: #100700
1 parent a95ad2d commit 372ddcd

File tree

7 files changed

+138
-1
lines changed

7 files changed

+138
-1
lines changed

llvm/include/llvm/Analysis/DXILResource.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@
99
#ifndef LLVM_ANALYSIS_DXILRESOURCE_H
1010
#define LLVM_ANALYSIS_DXILRESOURCE_H
1111

12+
#include "llvm/ADT/MapVector.h"
13+
#include "llvm/IR/PassManager.h"
1214
#include "llvm/IR/Value.h"
15+
#include "llvm/Pass.h"
1316
#include "llvm/Support/DXILABI.h"
1417

1518
namespace llvm {
19+
class CallInst;
1620
class MDTuple;
1721

1822
namespace dxil {
@@ -214,6 +218,55 @@ class ResourceInfo {
214218
};
215219

216220
} // namespace dxil
221+
222+
using DXILResourceMap = MapVector<CallInst *, dxil::ResourceInfo>;
223+
224+
class DXILResourceAnalysis : public AnalysisInfoMixin<DXILResourceAnalysis> {
225+
friend AnalysisInfoMixin<DXILResourceAnalysis>;
226+
227+
static AnalysisKey Key;
228+
229+
public:
230+
using Result = DXILResourceMap;
231+
232+
/// Gather resource info for the module \c M.
233+
DXILResourceMap run(Module &M, ModuleAnalysisManager &AM);
234+
};
235+
236+
/// Printer pass for the \c DXILResourceAnalysis results.
237+
class DXILResourcePrinterPass : public PassInfoMixin<DXILResourcePrinterPass> {
238+
raw_ostream &OS;
239+
240+
public:
241+
explicit DXILResourcePrinterPass(raw_ostream &OS) : OS(OS) {}
242+
243+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
244+
245+
static bool isRequired() { return true; }
246+
};
247+
248+
class DXILResourceWrapperPass : public ModulePass {
249+
std::unique_ptr<DXILResourceMap> ResourceMap;
250+
251+
public:
252+
static char ID; // Class identification, replacement for typeinfo
253+
254+
DXILResourceWrapperPass();
255+
~DXILResourceWrapperPass() override;
256+
257+
const DXILResourceMap &getResourceMap() const { return *ResourceMap; }
258+
DXILResourceMap &getResourceMap() { return *ResourceMap; }
259+
260+
void getAnalysisUsage(AnalysisUsage &AU) const override;
261+
bool runOnModule(Module &M) override;
262+
void releaseMemory() override;
263+
264+
void print(raw_ostream &OS, const Module *M) const override;
265+
void dump() const;
266+
};
267+
268+
ModulePass *createDXILResourceWrapperPassPass();
269+
217270
} // namespace llvm
218271

219272
#endif // LLVM_ANALYSIS_DXILRESOURCE_H

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ void initializeDAHPass(PassRegistry&);
8484
void initializeDCELegacyPassPass(PassRegistry&);
8585
void initializeDXILMetadataAnalysisWrapperPassPass(PassRegistry &);
8686
void initializeDXILMetadataAnalysisWrapperPrinterPass(PassRegistry &);
87+
void initializeDXILResourceWrapperPassPass(PassRegistry &);
8788
void initializeDeadMachineInstructionElimPass(PassRegistry&);
8889
void initializeDebugifyMachineModulePass(PassRegistry &);
8990
void initializeDependenceAnalysisWrapperPassPass(PassRegistry&);

llvm/include/llvm/LinkAllPasses.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/Analysis/AliasSetTracker.h"
2020
#include "llvm/Analysis/BasicAliasAnalysis.h"
2121
#include "llvm/Analysis/CallPrinter.h"
22+
#include "llvm/Analysis/DXILResource.h"
2223
#include "llvm/Analysis/DomPrinter.h"
2324
#include "llvm/Analysis/GlobalsModRef.h"
2425
#include "llvm/Analysis/Passes.h"
@@ -69,6 +70,7 @@ namespace {
6970
(void) llvm::createCallGraphViewerPass();
7071
(void) llvm::createCFGSimplificationPass();
7172
(void) llvm::createStructurizeCFGPass();
73+
(void) llvm::createDXILResourceWrapperPassPass();
7274
(void) llvm::createDeadArgEliminationPass();
7375
(void) llvm::createDeadCodeEliminationPass();
7476
(void) llvm::createDependenceAnalysisWrapperPass();

llvm/lib/Analysis/Analysis.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ void llvm::initializeAnalysis(PassRegistry &Registry) {
2525
initializeCallGraphDOTPrinterPass(Registry);
2626
initializeCallGraphViewerPass(Registry);
2727
initializeCycleInfoWrapperPassPass(Registry);
28+
initializeDXILResourceWrapperPassPass(Registry);
2829
initializeDependenceAnalysisWrapperPassPass(Registry);
2930
initializeDominanceFrontierWrapperPassPass(Registry);
3031
initializeDomViewerWrapperPassPass(Registry);

llvm/lib/Analysis/DXILResource.cpp

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
#include "llvm/Analysis/DXILResource.h"
1010
#include "llvm/ADT/APInt.h"
1111
#include "llvm/IR/DerivedTypes.h"
12+
#include "llvm/IR/Instructions.h"
1213
#include "llvm/IR/Metadata.h"
14+
#include "llvm/InitializePasses.h"
15+
16+
#define DEBUG_TYPE "dxil-resource"
1317

1418
using namespace llvm;
1519
using namespace dxil;
@@ -326,4 +330,77 @@ std::pair<uint32_t, uint32_t> ResourceInfo::getAnnotateProps() const {
326330
return {Word0, Word1};
327331
}
328332

329-
#define DEBUG_TYPE "dxil-resource"
333+
//===----------------------------------------------------------------------===//
334+
// DXILResourceAnalysis and DXILResourcePrinterPass
335+
336+
// Provide an explicit template instantiation for the static ID.
337+
AnalysisKey DXILResourceAnalysis::Key;
338+
339+
DXILResourceMap DXILResourceAnalysis::run(Module &M,
340+
ModuleAnalysisManager &AM) {
341+
DXILResourceMap Data;
342+
return Data;
343+
}
344+
345+
PreservedAnalyses DXILResourcePrinterPass::run(Module &M,
346+
ModuleAnalysisManager &AM) {
347+
DXILResourceMap &Data =
348+
AM.getResult<DXILResourceAnalysis>(M);
349+
350+
for (const auto &[Handle, Info] : Data) {
351+
OS << "Binding for ";
352+
Handle->print(OS);
353+
OS << "\n";
354+
// TODO: Info.print(OS);
355+
OS << "\n";
356+
}
357+
358+
return PreservedAnalyses::all();
359+
}
360+
361+
//===----------------------------------------------------------------------===//
362+
// DXILResourceWrapperPass
363+
364+
DXILResourceWrapperPass::DXILResourceWrapperPass() : ModulePass(ID) {
365+
initializeDXILResourceWrapperPassPass(*PassRegistry::getPassRegistry());
366+
}
367+
368+
DXILResourceWrapperPass::~DXILResourceWrapperPass() = default;
369+
370+
void DXILResourceWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
371+
AU.setPreservesAll();
372+
}
373+
374+
bool DXILResourceWrapperPass::runOnModule(Module &M) {
375+
ResourceMap.reset(new DXILResourceMap());
376+
return false;
377+
}
378+
379+
void DXILResourceWrapperPass::releaseMemory() { ResourceMap.reset(); }
380+
381+
void DXILResourceWrapperPass::print(raw_ostream &OS, const Module *) const {
382+
if (!ResourceMap) {
383+
OS << "No resource map has been built!\n";
384+
return;
385+
}
386+
for (const auto &[Handle, Info] : *ResourceMap) {
387+
OS << "Binding for ";
388+
Handle->print(OS);
389+
OS << "\n";
390+
// TODO: Info.print(OS);
391+
OS << "\n";
392+
}
393+
}
394+
395+
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
396+
LLVM_DUMP_METHOD
397+
void DXILResourceWrapperPass::dump() const { print(dbgs(), nullptr); }
398+
#endif
399+
400+
INITIALIZE_PASS(DXILResourceWrapperPass, DEBUG_TYPE, "DXIL Resource analysis",
401+
false, true)
402+
char DXILResourceWrapperPass::ID = 0;
403+
404+
ModulePass *llvm::createDXILResourceWrapperPassPass() {
405+
return new DXILResourceWrapperPass();
406+
}

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "llvm/Analysis/DDG.h"
3434
#include "llvm/Analysis/DDGPrinter.h"
3535
#include "llvm/Analysis/DXILMetadataAnalysis.h"
36+
#include "llvm/Analysis/DXILResource.h"
3637
#include "llvm/Analysis/Delinearization.h"
3738
#include "llvm/Analysis/DemandedBits.h"
3839
#include "llvm/Analysis/DependenceAnalysis.h"

llvm/lib/Passes/PassRegistry.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ MODULE_ANALYSIS("callgraph", CallGraphAnalysis())
2222
MODULE_ANALYSIS("collector-metadata", CollectorMetadataAnalysis())
2323
MODULE_ANALYSIS("ctx-prof-analysis", CtxProfAnalysis(UseCtxProfile))
2424
MODULE_ANALYSIS("dxil-metadata", DXILMetadataAnalysis())
25+
MODULE_ANALYSIS("dxil-resource", DXILResourceAnalysis())
2526
MODULE_ANALYSIS("inline-advisor", InlineAdvisorAnalysis())
2627
MODULE_ANALYSIS("ir-similarity", IRSimilarityAnalysis())
2728
MODULE_ANALYSIS("lcg", LazyCallGraphAnalysis())
@@ -119,6 +120,7 @@ MODULE_PASS("print-must-be-executed-contexts",
119120
MODULE_PASS("print-profile-summary", ProfileSummaryPrinterPass(dbgs()))
120121
MODULE_PASS("print-stack-safety", StackSafetyGlobalPrinterPass(dbgs()))
121122
MODULE_PASS("print<dxil-metadata>", DXILMetadataAnalysisPrinterPass(dbgs()))
123+
MODULE_PASS("print<dxil-resource>", DXILResourcePrinterPass(dbgs()))
122124
MODULE_PASS("print<inline-advisor>", InlineAdvisorAnalysisPrinterPass(dbgs()))
123125
MODULE_PASS("print<module-debuginfo>", ModuleDebugInfoPrinterPass(dbgs()))
124126
MODULE_PASS("pseudo-probe", SampleProfileProbePass(TM))

0 commit comments

Comments
 (0)