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
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 #ifndef sched_rgn_info_INCLUDED
00055 #define sched_rgn_info_INCLUDED
00056
00057 #include "sched_cflow.h"
00058
00059
00060
00061 typedef enum {
00062
00063 SKIP_RGN_NONE,
00064 SKIP_RGN_IMPROPER,
00065 SKIP_RGN_NON_SEME,
00066 SKIP_RGN_CRITICAL_EDGE,
00067 SKIP_RGN_DEBUG,
00068
00069 SKIP_RGN_NO_FURTHER_OPT
00070
00071 } SKIP_SCHED_RGN_REASON ;
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 class RGN_SUM_ROOT_NODE;
00085 typedef RGN_SUM_ROOT_NODE RGN_SUM_TREE ;
00086
00087 class RGN_SUMMARY {
00088 private:
00089 REGION * _rgn;
00090 MEM_POOL * _mp ;
00091 RGN_SUM_TREE * _forest;
00092
00093
00094 REGION_TYPE _rgn_type ;
00095 INT32 _tree_num ;
00096 BOOL _summary_is_valid;
00097
00098
00099
00100
00101
00102
00103 TN_SET * _killed_def ;
00104
00105 TN_SET * _tn_used ;
00106
00107 mBOOL _has_call ;
00108
00109 mBOOL _has_nested_rgn;
00110
00111 mBOOL _has_cannot_move_across_RGN ;
00112
00113
00114
00115 mBOOL _has_load ;
00116 mBOOL _has_store ;
00117 mBOOL _has_rotating_kernel ;
00118
00119 mINT16 _bb_in_total ;
00120
00121 public:
00122
00123 RGN_SUMMARY (REGION * rgn,MEM_POOL *mp) ;
00124 ~RGN_SUMMARY (void) ;
00125
00126 INT32 Tree_Num (void) { return _tree_num ; }
00127 RGN_SUM_TREE * First_Tree (void) { return _forest ; }
00128
00129 REGION * Region (void) { return _rgn ; }
00130 void Set_Region (REGION *rgn) { _rgn = rgn ; }
00131
00132 BOOL Summary_Is_Valid (void) const { return _summary_is_valid; }
00133 void Set_Summary_Is_Valid (void) { _summary_is_valid = TRUE; }
00134 void Set_Summary_Is_Invalid (void) { _summary_is_valid = FALSE; }
00135
00136 TN_SET* Killed_Def (void) const { return _killed_def ; }
00137 TN_SET* TN_Used (void) const { return _tn_used ; }
00138
00139 void Clear_Def_Kill_Set (void) { TN_SET_ClearD (_killed_def) ; }
00140 void Init_Def_Kill_Set (void) {
00141 if (!_killed_def) {
00142 _killed_def = TN_SET_Create_Empty ((INT32)Last_TN, _mp);
00143 }
00144 Clear_Def_Kill_Set ();
00145 }
00146
00147 void Init_Use_TN_Set (void) {
00148
00149 if (!_tn_used) {
00150 _tn_used = TN_SET_Create_Empty ((INT32)Last_TN, _mp);
00151 }
00152
00153 _tn_used = TN_SET_ClearD (_tn_used);
00154 }
00155
00156 void Union_Killed_Def (TN_SET* s) { _killed_def = TN_SET_UnionD(
00157 _killed_def,s, _mp); }
00158 void Union_Use_TNs (TN_SET* s) { _tn_used = TN_SET_UnionD(
00159 _tn_used, s, _mp); }
00160
00161 BOOL Has_Call (void) const { return _has_call ; }
00162 void Clear_Has_Call (void) { _has_call = FALSE ; }
00163 void Set_Has_Call (void) { _has_call = TRUE ; }
00164
00165 BOOL Has_Load (void) const { return _has_load ; }
00166 void Clear_Has_Load (void) { _has_load = FALSE ; }
00167 void Set_Has_Load (void) { _has_load = TRUE ; }
00168
00169 BOOL Has_Rotating_Kernel (void) { return _has_rotating_kernel ; }
00170 void Clear_Has_Rotating_Kernel (void) { _has_rotating_kernel = FALSE ; }
00171 void Set_Has_Rotating_Kernel (void) { _has_rotating_kernel = TRUE ; }
00172
00173 BOOL Has_Store (void) const { return _has_store ; }
00174 void Clear_Has_Store (void) { _has_store = FALSE; }
00175 void Set_Has_Store (void) { _has_store = TRUE ; }
00176
00177 BOOL Has_Mem_OP (void) const { return Has_Load () || Has_Store () ; }
00178
00179 BOOL Has_Nested_Rgn (void) const { return _has_nested_rgn ; }
00180 void Clear_Has_Nested_Rgn (void) { _has_nested_rgn = FALSE; }
00181 void Set_Has_Nested_Rgn (void) { _has_nested_rgn = TRUE ; }
00182
00183 BOOL Has_Cannot_Move_Across_RGN (void) const {
00184 return _has_cannot_move_across_RGN ;
00185 }
00186
00187 void Clear_Has_Cannot_Move_Across_Rgn (void) {
00188 _has_cannot_move_across_RGN = FALSE;
00189 }
00190
00191 void Set_Has_Cannot_Move_Across_Rgn (void) {
00192 _has_cannot_move_across_RGN = TRUE ;
00193 }
00194
00195 MEM_POOL * Underlying_MEM_POOL (void) const { return _mp ; }
00196
00197 void Adjust_Liveness_After_OP_Being_Moved_Across_Rgn (OP * op);
00198
00199
00200
00201 void Set_BB_Total_Num (INT32 bb_num) { _bb_in_total = bb_num ; }
00202 INT16 Get_BB_Total_num (void) const { return _bb_in_total ; }
00203
00204
00205 void Dump (FILE * f=stderr, BOOL verbose=TRUE);
00206 #ifdef Is_True_On
00207 void gdb_dump (void);
00208 #endif
00209
00210 };
00211
00212
00213
00214
00215
00216
00217 typedef struct tagRGN_INFO RGN_INFO ;
00218 struct tagRGN_INFO {
00219
00220 REGION * rgn ;
00221 RGN_SUMMARY * summary ;
00222 SKIP_SCHED_RGN_REASON skip_reason ;
00223
00224 BOOL in_abnormal_loop;
00225
00226
00227
00228 tagRGN_INFO (void) {
00229 rgn = NULL;
00230 summary = NULL;
00231 skip_reason = SKIP_RGN_DEBUG;
00232 in_abnormal_loop = TRUE;
00233 }
00234
00235
00236 REGION* Region (void) const { return rgn; }
00237 void Set_Region (REGION *r) { rgn = r ; }
00238
00239 RGN_SUMMARY* Summary (void) const { return summary; }
00240 void Set_Summary (RGN_SUMMARY* s) { summary = s ; }
00241
00242 SKIP_SCHED_RGN_REASON Skip_Sched_Reason(void) const {return skip_reason;}
00243 void Set_Skip_Sched_Reason (SKIP_SCHED_RGN_REASON r) { skip_reason = r ;}
00244
00245 BOOL In_Abnormal_Loop (void) const { return in_abnormal_loop; }
00246 void Set_In_Abnormal_Loop (BOOL b) { in_abnormal_loop = b ; }
00247
00248 void Dump (FILE * f=stderr) ;
00249 };
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 typedef struct _tagRGN_CFG_PATH_INFO RGN_CFG_PATH_INFO ;
00269 struct _tagRGN_CFG_PATH_INFO {
00270 private:
00271 TN_SET* _killed_def ;
00272
00273 TN_SET* _tn_used ;
00274
00275 MEM_POOL* _mp ;
00276 RGN_CFG_PATH_INFO* _next ;
00277
00278 INT32 _bb_num ;
00279 INT32 _rgn_num ;
00280 mBOOL _has_call ;
00281 mBOOL _has_load ;
00282 mBOOL _has_store ;
00283
00284 mBOOL _has_rotating_kernel;
00285
00286 mBOOL _summary_unknown;
00287
00288
00289 public:
00290
00291 void Clear (void) {
00292
00293 _killed_def = TN_SET_ClearD (_killed_def);
00294 _bb_num = 0;
00295 _rgn_num = 0;
00296 _has_call = FALSE;
00297 _summary_unknown = FALSE ;
00298 _next = NULL;
00299
00300 }
00301
00302 void Union_Def_Kill (BB * bb) {
00303 _killed_def = TN_SET_UnionD (_killed_def,
00304 BBREGS_live_def(BB_bbregs(bb)), _mp);
00305 }
00306
00307 void Derive_RGN_CFG_PATH_INFO_from_RGN_SUMMARY (RGN_SUMMARY * sum);
00308
00309 _tagRGN_CFG_PATH_INFO (MEM_POOL *m) : _mp(m) {
00310 _killed_def = TN_SET_Create_Empty (Last_TN,_mp);
00311 _tn_used = TN_SET_Create_Empty (Last_TN,_mp);
00312 _bb_num = 0;
00313 _rgn_num = 0;
00314 _has_call = FALSE;
00315 _summary_unknown = FALSE ;
00316 _next = NULL;
00317 }
00318
00319 ~_tagRGN_CFG_PATH_INFO (void) { };
00320
00321 void Derive_RGN_CFG_PATH_INFO_from_REGION_Node (RGN_SUMMARY * sum) ;
00322 void Derive_RGN_CFG_PATH_INFO_from_BB_Node (BB * bb) ;
00323
00324
00325
00326 TN_SET* Killed_Def (void) const { return _killed_def; }
00327 void Set_Killed_Def (TN_SET *kd) { _killed_def = kd ; }
00328
00329 TN_SET* TN_Used (void) const { return _tn_used ; }
00330
00331 INT32 BB_Num (void) const { return _bb_num ; }
00332 INT32 Rgn_Num (void) const { return _rgn_num ; }
00333
00334 BOOL Has_Call (void) const { return _has_call; }
00335 BOOL Has_Load (void) const { return _has_load; }
00336 BOOL Has_Store(void) const { return _has_store;}
00337 BOOL Has_has_rotating_kernel (void) const {
00338 return _has_rotating_kernel;
00339 }
00340 BOOL Rgn_Summary_Unknown (void) const { return _summary_unknown; }
00341
00342 RGN_CFG_PATH_INFO* Next (void) const { return _next ; }
00343 void Set_Next (RGN_CFG_PATH_INFO* n) { _next = n ; }
00344 };
00345
00346
00347 class REGION_INFO_MGR : public SCHED_UTIL_MEM_POOL {
00348
00349 protected:
00350
00351 REGION_TREE * _rgn_tree ;
00352
00353
00354
00355
00356
00357
00358 REGION_MAP _rgn_2_rgn_info;
00359 void Acquire_Rgn_Info (void);
00360
00361 RGN_CFG_PATH_INFO * _free_rgn_cfg_path_info_lnk ;
00362 RGN_CFG_PATH_INFO * New_RGN_CFG_PATH_INFO (void);
00363 void Free_RGN_CFG_PATH_INFO (RGN_CFG_PATH_INFO * info) ;
00364
00365
00366 public :
00367
00368
00369 REGION_INFO_MGR (REGION_TREE *rgn_tree);
00370 ~REGION_INFO_MGR (void) ;
00371
00372
00373
00374 REGION_TREE * Region_Tree (void) { return _rgn_tree ; }
00375
00376
00377
00378 RGN_INFO * Get_Rgn_Info (REGION * rgn) {
00379 return (RGN_INFO*)REGION_MAP_Get (_rgn_2_rgn_info,rgn);
00380 }
00381
00382
00383
00384 RGN_SUMMARY * Get_Rgn_Summary (REGION *rgn) {
00385 RGN_INFO * info = Get_Rgn_Info (rgn) ;
00386 return info ? info-> Summary () : NULL;
00387 }
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405 void Build_Rgn_Summary (REGION *rgn,
00406 RGN_CFLOW_MGR* rgn_cflow_info=NULL);
00407
00408
00409 void Dump (FILE * f=stderr, BOOL verbose=TRUE);
00410 };
00411
00412 extern REGION_INFO_MGR * _rgn_info_mgr;
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425 inline void
00426 Acquire_Region_Info (REGION_TREE *rgn_tree) {
00427
00428 Is_True (!_rgn_info_mgr,
00429 ("<_rgn_info_mgr> has not been destructed properly!"));
00430
00431 _rgn_info_mgr = CXX_NEW(REGION_INFO_MGR(rgn_tree), &MEM_phase_pool);
00432 }
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443 inline void
00444 Free_Region_Info_Memory (void) {
00445
00446 Is_True (_rgn_info_mgr, ("_rgn_info_mgr can not be NULL!"));
00447
00448 _rgn_info_mgr->~REGION_INFO_MGR ();
00449 _rgn_info_mgr = NULL;
00450
00451 }
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466 #ifdef Is_True_On
00467
00468 inline void
00469 _rgn_info_mgr_validity_check (REGION *rgn) {
00470 Is_True (_rgn_info_mgr, ("_rgn_info_mgr can not be NULL!"));
00471 Is_True (rgn->Tree () == _rgn_info_mgr->Region_Tree(),
00472 ("ambiguous region tree!"));
00473 }
00474
00475 #else
00476
00477 #define _rgn_info_mgr_validity_check(x) ((void)0)
00478
00479 #endif
00480
00481
00482 inline RGN_INFO *
00483 Get_Region_Info (REGION *rgn) {
00484
00485 _rgn_info_mgr_validity_check(rgn);
00486 return _rgn_info_mgr->Get_Rgn_Info (rgn);
00487
00488 }
00489
00490 inline RGN_SUMMARY *
00491 Get_Region_Summary (REGION *rgn) {
00492 _rgn_info_mgr_validity_check(rgn);
00493 return _rgn_info_mgr->Get_Rgn_Info(rgn)->Summary ();
00494 }
00495
00496 inline void
00497 Build_Region_Summary (REGION *rgn, RGN_CFLOW_MGR * rgn_cflow_info=NULL) {
00498
00499 _rgn_info_mgr_validity_check(rgn);
00500 return _rgn_info_mgr->Build_Rgn_Summary (rgn, rgn_cflow_info);
00501
00502 }
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513 BOOL No_OP_Can_be_Moved_Across_Region (REGION *rgn) ;
00514 BOOL Is_Large_Region (REGION *rgn) ;
00515
00516 #endif