/////////////////////////////////////////////////////////////////////////////// // // // ComputeViewIdSets.h // // Copyright (C) Microsoft Corporation. All rights reserved. // // This file is distributed under the University of Illinois Open Source // // License. See LICENSE.TXT for details. // // // // Computes control dependence relation for a function. // // // /////////////////////////////////////////////////////////////////////////////// #pragma once #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Dominators.h" #include #include namespace llvm { class Function; class raw_ostream; } namespace hlsl { using BasicBlockSet = std::unordered_set; using PostDomRelationType = llvm::DominatorTreeBase; class ControlDependence { public: void Compute(llvm::Function *F, PostDomRelationType &PostDomRel); void Clear(); const BasicBlockSet &GetCDBlocks(llvm::BasicBlock *pBB) const; void print(llvm::raw_ostream &OS); void dump(); private: using BasicBlockVector = std::vector; using ControlDependenceType = std::unordered_map; llvm::Function *m_pFunc; ControlDependenceType m_ControlDependence; BasicBlockSet m_EmptyBBSet; llvm::BasicBlock *GetIPostDom(PostDomRelationType &PostDomRel, llvm::BasicBlock *pBB); void ComputeRevTopOrderRec(PostDomRelationType &PostDomRel, llvm::BasicBlock *pBB, BasicBlockVector &RevTopOrder, BasicBlockSet &VisitedBBs); }; } // end of hlsl namespace