00001 #ifndef _LengauerTarjan_h_ 00002 #define _LengauerTarjan_h_ 00003 00004 #include <LinkedList.h> 00005 00006 class BasicBlock; 00007 00008 class LengauerTarjan { 00009 private: 00010 uint32_t reachableCount; 00011 uint32_t nodeCount; 00012 uint32_t rootLoc; 00013 00014 uint32_t *dom; 00015 uint32_t *parent; 00016 uint32_t *ancestor; 00017 uint32_t *child; 00018 uint32_t *vertex; 00019 uint32_t *label; 00020 uint32_t *semi; 00021 uint32_t *size; 00022 00023 LinkedList<uint32_t>* bucket; 00024 00025 BasicBlock** locToBasicBlock; 00026 uint32_t* basicBlockToLoc; 00027 00028 void depthFirstSearch(uint32_t vertexV,uint32_t* dfsNo); 00029 void COMPRESS(uint32_t vertexV); 00030 uint32_t EVAL(uint32_t vertexV); 00031 void LINK(uint32_t vertexV,uint32_t vertexW); 00032 00033 public: 00034 00035 LengauerTarjan(uint32_t blockCount, BasicBlock* root, BasicBlock** blocks); 00036 ~LengauerTarjan(); 00037 void immediateDominators(); 00038 }; 00039 00040 #endif