00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef interval_processor_INCLUDED
00031 #define interval_processor_INCLUDED
00032
00033
00034
00035
00036
00037
00038
00039 #include "region.h"
00040 #include "region_verify.h"
00041
00042 typedef std::list<REGIONAL_CFG_EDGE *,EDGE_ALLOC> EDGE_LIST;
00043 typedef std::queue<REGIONAL_CFG_EDGE *,EDGE_LIST> EDGE_QUEUE;
00044
00045
00046 class INTERVAL_PROCESSOR_MEM {
00047
00048 protected:
00049 MEM_POOL _m;
00050
00051 INTERVAL_PROCESSOR_MEM() {
00052 MEM_POOL_Initialize( &_m, "INTERVAL_PROCESSOR_MEM", true );
00053 MEM_POOL_Push( &_m );
00054 }
00055
00056 ~INTERVAL_PROCESSOR_MEM() {
00057 MEM_POOL_Pop( &_m );
00058 MEM_POOL_Delete(&_m );
00059 }
00060 };
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 class INTERVAL_PROCESSOR : public INTERVAL_PROCESSOR_MEM {
00076 typedef mempool_allocator<BS*> BS_ALLOC;
00077 typedef std::vector<BS*,BS_ALLOC> BS_VECTOR;
00078 typedef mempool_allocator<REGION*> REGION_ALLOC;
00079 typedef std::vector<REGION*,REGION_ALLOC> REGION_VECTOR;
00080 typedef REGION_VECTOR::iterator REGION_VECTOR_ITER;
00081 typedef mempool_allocator<NODE_VECTOR> NODE_VECTOR_ALLOC;
00082 typedef std::vector<NODE_VECTOR,NODE_VECTOR_ALLOC> SCC_VECTOR;
00083 typedef SCC_VECTOR::iterator SCC_VECTOR_ITER;
00084
00085 friend void Verify_SEME_Region(REGION *r);
00086
00087 private:
00088 EDGE_VECTOR _cycles;
00089 EDGE_VECTOR _backedges;
00090 EDGE_VECTOR _impedges;
00091 REGION_VECTOR _imp_region;
00092 NODE_VECTOR _improper_node;
00093 BS_VECTOR _bs_vector;
00094 BS *_dom_init;
00095 REGION *_root;
00096
00097 void Find_Cycles(void);
00098
00099 void Detect_Cycle(REGIONAL_CFG_NODE *node,INT_VECTOR dfn,
00100 BS *visited,INT32 next_dfn);
00101
00102 void Compute_Dominators(void);
00103
00104 void Init_Dom_Set(REGIONAL_CFG *cfg);
00105
00106 void Set_Node_Dom_Set(REGIONAL_CFG_NODE *node,BS *bs);
00107
00108 void Collect_Backedges(void);
00109
00110 void Collect_Improper_Nodes(void);
00111
00112 void Construct_Loops(void);
00113
00114 NODE_VECTOR Detect_Loop_Scope(REGIONAL_CFG_EDGE *edge);
00115
00116 EDGE_QUEUE Is_Backedge_Target(REGIONAL_CFG_NODE *node);
00117 EDGE_VECTOR Is_Backedge_Source(REGIONAL_CFG_NODE *node);
00118
00119 void Update_Backedges(REGIONAL_CFG_NODE *r_node);
00120
00121 void Construct_Improper(void);
00122
00123 public:
00124 INTERVAL_PROCESSOR(REGION *r) :
00125 _imp_region(REGION_ALLOC(&_m)),
00126 _improper_node(NODE_ALLOC(&_m)),
00127 _cycles(EDGE_ALLOC(&_m)),
00128 _backedges(EDGE_ALLOC(&_m)),
00129 _impedges(EDGE_ALLOC(&_m)),
00130 _bs_vector((r->Regional_Cfg())->_seq_num+2,(BS*)NULL,BS_ALLOC(&_m))
00131 {
00132 this->_root = r;
00133 this->_dom_init = NULL;
00134 }
00135
00136 ~INTERVAL_PROCESSOR() {}
00137
00138 void Process(void);
00139
00140 void Print_Cycle(FILE *f = stderr);
00141 void Print_Dominators(REGIONAL_CFG *cfg, FILE *f = stderr);
00142 void Print_Loops(REGIONAL_CFG *cfg, FILE *f = stderr);
00143 };
00144
00145 #endif