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
00031 #ifndef prdb_INCLUDED
00032 #define prdb_INCLUDED
00033
00034 #include <vector>
00035 #include <utility>
00036 #include "bb.h"
00037 #include "defs.h"
00038 #include "tn.h"
00039 #include "mempool.h"
00040 #include "cgtarget.h"
00041 #include "op.h"
00042 #include "bitset.h"
00043 #include "region_map.h"
00044 #include "if_conv.h"
00045 #include "region.h"
00046
00047 #include "bb_map.h"
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 extern MEM_POOL* PRDB_pool;
00059 extern COMPARE_TYPE Compare_Type(TOP opcode);
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 typedef enum {
00075 MOVE_TO,
00076 COPY_TO,
00077 DELETE
00078 } CODE_MOTION_TYPE;
00079
00080
00081 class PARTITION;
00082 class PARTITION_GRAPH_NODE;
00083 class PARTITION_GRAPH;
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 class PRDB_MEM {
00099 protected:
00100 MEM_POOL _m;
00101
00102 PRDB_MEM() {
00103 _m.magic_num = 0;
00104 MEM_POOL_Initialize( &_m, "PRDB_MEM", TRUE );
00105 MEM_POOL_Push( &_m );
00106 }
00107
00108 ~PRDB_MEM() {
00109 MEM_POOL_Pop( &_m );
00110 MEM_POOL_Delete(&_m );
00111 };
00112 };
00113
00114 class PRDB_GEN : public PRDB_MEM
00115 {
00116 friend class PARTITION;
00117 friend class PARTITION_GRAPH;
00118 friend class PARTITION_GRAPH_NODE;
00119 private:
00120
00121 REGION_MAP _region_graph;
00122 public:
00123
00124 PRDB_GEN() {}
00125 PRDB_GEN(REGION_TREE*);
00126 PRDB_GEN(REGION*);
00127 ~PRDB_GEN(){ REGION_MAP_Delete(_region_graph); }
00128
00129 PARTITION_GRAPH* Partition_Graph(REGION*);
00130
00131 void Print(FILE* file = stderr, REGION_TREE* region_tree = NULL);
00132 };
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 typedef mempool_allocator<PARTITION_GRAPH_NODE *> PG_ALLOC;
00148 typedef std::vector<PARTITION_GRAPH_NODE *, PG_ALLOC> PG_CONTAINER;
00149
00150 typedef mempool_allocator<PARTITION*> PT_ALLOC;
00151 typedef std::vector<PARTITION*, PT_ALLOC> PT_CONTAINER;
00152
00153 typedef mempool_allocator<OP*> OP_ALLOC;
00154 typedef std::vector<OP*, OP_ALLOC> OP_CONTAINER;
00155
00156 typedef mempool_allocator<BOOL> BIT_ALLOC;
00157 typedef std::vector<BOOL, BIT_ALLOC> BV_VECTOR;
00158 typedef mempool_allocator<BV_VECTOR> BV_ALLOC;
00159 typedef std::vector<BV_VECTOR, BV_ALLOC> BV_CONTAINER;
00160
00161 typedef std::pair<TN*, const OP*> TN_OP_PAIR;
00162 typedef mempool_allocator<TN_OP_PAIR*> TP_ALLOCATOR;
00163 typedef std::vector<TN_OP_PAIR*, TP_ALLOCATOR> TP_CONTAINER;
00164
00165 class PARTITION_GRAPH_NODE
00166 {
00167 friend class PARTITION_GRAPH;
00168 private:
00169
00170
00171 INT _index;
00172
00173
00174 INT _level;
00175
00176
00177
00178 PT_CONTAINER _parent_partitions;
00179
00180 PT_CONTAINER _child_partitions;
00181
00182
00183 TP_CONTAINER _related_tns;
00184 BB_SET* _related_bbs;
00185 TN* _control_pred;
00186
00187 public:
00188 PARTITION_GRAPH_NODE();
00189 ~PARTITION_GRAPH_NODE(){}
00190
00191
00192 void Add_Related_BB(BB* bb)
00193 {
00194 BB_SET_Union1D(_related_bbs, bb, PRDB_pool);
00195 }
00196 BOOL Is_Related_TN(TN_OP_PAIR* tp)
00197 {
00198 TP_CONTAINER::iterator iter;
00199 for ( iter = _related_tns.begin();
00200 iter!= _related_tns.end();
00201 iter++)
00202 {
00203 if ( tp == * iter) return TRUE;
00204 }
00205 return FALSE;
00206 }
00207 void Add_Related_TN(TN_OP_PAIR* tp)
00208 {
00209 if (!Is_Related_TN(tp))
00210 _related_tns.push_back(tp);
00211 }
00212
00213 TN* Control_Pred() { return _control_pred; }
00214 void Control_Pred(TN* tn) { _control_pred = tn; }
00215
00216 TP_CONTAINER& Get_TNs() { return _related_tns; }
00217 BB_SET* Get_BBs() { return _related_bbs; }
00218
00219 void Index(INT idx) { _index = idx; }
00220 INT Index() { return _index; }
00221
00222 void Level(INT level) { _level = level; }
00223 INT Level() { return _level; }
00224 BOOL Is_Reachable() { return (_level != -1); }
00225
00226 void Add_Child_Partition(PARTITION* child)
00227 {
00228 _child_partitions.push_back (child);
00229 }
00230 PT_CONTAINER& Child_Partitions()
00231 { return _child_partitions;}
00232
00233 void Add_Parent_Partition(PARTITION* parent)
00234 {
00235 _parent_partitions.push_back (parent);
00236 }
00237 PT_CONTAINER& Parent_Partitions()
00238 { return _parent_partitions;}
00239
00240 void Del_Related_TN(TN* tn, OP* op);
00241
00242 void Clear_Child_Partitions() { _child_partitions.clear(); }
00243 void Clear_Parent_Partitions() { _parent_partitions.clear(); }
00244 void Print(FILE* file = stderr);
00245 };
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260 class PARTITION
00261 {
00262 private:
00263
00264 PARTITION_GRAPH_NODE* _parent;
00265 PG_CONTAINER _child;
00266
00267 public:
00268
00269 PARTITION() : _child(PG_ALLOC(PRDB_pool))
00270 {
00271 };
00272
00273 ~PARTITION() {}
00274
00275 PARTITION_GRAPH_NODE* Parent() { return _parent; }
00276 PG_CONTAINER& Child() { return _child; }
00277
00278 void Parent(PARTITION_GRAPH_NODE* node) { _parent = node; }
00279
00280
00281 void Add_Child(PARTITION_GRAPH_NODE* node) {
00282 PG_CONTAINER::iterator iter;
00283 for(iter=_child.begin();iter!=_child.end();iter++)
00284 if((*iter)->Index()>node->Index()) break;
00285 iter = _child.insert(iter, node);
00286 }
00287
00288
00289 void Del_Child(PARTITION_GRAPH_NODE* node) {
00290 PG_CONTAINER::iterator iter;
00291 for ( iter = _child.begin(); iter != _child.end(); iter++)
00292 {
00293 if (*iter == node )
00294 {
00295 iter = _child.erase(iter);
00296 break;
00297 }
00298 }
00299 if (_child.size() == 1 && (*(_child.begin()))->Index() == 0)
00300 _child.clear();
00301 }
00302
00303 BOOL operator==(PARTITION* );
00304
00305 void Print(FILE* file = stderr);
00306 };
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321 class PARTITION_GRAPH
00322 {
00323 friend class PRDB_GEN;
00324
00325 protected:
00326
00327
00328 INT partition_graph_node_number;
00329
00330 private:
00331
00332 PARTITION_GRAPH_NODE* _root;
00333 PARTITION_GRAPH_NODE* _dummy_node;
00334
00335 OP_MAP _tn_node_map;
00336 BB_MAP _bb_node_map;
00337
00338 BV_CONTAINER _disjoint_relation;
00339 BV_CONTAINER _subset_relation;
00340 std::vector<bool, std::allocator<bool> > _visited;
00341 PG_CONTAINER _nodes;
00342
00343
00344 void Mark_Level(PARTITION_GRAPH_NODE* node);
00345
00346
00347 void Find_Sibling(PG_CONTAINER* result, PARTITION_GRAPH_NODE* anc,
00348 PARTITION_GRAPH_NODE* des);
00349
00350 void Collect_Info(REGION* region);
00351 void Look_For_Partition(REGION* region);
00352 void Look_Partition_For_Or_Type(TN* tn, PARTITION_GRAPH_NODE* parent,
00353 PARTITION_GRAPH_NODE* child1, PARTITION_GRAPH_NODE* child2,
00354 OP* op);
00355 void Look_Partition_For_And_Type(TN* tn, PARTITION_GRAPH_NODE* parent,
00356 PARTITION_GRAPH_NODE* child1, PARTITION_GRAPH_NODE* child2,
00357 OP* op);
00358
00359
00360
00361 void Complete_Partition_Graph();
00362
00363 BOOL Find_Reachable_Descendant(PG_CONTAINER*,PARTITION_GRAPH_NODE*);
00364
00365
00366 PARTITION_GRAPH_NODE* Get_Lca(PARTITION_GRAPH_NODE*,PARTITION_GRAPH_NODE*);
00367 PARTITION_GRAPH_NODE* Get_Gcd(PARTITION_GRAPH_NODE*,PARTITION_GRAPH_NODE*);
00368
00369
00370 PG_CONTAINER* Get_Subset_Nodes(PARTITION_GRAPH_NODE* node);
00371
00372
00373
00374
00375 BOOL Subtract(PG_CONTAINER* result, PARTITION_GRAPH_NODE* des);
00376
00377 BOOL Subtract(PG_CONTAINER* result, PG_CONTAINER* set);
00378
00379 void Add_Partition(PARTITION_GRAPH_NODE*, PG_CONTAINER*);
00380
00381
00382 void Pre_Computing();
00383
00384 PARTITION_GRAPH_NODE* Find_Node_In_OP(TN_OP_PAIR* tn_op);
00385 void Set_Disjoint(PARTITION_GRAPH_NODE*,PARTITION_GRAPH_NODE*);
00386 void Set_Subset(PARTITION_GRAPH_NODE*,PARTITION_GRAPH_NODE*);
00387 void Rec_Set_Disjoint(PARTITION_GRAPH_NODE*,PARTITION_GRAPH_NODE*);
00388
00389 void Copy_To(OP* op, BB* tgt_BB);
00390 void Move_To(OP* op, BB* tgt_BB);
00391 void Delete(OP* op);
00392
00393 BOOL Is_Complementary(PARTITION_GRAPH_NODE*,PARTITION_GRAPH_NODE*,
00394 PARTITION_GRAPH_NODE*);
00395
00396 void Sum(TN_OP_PAIR* tp , TP_CONTAINER* );
00397 void Diff(TN_OP_PAIR tp, TP_CONTAINER*);
00398
00399 void Reduce(TP_CONTAINER* tp_set, BOOL is_dum);
00400
00401 void Reduce(PG_CONTAINER* pg_set, BOOL is_dum);
00402
00403 public:
00404
00405 BOOL Cycle_Detector();
00406
00407
00408 BOOL Illegal_Partition();
00409
00410
00411 PARTITION_GRAPH(){}
00412 PARTITION_GRAPH(REGION*);
00413 ~PARTITION_GRAPH() {
00414 BB_MAP_Delete(_bb_node_map);
00415 OP_MAP_Delete(_tn_node_map);
00416 }
00417
00418
00419 PARTITION_GRAPH_NODE* Root() { return _root; }
00420 PARTITION_GRAPH_NODE* Dummy() { return _dummy_node; }
00421
00422
00423 PG_CONTAINER& Nodes() { return _nodes;}
00424
00425 OP_MAP Tn_Node_Map() { return _tn_node_map; }
00426
00427 inline void Add_Node(PARTITION_GRAPH_NODE* pgn)
00428 {
00429 _nodes.push_back (pgn);
00430 }
00431
00432
00433 void Del_Relation(INT index)
00434 {
00435 if(!index) return;
00436 PG_CONTAINER::iterator iter;
00437 for(iter = _nodes.begin(); iter!=_nodes.end(); iter++)
00438 {
00439 _disjoint_relation[index][(*iter)->Index()] = FALSE;
00440 _disjoint_relation[(*iter)->Index()][index] = FALSE;
00441 _subset_relation[index][(*iter)->Index()] = FALSE;
00442 _subset_relation[(*iter)->Index()][index] = FALSE;
00443 }
00444 }
00445
00446
00447 void Add_Relation(PARTITION_GRAPH_NODE* child,
00448 PARTITION_GRAPH_NODE* parent);
00449
00450 BOOL Is_Disjoint(TN_OP_PAIR, TN_OP_PAIR);
00451 BOOL Is_Disjoint(BB* , BB*);
00452 BOOL Is_Subset(TN_OP_PAIR, TN_OP_PAIR);
00453 BOOL Is_Subset(BB* , BB*);
00454 BOOL Is_Superset(TN_OP_PAIR, TN_OP_PAIR);
00455 BOOL Is_Superset(BB* , BB*);
00456 BOOL Get_Complementary(TP_CONTAINER* result,TN_OP_PAIR,TN_OP_PAIR);
00457 BOOL Get_Complementary(TP_CONTAINER* result,TN_OP_PAIR , BB* base_bb);
00458 TN* Get_Complementary(TN_OP_PAIR , BB* base_bb);
00459 BOOL Is_Complementary(TN_OP_PAIR , TN_OP_PAIR , TN_OP_PAIR);
00460 BOOL Is_Complementary(TN_OP_PAIR , TN_OP_PAIR, BB*);
00461 float Get_Probability(TN* tn);
00462 float Get_Probability(TN* tn1, TN* tn2);
00463
00464 void Glb_Sum(TN_OP_PAIR* tp, TP_CONTAINER* tp_set);
00465 void Lub_Sum(TN_OP_PAIR* tp, TP_CONTAINER* tp_set);
00466 void Lub_Diff(TN_OP_PAIR tp, TP_CONTAINER*);
00467 void Glb_Diff(TN_OP_PAIR tp, TP_CONTAINER*);
00468
00469
00470 void Update(OP* op, BB* tgt_BB, CODE_MOTION_TYPE);
00471 void Print(FILE* file = stderr);
00472 };
00473
00474 inline PRDB_GEN* Generate_PRDB(REGION_TREE*);
00475 inline PRDB_GEN* Generate_PRDB(REGION*);
00476 void Delete_PRDB(void);
00477 PRDB_GEN* PRDB_Init(REGION_TREE* rgn_tree);
00478 PRDB_GEN* PRDB_Init(REGION* region);
00479 PRDB_GEN* Get_PRDB(void);
00480 BOOL PRDB_Valid(void);
00481
00482 BOOL Is_In_Abnormal_Loop(REGION* r);
00483 inline BOOL Is_Critical_Edge(REGIONAL_CFG_EDGE*);
00484
00485 BOOL Is_No_BB_Region(REGION* region);
00486
00487
00488 inline BB* Find_Region_Entry_BB(REGION*);
00489
00490
00491 #endif
00492
00493
00494
00495