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 #ifndef sched_util_INCLUDED
00029 #define sched_util_INCLUDED
00030
00031 #include "defs.h"
00032
00033 #include <list>
00034 #include <vector>
00035 #include <queue>
00036
00037
00038 #include "mempool.h"
00039 #include "mempool_allocator.h"
00040
00041
00042 #include "ipfec_defs.h"
00043 #include "cg_flags.h"
00044
00045
00046
00047
00048 #include "tracing.h"
00049 #include "bb.h"
00050 #include "op.h"
00051
00052
00053
00054 #include "region.h"
00055 #include "region_verify.h"
00056 #include "dominate.h"
00057
00058 #include "reg_live.h"
00059
00060 #include "targ_issue_port.h"
00061 #include "dag.h"
00062
00063 #ifndef min
00064 #define min(a,b) (((a)<(b))?(a):(b))
00065 #endif
00066
00067 #ifndef max
00068 #define max(a,b) (((a)>(b))?(a):(b))
00069 #endif
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 typedef enum {
00081 SPEC_NONE = 0,
00082 SPEC_CNTL = 1,
00083 SPEC_DATA = 2,
00084 SPEC_COMB = 3,
00085 SPEC_DISABLED = 4,
00086 } SPEC_TYPE ;
00087
00088 typedef enum {
00089 LOAD_FORM_NORMAL = 0,
00090 LOAD_FORM_DOT_S = 1,
00091 LOAD_FORM_DOT_A = 2,
00092 LOAD_FORM_DOT_SA = 3,
00093 LOAD_FORM_LAST = 4,
00094 } LOAD_FORM ;
00095
00096 extern const char* spec_text[] ;
00097 extern const char* arc_text[] ;
00098
00099 extern SPEC_TYPE Derive_Spec_Type_If_Violate_Dep (ARC* arc);
00100
00101
00102 class RGN_CFLOW_MGR ;
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 extern BOOL SCHED_TF_DUMP_IR ;
00113 extern BOOL SCHED_TF_DUMP_DAG ;
00114 extern BOOL SCHED_TF_DUMP_CAND ;
00115 extern BOOL SCHED_TF_SUMMARY_DUMP;
00116 extern BOOL SCHED_TF_VERBOSE_DUMP;
00117 extern BOOL SCHED_TF_DRAW_GLBL_CFG;
00118 extern BOOL SCHED_TF_DRAW_RGNL_CFG;
00119 extern BOOL SCHED_TF_DRAW_LOCAL_DAG;
00120 extern BOOL SCHED_TF_DRAW_RGNL_DAG;
00121 extern BOOL SCHED_TF_TEST_SPEC;
00122
00123 extern INT32 SAFE_CNTL_SPEC_PROB ;
00124 extern INT32 UNSAFE_CNTL_SPEC_PROB ;
00125 extern INT32 SPEC_SAFE_LOAD_WITHOUT_TRANSFORM_REACH_PROB;
00126
00127 extern void Get_Sched_Opts (BOOL prepass) ;
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 class SCHED_UTIL_MEM_POOL {
00138 protected:
00139 MEM_POOL _mem_pool ;
00140
00141 public:
00142 SCHED_UTIL_MEM_POOL () {
00143 MEM_POOL_Initialize (&_mem_pool,"SCHED_UTIL", true);
00144 MEM_POOL_Push(&_mem_pool);
00145 }
00146
00147 ~SCHED_UTIL_MEM_POOL () {
00148 MEM_POOL_Pop (&_mem_pool);
00149 MEM_POOL_Delete (&_mem_pool);
00150 }
00151 };
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 class CFG_NODE_MAP {
00175 private:
00176 MEM_POOL * _mem_pool ;
00177
00178 typedef struct tagNODE_ID_VAL_PAIR{
00179 void * value ;
00180 INT32 node_id ;
00181 tagNODE_ID_VAL_PAIR (void* Value, INT32 Node_id) {
00182 value = Value ; node_id = Node_id ;
00183 }
00184 } NODE_ID_VAL_PAIR ;
00185
00186 typedef mempool_allocator<NODE_ID_VAL_PAIR > _PAIR_ALLOC ;
00187 typedef std::vector<NODE_ID_VAL_PAIR , _PAIR_ALLOC> _PAIR_VECT ;
00188 typedef _PAIR_VECT::iterator _PAIR_VECT_ITER ;
00189
00190 _PAIR_VECT _bb_map_vect, _rgn_map_vect ;
00191
00192 void _bubble_sort (_PAIR_VECT& vect, INT32 low_idx, INT32 hign_idx);
00193 void _set_map (_PAIR_VECT& vect, INT32 id, void *value);
00194 INT32 _find_elem (_PAIR_VECT& vect, INT32 id);
00195
00196 public :
00197
00198 CFG_NODE_MAP (MEM_POOL * mp) :
00199 _mem_pool(mp), _bb_map_vect(mp), _rgn_map_vect(mp) { }
00200
00201 ~CFG_NODE_MAP () {} ;
00202
00203 void Initialize_Map (REGION* rgn) ;
00204 void Initialize_Map (BB *bb) ;
00205
00206 inline void Set_Map (BB * bb, void* value) {
00207 _set_map (_bb_map_vect,BB_id(bb), value);
00208 }
00209
00210 inline void Set_Map (REGION *rgn, void * value) {
00211 _set_map (_rgn_map_vect,rgn->Id(), value) ;
00212 }
00213
00214 inline void Set_Map (REGIONAL_CFG_NODE * nd, void* value) {
00215 if (nd->Is_Region()) Set_Map (nd->Region_Node(), value);
00216 else Set_Map (nd->BB_Node(), value);
00217 }
00218
00219 inline void * Get_Map (BB * bb) {
00220 INT32 pos = _find_elem (_bb_map_vect,BB_id(bb));
00221 return pos >= 0 ? _bb_map_vect[pos].value : NULL ;
00222 }
00223
00224 inline void * Get_Map (REGION * rgn) {
00225 INT32 pos = _find_elem (_rgn_map_vect,rgn->Id()) ;
00226 return pos >= 0 ? _rgn_map_vect[pos].value : NULL;
00227 }
00228
00229 inline void * Get_Map (REGIONAL_CFG_NODE *nd) {
00230 return nd->Is_Region() ? Get_Map (nd->Region_Node()) :
00231 Get_Map (nd->BB_Node()) ;
00232 }
00233
00234 void Dump (FILE *f=stderr) ;
00235
00236 #ifdef Is_True_On
00237 void gdb_dump (void);
00238 #endif
00239 };
00240
00241
00242
00243
00244 typedef INT32 REACH_PROB;
00245 typedef REACH_PROB PROBABILITY;
00246 #define REACH_PROB_SCALE (100)
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 typedef INT16 CYCLE ;
00267 #define CYCLE_MAX (0x7fff)
00268
00269 typedef UINT32 OP_EXT_FLAG;
00270
00271 class SCHED_OP_ANNOT {
00272
00273 public:
00274
00275 OP_EXT_FLAG _ext_flags ;
00276
00277 OP * _op;
00278 BB * _org_home_bb ;
00279
00280 SCHED_OP_ANNOT (OP *associated_op) {
00281 _ext_flags = (OP_EXT_FLAG)0 ;
00282
00283 _op = associated_op; _org_home_bb = OP_bb(_op);
00284 Is_True (_org_home_bb, ("OP has no home BB"));
00285
00286 }
00287
00288 void Add_OP_Ext_Flag (OP_EXT_FLAG e_flags) {
00289 _ext_flags |= e_flags ;
00290 }
00291
00292 void Del_OP_Ext_Flag (OP_EXT_FLAG e_flags) {
00293 _ext_flags &= ~e_flags;
00294 }
00295
00296 ~SCHED_OP_ANNOT () {} ;
00297
00298 SCHED_OP_ANNOT& operator = (SCHED_OP_ANNOT& opnd) {
00299 _ext_flags = opnd._ext_flags ;
00300 _op = opnd._op;
00301 _org_home_bb = opnd._org_home_bb;
00302 }
00303
00304 void Dump (FILE *f=stderr) ;
00305
00306 } ;
00307
00308
00309 class SCHED_BB_ANNOT {
00310
00311 private:
00312
00313 MEM_POOL * _mem_pool ;
00314
00315 BB * _bb ;
00316
00317 OP * _1st_append_op;
00318
00319
00320
00321
00322 OP * _last_prepend_op ;
00323
00324
00325
00326 OP * _xfer_op ;
00327
00328 BB_OP_MAP _ops_annot_map ;
00329 BS * _annot_inited_ops;
00330
00331 void _init_ops_annot (void) ;
00332
00333 inline void _set_op_annot (OP * op, SCHED_OP_ANNOT * annot) ;
00334
00335
00336 public :
00337
00338 SCHED_OP_ANNOT * Get_OP_Annot (OP * op) {
00339 if (BS_MemberP (_annot_inited_ops, OP_map_idx(op))) {
00340 return (SCHED_OP_ANNOT * )BB_OP_MAP_Get (_ops_annot_map, op);
00341 }
00342
00343 return NULL;
00344 }
00345
00346 void Set_OP_Annot (OP* op, SCHED_OP_ANNOT *annot) {
00347 BB_OP_MAP_Set (_ops_annot_map, op, annot);
00348 }
00349
00350 SCHED_OP_ANNOT * Init_New_OP_Annot (OP* op) ;
00351
00352 SCHED_OP_ANNOT * Detach_OP_Annot (OP * op);
00353 void Attach_OP_Annot (OP * op, SCHED_OP_ANNOT * annot) ;
00354
00355 OP * First_Append_OP (void) { return _1st_append_op ; }
00356 void Set_First_Append_OP(OP *op) { _1st_append_op = op; } ;
00357 OP * Last_Prepend_OP (void) { return _last_prepend_op ; }
00358
00359 SCHED_BB_ANNOT (BB *bb, MEM_POOL *mp) ;
00360 ~SCHED_BB_ANNOT () {} ;
00361
00362 void Dump (FILE *f=stderr) ;
00363
00364 };
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376 class SCHED_RGN_ANNOT {
00377 private:
00378 MEM_POOL * _mem_pool;
00379 REGION * _rgn;
00380
00381 public:
00382 SCHED_RGN_ANNOT (REGION *rgn, MEM_POOL *mp) :
00383 _mem_pool(mp) , _rgn(rgn) {}
00384 ~SCHED_RGN_ANNOT () {} ;
00385
00386 void Dump (FILE *f) ;
00387 };
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397 class SCHED_ANNOT : public SCHED_UTIL_MEM_POOL {
00398 private:
00399 CFG_NODE_MAP * _node_map ;
00400 static INT32 _inst_num ;
00401
00402 REGION * _rgn_scope ;
00403 BB * _local_scope;
00404 BB_SET * _isolated_bbs;
00405
00406 public:
00407
00408 SCHED_ANNOT (void);
00409 ~SCHED_ANNOT (void) { -- _inst_num ; }
00410
00411 void Init (REGION *scope) ;
00412 void Init (BB *scope) ;
00413
00414 inline SCHED_BB_ANNOT * Get_BB_Annot (BB *bb) {
00415 return (SCHED_BB_ANNOT*)_node_map->Get_Map (bb);
00416 }
00417
00418 inline SCHED_RGN_ANNOT * Get_Rgn_Annot (REGION *rgn) {
00419 return (SCHED_RGN_ANNOT*)_node_map->Get_Map (rgn);
00420 }
00421
00422 inline SCHED_OP_ANNOT * Get_OP_Annot (OP *op) {
00423 SCHED_BB_ANNOT * bb_annot = Get_BB_Annot (OP_bb(op));
00424 return bb_annot ? bb_annot->Get_OP_Annot (op) : NULL;
00425 }
00426
00427 inline UINT32 Get_OP_Ext_Flags (OP *op) {
00428 return Get_OP_Annot(op)->_ext_flags ;
00429 }
00430
00431 inline UINT32 * Get_OP_Ext_Flags_P (OP *op) {
00432 return &Get_OP_Annot(op)->_ext_flags ;
00433 }
00434
00435
00436 void Isolate_BB_From_Sched_Scope (BB * bb) {
00437 _isolated_bbs = BB_SET_Union1D (
00438 _isolated_bbs,bb, &_mem_pool);
00439 }
00440
00441 BOOL BB_Is_Isolated (BB *bb) { return BB_SET_MemberP(_isolated_bbs,bb); }
00442 void Delete_BB_From_Isolated_BB_Lst (BB* bb) {
00443 _isolated_bbs = BB_SET_Difference1D (_isolated_bbs,bb);
00444 }
00445
00446
00447
00448
00449 void Dump (FILE * f=stderr) ;
00450
00451 };
00452
00453 extern SCHED_ANNOT sched_annot ;
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464 #define OP_EXT_MASK_ACTUAL (0x00000001)
00465 #define OP_EXT_MASK_NO_CNTL_SPEC (0x00000002)
00466 #define OP_EXT_MASK_NO_DATA_SPEC (0x00000004)
00467 #define OP_EXT_MASK_COMPENSATION (0x00000008)
00468
00469 #define Set_OP_Ext_Flag(x,y) \
00470 { sched_annot.Get_OP_Annot ((x))->Add_OP_Ext_Flag (OP_EXT_MASK_ ## y); }
00471 #define OP_Ext_Flag(x,y) (sched_annot.Get_OP_Ext_Flags ((x)) & OP_EXT_MASK_ ## y)
00472 #define Reset_OP_Ext_Flag(x,y) \
00473 { sched_annot.Get_OP_Annot ((x))->Del_OP_Ext_Flag (OP_EXT_MASK_ ## y); }
00474
00475
00476 inline BOOL
00477 OP_ANNOT_Cannot_Data_Spec (OP* op) { return OP_Ext_Flag (op, NO_DATA_SPEC); }
00478
00479 inline void
00480 OP_ANNOT_Set_Cannot_Data_Spec(OP *op) { Set_OP_Ext_Flag (op, NO_DATA_SPEC); }
00481
00482 inline void
00483 OP_ANNOT_Reset_Cannot_Data_Spec(OP *op) { Reset_OP_Ext_Flag (op, NO_DATA_SPEC); }
00484
00485 inline BOOL
00486 OP_ANNOT_Cannot_Cntl_Spec (OP * op) { return OP_Ext_Flag(op, NO_CNTL_SPEC); }
00487
00488 inline void
00489 OP_ANNOT_Set_Cannot_Cntl_Spec (OP* op) { Set_OP_Ext_Flag(op, NO_CNTL_SPEC); }
00490
00491 inline void
00492 OP_ANNOT_Reset_Cannot_Cntl_Spec (OP* op) { Reset_OP_Ext_Flag(op,NO_CNTL_SPEC);}
00493
00494 inline BOOL
00495 OP_ANNOT_Is_Compensation (OP * op) { return OP_Ext_Flag(op, COMPENSATION); }
00496
00497 inline void
00498 OP_ANNOT_Set_Compenstation (OP* op) { Set_OP_Ext_Flag(op, COMPENSATION); }
00499
00500 inline void
00501 OP_ANNOT_Reset_Compensation (OP* op) { Reset_OP_Ext_Flag(op, COMPENSATION);}
00502
00503 inline BOOL
00504 OP_ANNOT_Cannot_Spec (OP * op) {
00505 return OP_ANNOT_Cannot_Cntl_Spec (op) ||
00506 OP_ANNOT_Cannot_Data_Spec (op) ;
00507 }
00508
00509 inline void
00510 OP_ANNOT_Set_Cannot_Spec (OP* op) {
00511 OP_ANNOT_Set_Cannot_Data_Spec (op) ;
00512 OP_ANNOT_Set_Cannot_Cntl_Spec (op) ;
00513 }
00514
00515 inline void
00516 OP_ANNOT_Reset_Cannot_Spec (OP* op) {
00517 OP_ANNOT_Reset_Cannot_Data_Spec (op) ;
00518 OP_ANNOT_Reset_Cannot_Cntl_Spec (op) ;
00519 }
00520
00521 inline BOOL
00522 OP_ANNOT_OP_Def_Actual_Para (OP *op) { return OP_Ext_Flag(op, ACTUAL); }
00523
00524 inline void
00525 OP_ANNOT_Set_OP_Def_Actual_Para (OP *op) { Set_OP_Ext_Flag (op, ACTUAL); }
00526
00527 inline void
00528 OP_ANNOT_Reset_OP_Def_Actual_Para (OP* op) { Reset_OP_Ext_Flag(op,ACTUAL) ;}
00529
00530 inline void
00531 Isolate_BB_From_Sched_Scope (BB * bb) {
00532 sched_annot.Isolate_BB_From_Sched_Scope (bb);
00533 }
00534
00535 inline BOOL
00536 BB_Is_Isolated_From_Sched (BB* bb) {
00537 return sched_annot.BB_Is_Isolated (bb);
00538 }
00539
00540 inline void
00541 Delete_BB_From_Isolated_BB_Lst (BB* bb) {
00542 sched_annot.Delete_BB_From_Isolated_BB_Lst (bb);
00543 }
00544
00545 extern BOOL
00546 OP1_Defs_Are_Used_By_OP2(OP* op1, OP* op2);
00547
00548 extern BOOL
00549 OP1_Defs_Are_Killed_By_OP2(OP* op1, OP* op2);
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564 BOOL Load_Has_Valid_Vaddr(OP* ld);
00565
00566 typedef mempool_allocator<OP*> OP_ALLOC;
00567 typedef std::vector<OP*,OP_ALLOC> OP_Vector;
00568 typedef OP_Vector::iterator OP_Vector_Iter;
00569 typedef OP_Vector::reverse_iterator OP_Vector_Riter ;
00570
00571
00572
00573
00574 inline ISSUE_PORT CGGRP_OP_Issue_Port (OP *op) { return ip_invalid ; }
00575 INT32 CGTARG_adjust_latency (ARC* arc, ISSUE_PORT pred_port,
00576 ISSUE_PORT succ_port);
00577
00578 #endif