ControlDependence.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // ComputeViewIdSets.h //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // Computes control dependence relation for a function. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #pragma once
  12. #include "llvm/IR/BasicBlock.h"
  13. #include "llvm/IR/Dominators.h"
  14. #include <unordered_set>
  15. #include <unordered_map>
  16. namespace llvm {
  17. class Function;
  18. class raw_ostream;
  19. }
  20. namespace hlsl {
  21. using BasicBlockSet = std::unordered_set<llvm::BasicBlock *>;
  22. using PostDomRelationType = llvm::DominatorTreeBase<llvm::BasicBlock>;
  23. class ControlDependence {
  24. public:
  25. void Compute(llvm::Function *F, PostDomRelationType &PostDomRel);
  26. void Clear();
  27. const BasicBlockSet &GetCDBlocks(llvm::BasicBlock *pBB) const;
  28. void print(llvm::raw_ostream &OS);
  29. void dump();
  30. private:
  31. using BasicBlockVector = std::vector<llvm::BasicBlock *>;
  32. using ControlDependenceType = std::unordered_map<llvm::BasicBlock *, BasicBlockSet>;
  33. llvm::Function *m_pFunc;
  34. ControlDependenceType m_ControlDependence;
  35. BasicBlockSet m_EmptyBBSet;
  36. llvm::BasicBlock *GetIPostDom(PostDomRelationType &PostDomRel, llvm::BasicBlock *pBB);
  37. void ComputeRevTopOrderRec(PostDomRelationType &PostDomRel, llvm::BasicBlock *pBB,
  38. BasicBlockVector &RevTopOrder, BasicBlockSet &VisitedBBs);
  39. };
  40. } // end of hlsl namespace