@@ -25,6 +25,8 @@ class MDTuple;
25
25
class TargetExtType ;
26
26
class Value ;
27
27
28
+ class DXILResourceTypeMap ;
29
+
28
30
namespace dxil {
29
31
30
32
// / The dx.RawBuffer target extension type
@@ -197,27 +199,8 @@ class SamplerExtType : public TargetExtType {
197
199
198
200
// ===----------------------------------------------------------------------===//
199
201
200
- class ResourceInfo {
202
+ class ResourceTypeInfo {
201
203
public:
202
- struct ResourceBinding {
203
- uint32_t RecordID;
204
- uint32_t Space;
205
- uint32_t LowerBound;
206
- uint32_t Size;
207
-
208
- bool operator ==(const ResourceBinding &RHS) const {
209
- return std::tie (RecordID, Space, LowerBound, Size) ==
210
- std::tie (RHS.RecordID , RHS.Space , RHS.LowerBound , RHS.Size );
211
- }
212
- bool operator !=(const ResourceBinding &RHS) const {
213
- return !(*this == RHS);
214
- }
215
- bool operator <(const ResourceBinding &RHS) const {
216
- return std::tie (RecordID, Space, LowerBound, Size) <
217
- std::tie (RHS.RecordID , RHS.Space , RHS.LowerBound , RHS.Size );
218
- }
219
- };
220
-
221
204
struct UAVInfo {
222
205
bool GloballyCoherent;
223
206
bool HasCounter;
@@ -267,22 +250,25 @@ class ResourceInfo {
267
250
};
268
251
269
252
private:
270
- ResourceBinding Binding;
271
253
TargetExtType *HandleTy;
272
254
273
255
// GloballyCoherent and HasCounter aren't really part of the type and need to
274
- // be determined by analysis, so they're just provided directly when we
275
- // construct these.
256
+ // be determined by analysis, so they're just provided directly by the
257
+ // DXILResourceTypeMap when we construct these.
276
258
bool GloballyCoherent;
277
259
bool HasCounter;
278
260
279
261
dxil::ResourceClass RC;
280
262
dxil::ResourceKind Kind;
281
263
282
264
public:
283
- ResourceInfo (uint32_t RecordID, uint32_t Space, uint32_t LowerBound,
284
- uint32_t Size, TargetExtType *HandleTy,
285
- bool GloballyCoherent = false , bool HasCounter = false );
265
+ ResourceTypeInfo (TargetExtType *HandleTy, const dxil::ResourceClass RC,
266
+ const dxil::ResourceKind Kind, bool GloballyCoherent = false ,
267
+ bool HasCounter = false );
268
+ ResourceTypeInfo (TargetExtType *HandleTy, bool GloballyCoherent = false ,
269
+ bool HasCounter = false )
270
+ : ResourceTypeInfo(HandleTy, {}, dxil::ResourceKind::Invalid,
271
+ GloballyCoherent, HasCounter) {}
286
272
287
273
TargetExtType *getHandleTy () const { return HandleTy; }
288
274
@@ -304,44 +290,159 @@ class ResourceInfo {
304
290
dxil::SamplerFeedbackType getFeedbackType () const ;
305
291
uint32_t getMultiSampleCount () const ;
306
292
307
- StringRef getName () const {
308
- // TODO: Get the name from the symbol once we include one here.
309
- return " " ;
310
- }
311
293
dxil::ResourceClass getResourceClass () const { return RC; }
312
294
dxil::ResourceKind getResourceKind () const { return Kind; }
313
295
296
+ bool operator ==(const ResourceTypeInfo &RHS) const ;
297
+ bool operator !=(const ResourceTypeInfo &RHS) const { return !(*this == RHS); }
298
+ bool operator <(const ResourceTypeInfo &RHS) const ;
299
+
300
+ void print (raw_ostream &OS, const DataLayout &DL) const ;
301
+ };
302
+
303
+ // ===----------------------------------------------------------------------===//
304
+
305
+ class ResourceBindingInfo {
306
+ public:
307
+ struct ResourceBinding {
308
+ uint32_t RecordID;
309
+ uint32_t Space;
310
+ uint32_t LowerBound;
311
+ uint32_t Size;
312
+
313
+ bool operator ==(const ResourceBinding &RHS) const {
314
+ return std::tie (RecordID, Space, LowerBound, Size) ==
315
+ std::tie (RHS.RecordID , RHS.Space , RHS.LowerBound , RHS.Size );
316
+ }
317
+ bool operator !=(const ResourceBinding &RHS) const {
318
+ return !(*this == RHS);
319
+ }
320
+ bool operator <(const ResourceBinding &RHS) const {
321
+ return std::tie (RecordID, Space, LowerBound, Size) <
322
+ std::tie (RHS.RecordID , RHS.Space , RHS.LowerBound , RHS.Size );
323
+ }
324
+ };
325
+
326
+ private:
327
+ ResourceBinding Binding;
328
+ TargetExtType *HandleTy;
329
+
330
+ public:
331
+ ResourceBindingInfo (uint32_t RecordID, uint32_t Space, uint32_t LowerBound,
332
+ uint32_t Size, TargetExtType *HandleTy)
333
+ : Binding{RecordID, Space, LowerBound, Size}, HandleTy(HandleTy) {}
334
+
314
335
void setBindingID (unsigned ID) { Binding.RecordID = ID; }
315
336
316
337
const ResourceBinding &getBinding () const { return Binding; }
338
+ TargetExtType *getHandleTy () const { return HandleTy; }
339
+ const StringRef getName () const {
340
+ // TODO: Get the name from the symbol once we include one here.
341
+ return " " ;
342
+ }
317
343
318
- MDTuple *getAsMetadata (Module &M) const ;
319
- std::pair< uint32_t , uint32_t > getAnnotateProps (Module &M) const ;
344
+ MDTuple *getAsMetadata (Module &M, DXILResourceTypeMap &DRTM ) const ;
345
+ MDTuple * getAsMetadata (Module &M, dxil::ResourceTypeInfo RTI ) const ;
320
346
321
- bool operator ==(const ResourceInfo &RHS) const ;
322
- bool operator !=(const ResourceInfo &RHS) const { return !(*this == RHS); }
323
- bool operator <(const ResourceInfo &RHS) const ;
347
+ std::pair<uint32_t , uint32_t >
348
+ getAnnotateProps (Module &M, DXILResourceTypeMap &DRTM) const ;
349
+ std::pair<uint32_t , uint32_t >
350
+ getAnnotateProps (Module &M, dxil::ResourceTypeInfo RTI) const ;
324
351
325
- void print (raw_ostream &OS, const DataLayout &DL) const ;
352
+ bool operator ==(const ResourceBindingInfo &RHS) const {
353
+ return std::tie (Binding, HandleTy) == std::tie (RHS.Binding , RHS.HandleTy );
354
+ }
355
+ bool operator !=(const ResourceBindingInfo &RHS) const {
356
+ return !(*this == RHS);
357
+ }
358
+ bool operator <(const ResourceBindingInfo &RHS) const {
359
+ return Binding < RHS.Binding ;
360
+ }
361
+
362
+ void print (raw_ostream &OS, DXILResourceTypeMap &DRTM,
363
+ const DataLayout &DL) const ;
364
+ void print (raw_ostream &OS, dxil::ResourceTypeInfo RTI,
365
+ const DataLayout &DL) const ;
326
366
};
327
367
328
368
} // namespace dxil
329
369
330
370
// ===----------------------------------------------------------------------===//
331
371
332
- class DXILResourceMap {
333
- SmallVector<dxil::ResourceInfo> Infos;
372
+ class DXILResourceTypeMap {
373
+ struct Info {
374
+ dxil::ResourceClass RC;
375
+ dxil::ResourceKind Kind;
376
+ bool GloballyCoherent;
377
+ bool HasCounter;
378
+ };
379
+ DenseMap<TargetExtType *, Info> Infos;
380
+
381
+ public:
382
+ bool invalidate (Module &M, const PreservedAnalyses &PA,
383
+ ModuleAnalysisManager::Invalidator &Inv);
384
+
385
+ dxil::ResourceTypeInfo operator [](TargetExtType *Ty) {
386
+ Info I = Infos[Ty];
387
+ return dxil::ResourceTypeInfo (Ty, I.RC , I.Kind , I.GloballyCoherent ,
388
+ I.HasCounter );
389
+ }
390
+
391
+ void setGloballyCoherent (TargetExtType *Ty, bool GloballyCoherent) {
392
+ Infos[Ty].GloballyCoherent = GloballyCoherent;
393
+ }
394
+
395
+ void setHasCounter (TargetExtType *Ty, bool HasCounter) {
396
+ Infos[Ty].HasCounter = HasCounter;
397
+ }
398
+ };
399
+
400
+ class DXILResourceTypeAnalysis
401
+ : public AnalysisInfoMixin<DXILResourceTypeAnalysis> {
402
+ friend AnalysisInfoMixin<DXILResourceTypeAnalysis>;
403
+
404
+ static AnalysisKey Key;
405
+
406
+ public:
407
+ using Result = DXILResourceTypeMap;
408
+
409
+ DXILResourceTypeMap run (Module &M, ModuleAnalysisManager &AM) {
410
+ // Running the pass just generates an empty map, which will be filled when
411
+ // users of the pass query the results.
412
+ return Result ();
413
+ }
414
+ };
415
+
416
+ class DXILResourceTypeWrapperPass : public ImmutablePass {
417
+ DXILResourceTypeMap DRTM;
418
+
419
+ virtual void anchor ();
420
+
421
+ public:
422
+ static char ID;
423
+ DXILResourceTypeWrapperPass ();
424
+
425
+ DXILResourceTypeMap &getResourceTypeMap () { return DRTM; }
426
+ const DXILResourceTypeMap &getResourceTypeMap () const { return DRTM; }
427
+ };
428
+
429
+ ModulePass *createDXILResourceTypeWrapperPassPass ();
430
+
431
+ // ===----------------------------------------------------------------------===//
432
+
433
+ class DXILBindingMap {
434
+ SmallVector<dxil::ResourceBindingInfo> Infos;
334
435
DenseMap<CallInst *, unsigned > CallMap;
335
436
unsigned FirstUAV = 0 ;
336
437
unsigned FirstCBuffer = 0 ;
337
438
unsigned FirstSampler = 0 ;
338
439
339
440
// / Populate the map given the resource binding calls in the given module.
340
- void populate (Module &M);
441
+ void populate (Module &M, DXILResourceTypeMap &DRTM );
341
442
342
443
public:
343
- using iterator = SmallVector<dxil::ResourceInfo >::iterator;
344
- using const_iterator = SmallVector<dxil::ResourceInfo >::const_iterator;
444
+ using iterator = SmallVector<dxil::ResourceBindingInfo >::iterator;
445
+ using const_iterator = SmallVector<dxil::ResourceBindingInfo >::const_iterator;
345
446
346
447
iterator begin () { return Infos.begin (); }
347
448
const_iterator begin () const { return Infos.begin (); }
@@ -400,47 +501,51 @@ class DXILResourceMap {
400
501
return make_range (sampler_begin (), sampler_end ());
401
502
}
402
503
403
- void print (raw_ostream &OS, const DataLayout &DL) const ;
504
+ void print (raw_ostream &OS, DXILResourceTypeMap &DRTM,
505
+ const DataLayout &DL) const ;
404
506
405
- friend class DXILResourceAnalysis ;
406
- friend class DXILResourceWrapperPass ;
507
+ friend class DXILResourceBindingAnalysis ;
508
+ friend class DXILResourceBindingWrapperPass ;
407
509
};
408
510
409
- class DXILResourceAnalysis : public AnalysisInfoMixin <DXILResourceAnalysis> {
410
- friend AnalysisInfoMixin<DXILResourceAnalysis>;
511
+ class DXILResourceBindingAnalysis
512
+ : public AnalysisInfoMixin<DXILResourceBindingAnalysis> {
513
+ friend AnalysisInfoMixin<DXILResourceBindingAnalysis>;
411
514
412
515
static AnalysisKey Key;
413
516
414
517
public:
415
- using Result = DXILResourceMap ;
518
+ using Result = DXILBindingMap ;
416
519
417
520
// / Gather resource info for the module \c M.
418
- DXILResourceMap run (Module &M, ModuleAnalysisManager &AM);
521
+ DXILBindingMap run (Module &M, ModuleAnalysisManager &AM);
419
522
};
420
523
421
- // / Printer pass for the \c DXILResourceAnalysis results.
422
- class DXILResourcePrinterPass : public PassInfoMixin <DXILResourcePrinterPass> {
524
+ // / Printer pass for the \c DXILResourceBindingAnalysis results.
525
+ class DXILResourceBindingPrinterPass
526
+ : public PassInfoMixin<DXILResourceBindingPrinterPass> {
423
527
raw_ostream &OS;
424
528
425
529
public:
426
- explicit DXILResourcePrinterPass (raw_ostream &OS) : OS(OS) {}
530
+ explicit DXILResourceBindingPrinterPass (raw_ostream &OS) : OS(OS) {}
427
531
428
532
PreservedAnalyses run (Module &M, ModuleAnalysisManager &AM);
429
533
430
534
static bool isRequired () { return true ; }
431
535
};
432
536
433
- class DXILResourceWrapperPass : public ModulePass {
434
- std::unique_ptr<DXILResourceMap> Map;
537
+ class DXILResourceBindingWrapperPass : public ModulePass {
538
+ std::unique_ptr<DXILBindingMap> Map;
539
+ DXILResourceTypeMap *DRTM;
435
540
436
541
public:
437
542
static char ID; // Class identification, replacement for typeinfo
438
543
439
- DXILResourceWrapperPass ();
440
- ~DXILResourceWrapperPass () override ;
544
+ DXILResourceBindingWrapperPass ();
545
+ ~DXILResourceBindingWrapperPass () override ;
441
546
442
- const DXILResourceMap & getResourceMap () const { return *Map; }
443
- DXILResourceMap & getResourceMap () { return *Map; }
547
+ const DXILBindingMap & getBindingMap () const { return *Map; }
548
+ DXILBindingMap & getBindingMap () { return *Map; }
444
549
445
550
void getAnalysisUsage (AnalysisUsage &AU) const override ;
446
551
bool runOnModule (Module &M) override ;
@@ -450,7 +555,7 @@ class DXILResourceWrapperPass : public ModulePass {
450
555
void dump () const ;
451
556
};
452
557
453
- ModulePass *createDXILResourceWrapperPassPass ();
558
+ ModulePass *createDXILResourceBindingWrapperPassPass ();
454
559
455
560
} // namespace llvm
456
561
0 commit comments