22
22
using namespace llvm ;
23
23
24
24
static void replaceTypedBufferAccess (IntrinsicInst *II,
25
- dxil::ResourceInfo &RI ) {
25
+ dxil::ResourceTypeInfo &RTI ) {
26
26
const DataLayout &DL = II->getDataLayout ();
27
27
28
28
auto *HandleType = cast<TargetExtType>(II->getOperand (0 )->getType ());
@@ -119,46 +119,43 @@ static void replaceTypedBufferAccess(IntrinsicInst *II,
119
119
II->eraseFromParent ();
120
120
}
121
121
122
- static bool transformResourcePointers (Function &F, DXILResourceMap &DRM) {
123
- // TODO: Should we have a more efficient way to find resources used in a
124
- // particular function?
125
- SmallVector<std::pair<IntrinsicInst *, dxil::ResourceInfo &>> Resources;
122
+ static bool transformResourcePointers (Function &F, DXILResourceTypeMap &DRTM) {
123
+ bool Changed = false ;
124
+ SmallVector<std::pair<IntrinsicInst *, dxil::ResourceTypeInfo>> Resources;
126
125
for (BasicBlock &BB : F)
127
126
for (Instruction &I : BB)
128
- if (auto *CI = dyn_cast<CallInst>(&I)) {
129
- auto It = DRM.find (CI);
130
- if (It == DRM.end ())
131
- continue ;
132
- for (User *U : CI->users ())
133
- if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U))
134
- if (II->getIntrinsicID () == Intrinsic::dx_resource_getpointer)
135
- Resources.emplace_back (II, *It);
136
- }
137
-
138
- for (const auto &[II, RI] : Resources) {
139
- if (RI.isTyped ())
127
+ if (auto *II = dyn_cast<IntrinsicInst>(&I))
128
+ if (II->getIntrinsicID () == Intrinsic::dx_resource_getpointer) {
129
+ auto *HandleTy = cast<TargetExtType>(II->getArgOperand (0 )->getType ());
130
+ Resources.emplace_back (II, DRTM[HandleTy]);
131
+ }
132
+
133
+ for (auto &[II, RI] : Resources) {
134
+ if (RI.isTyped ()) {
135
+ Changed = true ;
140
136
replaceTypedBufferAccess (II, RI);
137
+ }
141
138
142
139
// TODO: handle other resource types. We should probably have an
143
140
// `unreachable` here once we've added support for all of them.
144
141
}
145
142
146
- return false ;
143
+ return Changed ;
147
144
}
148
145
149
146
PreservedAnalyses DXILResourceAccess::run (Function &F,
150
147
FunctionAnalysisManager &FAM) {
151
148
auto &MAMProxy = FAM.getResult <ModuleAnalysisManagerFunctionProxy>(F);
152
- DXILResourceMap *DRM =
153
- MAMProxy.getCachedResult <DXILResourceAnalysis >(*F.getParent ());
154
- assert (DRM && " DXILResourceAnalysis must be available" );
149
+ DXILResourceTypeMap *DRTM =
150
+ MAMProxy.getCachedResult <DXILResourceTypeAnalysis >(*F.getParent ());
151
+ assert (DRTM && " DXILResourceTypeAnalysis must be available" );
155
152
156
- bool MadeChanges = transformResourcePointers (F, *DRM );
153
+ bool MadeChanges = transformResourcePointers (F, *DRTM );
157
154
if (!MadeChanges)
158
155
return PreservedAnalyses::all ();
159
156
160
157
PreservedAnalyses PA;
161
- PA.preserve <DXILResourceAnalysis >();
158
+ PA.preserve <DXILResourceTypeAnalysis >();
162
159
PA.preserve <DominatorTreeAnalysis>();
163
160
return PA;
164
161
}
@@ -167,18 +164,17 @@ namespace {
167
164
class DXILResourceAccessLegacy : public FunctionPass {
168
165
public:
169
166
bool runOnFunction (Function &F) override {
170
- DXILResourceMap &DRM =
171
- getAnalysis<DXILResourceWrapperPass >().getResourceMap ();
167
+ DXILResourceTypeMap &DRTM =
168
+ getAnalysis<DXILResourceTypeWrapperPass >().getResourceTypeMap ();
172
169
173
- return transformResourcePointers (F, DRM );
170
+ return transformResourcePointers (F, DRTM );
174
171
}
175
172
StringRef getPassName () const override { return " DXIL Resource Access" ; }
176
173
DXILResourceAccessLegacy () : FunctionPass(ID) {}
177
174
178
175
static char ID; // Pass identification.
179
176
void getAnalysisUsage (llvm::AnalysisUsage &AU) const override {
180
- AU.addRequired <DXILResourceWrapperPass>();
181
- AU.addPreserved <DXILResourceWrapperPass>();
177
+ AU.addRequired <DXILResourceTypeWrapperPass>();
182
178
AU.addPreserved <DominatorTreeWrapperPass>();
183
179
}
184
180
};
@@ -187,7 +183,7 @@ char DXILResourceAccessLegacy::ID = 0;
187
183
188
184
INITIALIZE_PASS_BEGIN (DXILResourceAccessLegacy, DEBUG_TYPE,
189
185
" DXIL Resource Access" , false , false )
190
- INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapperPass )
186
+ INITIALIZE_PASS_DEPENDENCY(DXILResourceTypeWrapperPass )
191
187
INITIALIZE_PASS_END(DXILResourceAccessLegacy, DEBUG_TYPE,
192
188
" DXIL Resource Access" , false , false )
193
189
0 commit comments