|
20 | 20 |
|
21 | 21 | #include <algorithm> |
22 | 22 | #include <cstdint> |
23 | | -#include <unordered_map> |
24 | 23 |
|
25 | 24 | namespace llvm { |
26 | 25 | class CallInst; |
@@ -411,77 +410,6 @@ class DXILResourceTypeMap { |
411 | 410 | } |
412 | 411 | }; |
413 | 412 |
|
414 | | -enum ResourceCounterDirection { |
415 | | - Increment, |
416 | | - Decrement, |
417 | | - Unknown, |
418 | | -}; |
419 | | - |
420 | | -class DXILResourceCounterDirectionMap { |
421 | | - std::vector<std::pair<dxil::ResourceBindingInfo, ResourceCounterDirection>> |
422 | | - CounterDirections; |
423 | | - |
424 | | -public: |
425 | | - bool invalidate(Module &M, const PreservedAnalyses &PA, |
426 | | - ModuleAnalysisManager::Invalidator &Inv); |
427 | | - |
428 | | - void populate(Module &M, ModuleAnalysisManager &AM); |
429 | | - |
430 | | - ResourceCounterDirection |
431 | | - operator[](const dxil::ResourceBindingInfo &Info) const { |
432 | | - auto Lower = std::lower_bound( |
433 | | - CounterDirections.begin(), CounterDirections.end(), |
434 | | - std::pair{Info, ResourceCounterDirection::Unknown}, |
435 | | - [](auto lhs, auto rhs) { return lhs.first < rhs.first; }); |
436 | | - |
437 | | - if (Lower == CounterDirections.end()) { |
438 | | - return ResourceCounterDirection::Unknown; |
439 | | - } |
440 | | - |
441 | | - if (Lower->first != Info) { |
442 | | - return ResourceCounterDirection::Unknown; |
443 | | - } |
444 | | - |
445 | | - return Lower->second; |
446 | | - } |
447 | | -}; |
448 | | - |
449 | | -class DXILResourceCounterDirectionAnalysis |
450 | | - : public AnalysisInfoMixin<DXILResourceCounterDirectionAnalysis> { |
451 | | - friend AnalysisInfoMixin<DXILResourceCounterDirectionAnalysis>; |
452 | | - |
453 | | - static AnalysisKey Key; |
454 | | - |
455 | | -public: |
456 | | - using Result = DXILResourceCounterDirectionMap; |
457 | | - |
458 | | - DXILResourceCounterDirectionMap run(Module &M, ModuleAnalysisManager &AM) { |
459 | | - DXILResourceCounterDirectionMap DRCDM{}; |
460 | | - DRCDM.populate(M, AM); |
461 | | - return DRCDM; |
462 | | - } |
463 | | -}; |
464 | | - |
465 | | -class DXILResourceCounterDirectionWrapperPass : public ImmutablePass { |
466 | | - DXILResourceCounterDirectionMap DRCDM; |
467 | | - |
468 | | - virtual void anchor(); |
469 | | - |
470 | | -public: |
471 | | - static char ID; |
472 | | - DXILResourceCounterDirectionWrapperPass(); |
473 | | - |
474 | | - DXILResourceCounterDirectionMap &getResourceCounterDirectionMap() { |
475 | | - return DRCDM; |
476 | | - } |
477 | | - const DXILResourceCounterDirectionMap & |
478 | | - getResourceCounterDirectionMap() const { |
479 | | - return DRCDM; |
480 | | - } |
481 | | -}; |
482 | | - |
483 | | -ModulePass *createDXILResourceCounterDirectionWrapperPassPass(); |
484 | | - |
485 | 413 | class DXILResourceTypeAnalysis |
486 | 414 | : public AnalysisInfoMixin<DXILResourceTypeAnalysis> { |
487 | 415 | friend AnalysisInfoMixin<DXILResourceTypeAnalysis>; |
@@ -649,6 +577,81 @@ class DXILResourceBindingWrapperPass : public ModulePass { |
649 | 577 |
|
650 | 578 | ModulePass *createDXILResourceBindingWrapperPassPass(); |
651 | 579 |
|
| 580 | +enum ResourceCounterDirection { |
| 581 | + Increment, |
| 582 | + Decrement, |
| 583 | + Unknown, |
| 584 | +}; |
| 585 | + |
| 586 | +class DXILResourceCounterDirectionMap { |
| 587 | + std::vector<std::pair<dxil::ResourceBindingInfo, ResourceCounterDirection>> |
| 588 | + CounterDirections; |
| 589 | + |
| 590 | +public: |
| 591 | + void populate(Module &M, DXILBindingMap &DBM); |
| 592 | + |
| 593 | + ResourceCounterDirection |
| 594 | + operator[](const dxil::ResourceBindingInfo &Info) const { |
| 595 | + auto Lower = std::lower_bound( |
| 596 | + CounterDirections.begin(), CounterDirections.end(), |
| 597 | + std::pair{Info, ResourceCounterDirection::Unknown}, |
| 598 | + [](auto LHS, auto RHS) { return LHS.first < RHS.first; }); |
| 599 | + |
| 600 | + if (Lower == CounterDirections.end()) { |
| 601 | + return ResourceCounterDirection::Unknown; |
| 602 | + } |
| 603 | + |
| 604 | + if (Lower->first != Info) { |
| 605 | + return ResourceCounterDirection::Unknown; |
| 606 | + } |
| 607 | + |
| 608 | + return Lower->second; |
| 609 | + } |
| 610 | +}; |
| 611 | + |
| 612 | +class DXILResourceCounterDirectionAnalysis |
| 613 | + : public AnalysisInfoMixin<DXILResourceCounterDirectionAnalysis> { |
| 614 | + friend AnalysisInfoMixin<DXILResourceCounterDirectionAnalysis>; |
| 615 | + |
| 616 | + static AnalysisKey Key; |
| 617 | + |
| 618 | +public: |
| 619 | + using Result = DXILResourceCounterDirectionMap; |
| 620 | + |
| 621 | + DXILResourceCounterDirectionMap run(Module &M, ModuleAnalysisManager &AM) { |
| 622 | + DXILResourceCounterDirectionMap DRCDM{}; |
| 623 | + DXILBindingMap &DBM = AM.getResult<DXILResourceBindingAnalysis>(M); |
| 624 | + DRCDM.populate(M, DBM); |
| 625 | + return DRCDM; |
| 626 | + } |
| 627 | +}; |
| 628 | + |
| 629 | +class DXILResourceCounterDirectionWrapperPass : public ModulePass { |
| 630 | + std::unique_ptr<DXILResourceCounterDirectionMap> Map; |
| 631 | + |
| 632 | +public: |
| 633 | + static char ID; |
| 634 | + DXILResourceCounterDirectionWrapperPass(); |
| 635 | + ~DXILResourceCounterDirectionWrapperPass() override = default; |
| 636 | + |
| 637 | + DXILResourceCounterDirectionMap &getResourceCounterDirectionMap() { |
| 638 | + return *Map; |
| 639 | + } |
| 640 | + const DXILResourceCounterDirectionMap & |
| 641 | + getResourceCounterDirectionMap() const { |
| 642 | + return *Map; |
| 643 | + } |
| 644 | + |
| 645 | + void getAnalysisUsage(AnalysisUsage &AU) const override; |
| 646 | + bool runOnModule(Module &M) override; |
| 647 | + void releaseMemory() override; |
| 648 | + |
| 649 | + void print(raw_ostream &OS, const Module *M) const override; |
| 650 | +}; |
| 651 | + |
| 652 | +ModulePass *createDXILResourceCounterDirectionWrapperPassPass(); |
| 653 | + |
| 654 | + |
652 | 655 | } // namespace llvm |
653 | 656 |
|
654 | 657 | #endif // LLVM_ANALYSIS_DXILRESOURCE_H |
0 commit comments