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
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 #ifndef opt_cfg_INCLUDED
00127 #define opt_cfg_INCLUDED "opt_cfg.h"
00128 #ifdef _KEEP_RCS_ID
00129 static char *opt_cfgrcs_id = opt_cfg_INCLUDED"$Revision: 1.7 $";
00130 #endif
00131
00132 #ifndef opt_bb_INCLUDED
00133 #include "opt_bb.h"
00134 #endif
00135 #ifndef opt_fb_INCLUDED
00136 #include "opt_fb.h"
00137 #endif
00138 #ifndef opt_base_INCLUDED
00139 #include "opt_base.h"
00140 #endif
00141 #ifndef CXX_MEMORY_INCLUDED
00142 #include "cxx_memory.h"
00143 #endif
00144 #ifndef ERRORS_INCLUDED
00145 #include "errors.h"
00146 #endif
00147 #ifndef region_util_INCLUDED
00148 #include "region_util.h"
00149 #endif
00150
00151
00152 typedef struct region_id RID;
00153 class EXC;
00154 class MOD_PHI_BB_CONTAINER;
00155 class OPT_STAB;
00156 class OPT_TAIL;
00157 class LMV_CFG_ADAPTOR;
00158
00159 class CFG {
00160 friend class EXITBB_ITER;
00161 friend class OPT_TAIL;
00162 private:
00163 BOOL _trace;
00164
00165 DYN_ARRAY<BB_NODE*> _bb_vec;
00166 DYN_ARRAY<BB_NODE*> _entry_vec;
00167 DYN_ARRAY<BB_NODE*> _exit_vec;
00168 DYN_ARRAY<BB_NODE*> _notreach_vec;
00169 DYN_ARRAY<BB_NODE*> _agoto_pred_vec;
00170 DYN_ARRAY<BB_NODE*> _agoto_succ_vec;
00171
00172 BB_NODE **_dfs_vec;
00173 INT32 _dfs_vec_sz;
00174 BB_NODE **_po_vec;
00175 INT32 _po_vec_sz;
00176 BB_NODE **_dpo_vec;
00177 INT32 _dpo_vec_sz;
00178 BB_NODE **_pdo_vec;
00179 INT32 _pdo_vec_sz;
00180 MEM_POOL *_mem_pool;
00181 MEM_POOL *_loc_pool;
00182 BB_NODE *_entry_bb;
00183 BB_NODE *_exit_bb;
00184 BB_NODE *_first_bb;
00185 BB_NODE *_last_bb;
00186 BB_NODE *_fake_entry_bb;
00187 BB_NODE *_fake_exit_bb;
00188 BB_LOOP *_loops;
00189 BOOL _loops_valid;
00190 EXC *_exc;
00191 INT32 _last_stmt_id;
00192
00193
00194 BB_NODE *_current_bb;
00195 IDTYPE _first_bb_id;
00196 IDTYPE _last_bb_id;
00197 MAP *_label_map;
00198 IDTYPE _orig_last_label;
00199 IDTYPE _last_label_num;
00200 INT32 _cur_loop_depth;
00201 BOOL _lower_fully;
00202
00203 OPT_STAB *_opt_stab;
00204 CODEMAP *_htable;
00205 BOOL _calls_break;
00206 BOOL _rvi_break_stmt;
00207 OPT_FEEDBACK *_feedback;
00208 STACK<MP_TY> _mp_type;
00209 STACK<RID *> _mp_rid;
00210 STACK<BB_REGION *> _bb_region;
00211 #if defined(TARG_SL) //PARA_EXTENSION
00212 STACK<SL2_PARA_TY> _sl2_para_type;
00213 STACK<RID *> _sl2_para_rid;
00214 #endif
00215 RID *_rid;
00216 REGION_LEVEL _rgn_level;
00217 BOOL _has_regions;
00218 INT32 _dohead_cnt;
00219
00220 BB_NODE_SET *_bb_set;
00221 BB_NODE_SET *_non_true_body_set;
00222
00223 CFG(const CFG&);
00224 CFG(void);
00225 CFG& operator = (const CFG&);
00226
00227 void Connect_predsucc (BB_NODE *p, BB_NODE *s)
00228 { if (!p->Succ()->Contains(s)) {
00229 p->Append_succ(s,_mem_pool);
00230 s->Append_pred(p,_mem_pool);
00231 } else {
00232 Is_True(s->Pred()->Contains(p),
00233 ("Bad CFG preds and succs"));
00234 }
00235 }
00236 void DisConnect_predsucc (BB_NODE *p, BB_NODE *s)
00237 { p->Remove_succ(s,_mem_pool);
00238 s->Remove_pred(p,_mem_pool);
00239 }
00240 void Connect_after(BB_NODE *p, BB_NODE *s)
00241 { p->Insert_After(s);
00242 Connect_predsucc(p, s);
00243 }
00244 void Init_stmtlist(BB_NODE *b, WN *stmt)
00245 { b->Set_firststmt(stmt);
00246 b->Set_laststmt(stmt);
00247 }
00248 IDTYPE Alloc_bb_id(void)
00249 { return _last_bb_id = _bb_vec.Newidx(); }
00250
00251 BB_NODE *New_bb( BOOL connect, BB_KIND k = BB_GOTO );
00252
00253
00254 BB_NODE *Create_bb( BB_KIND k = BB_GOTO )
00255 { BB_NODE *tmp= CXX_NEW(BB_NODE(), _mem_pool);
00256 tmp->Set_kind(k);
00257 return tmp;
00258 }
00259
00260
00261 void Append_bb( BB_NODE *bb )
00262 { bb->Set_id(Alloc_bb_id());
00263 _bb_vec[bb->Id()] = bb;
00264 if ( _last_bb != NULL ) {
00265 _last_bb->Insert_After(bb);
00266 }
00267 _last_bb = bb;
00268 _current_bb = bb;
00269 }
00270
00271 void Set_current_bb(BB_NODE *b)
00272 { _current_bb = b; }
00273
00274
00275
00276
00277
00278 void Process_not_reached( BOOL can_disconnect );
00279 void Prop_entry(BB_NODE*) const;
00280
00281
00282
00283
00284 void Find_exit_blocks( void );
00285
00286 void Find_no_exit_blocks( BB_NODE *bb, BB_NODE_SET *instack );
00287 void Process_no_exit(void);
00288 void Bkwd_prop_exit(BB_NODE*) const;
00289
00290
00291 void Add_altentry(BB_NODE *bb)
00292 { _entry_vec[_entry_vec.Newidx()] = bb;}
00293
00294 void Add_earlyexit(BB_NODE *bb)
00295 { _exit_vec[_exit_vec.Newidx()] = bb; }
00296
00297 void Add_notreach(BB_NODE *bb)
00298 { _notreach_vec[_notreach_vec.Newidx()] = bb;
00299 bb->Init_stmt(NULL);
00300 }
00301
00302 void Init_last_label
00303 (const IDTYPE lab) { _last_label_num =
00304 _orig_last_label = lab; }
00305 BOOL Verify_wn(WN *wn, WN *parent, WN_MAP wn_map);
00306 void Fill_DFS_vec(BB_NODE *bb);
00307
00308
00309 void Init_dpo_vec(BB_NODE*, INT *id);
00310 void Init_pdo_vec(BB_NODE*, INT *id);
00311
00312
00313 enum END_BLOCK {
00314 END_UNKNOWN,
00315 END_NOT,
00316 END_FALLTHRU,
00317 END_BREAK,
00318 };
00319 void Create_empty_preheader (WN* loop);
00320
00321
00322 void Lower_do_loop(WN *wn, END_BLOCK *ends_bb );
00323 void Lower_do_while(WN *wn, END_BLOCK *ends_bb );
00324 void Lower_while_do(WN *wn, END_BLOCK *ends_bb );
00325 INT Is_simple_expr(WN *wn);
00326 void Lower_if_stmt(WN *wn, END_BLOCK *ends_bb );
00327
00328
00329 void Add_one_io_stmt(WN *wn, END_BLOCK *ends_bb);
00330 void Add_one_do_loop_stmt(WN *wn, END_BLOCK *ends_bb );
00331 void Add_one_do_while_stmt(WN *wn, END_BLOCK *ends_bb );
00332 void Add_one_while_do_stmt(WN *wn, END_BLOCK *ends_bb );
00333 void Add_one_if_stmt(WN *wn, END_BLOCK *ends_bb );
00334 void Add_one_compgoto_stmt(WN *wn, END_BLOCK *ends_bb );
00335 void Add_one_region(WN *wn, END_BLOCK *ends_bb );
00336 void Add_one_stmt(WN *func_nd, END_BLOCK *ends_bb );
00337 BB_NODE *Process_entry( WN *wn, END_BLOCK *ends_bb );
00338
00339 void Create_label_stmt(BB_NODE *bb);
00340
00341
00342 void Copy_xpragmas_into(BB_NODE *bb, WN *pragmas);
00343
00344
00345 BB_NODE *Create_labelled_bb(BB_KIND k=BB_GOTO);
00346
00347 BB_NODE *Create_entrytest(WN *cond, BB_NODE *target);
00348 BB_NODE *Create_loopbody(WN *);
00349
00350 BB_NODE *Create_exittest(WN *, BB_NODE*, BB_KIND);
00351
00352 BB_NODE *Create_conditional(WN *, BB_NODE *, BB_NODE *, BOOL, WN **);
00353
00354 void Create_loop_info( BB_NODE *body_bb, WN *loop_wn );
00355 void Create_blank_loop_info( BB_NODE *body_bb );
00356
00357
00358
00359 BB_LOOP *Ident_loop( BB_NODE *first_bb, BB_NODE *last_bb,
00360 INT32 loopnest, BB_LOOP *cur_loop );
00361
00362 void Set_loop_bb_set(BB_LOOP *loop);
00363 BOOL Check_if_it_can_reach_body_first_bb(BB_NODE *bb, BB_LOOP *loop);
00364 void Compute_true_loop_body_set(BB_LOOP *loop);
00365 BOOL Loop_itself_is_empty(BB_LOOP *loop);
00366 BB_LOOP *Get_last_loop(BB_LOOP *loop);
00367
00368
00369
00370 void Screen_out_false_loopnest(BB_LOOP *loop, BB_LOOP *sibling);
00371
00372 void Ident_mp_regions(void);
00373 #if defined(TARG_SL) //PARA_EXTENSION
00374 void Ident_sl2_para_regions(void);
00375 #endif
00376
00377
00378 BB_NODE* LMV_clone_block (const BB_NODE* src, LMV_CFG_ADAPTOR*);
00379 BB_NODE* LMV_create_alike_block (BB_KIND kind, BB_NODE* model);
00380 void LMV_clone_pred_succ_relationship (LMV_CFG_ADAPTOR*);
00381 void LMV_clone_loop_body (LMV_CFG_ADAPTOR*);
00382 void LMV_update_internal_labels (LMV_CFG_ADAPTOR*);
00383 BB_LOOP* LMV_clone_BB_LOOP (LMV_CFG_ADAPTOR*);
00384 void LMV_gen_precondioning_stuff (LMV_CFG_ADAPTOR*);
00385 void LMV_clone_BB_IFINFO (LMV_CFG_ADAPTOR* );
00386
00387
00388
00389 public:
00390 CFG(MEM_POOL *pool,
00391 MEM_POOL *lpool);
00392 ~CFG(void);
00393
00394 BOOL Trace(void) const { return _trace; }
00395 void Print(FILE *fp=stderr,
00396 BOOL dfs_order = TRUE, IDTYPE bb_id = (IDTYPE) -1);
00397 void PrintLoopVis(BB_LOOP * loop, int & id);
00398 void PrintVis(BOOL draw_loops);
00399 void PrintCDVis(void);
00400 void Validate(FILE *fp=stderr);
00401
00402
00403 void Create(WN *func_nd,
00404 BOOL lower_scf,
00405 BOOL calls_break,
00406 REGION_LEVEL rgn_level,
00407
00408 OPT_STAB *opt_stab,
00409 BOOL do_tail);
00410
00411 void Compute_dom_tree
00412 (BOOL build_dom);
00413 void Compute_dom_frontier(void);
00414 void Compute_bbs_reached(void);
00415 void Compute_control_dependence
00416 (void);
00417
00418 MEM_POOL *Mem_pool(void) const{ return _mem_pool; }
00419 MEM_POOL *Loc_pool(void) const{ return _loc_pool; }
00420 CODEMAP *Htable(void) const{ return _htable; }
00421 void Set_htable(CODEMAP *h) { _htable = h; }
00422 IDTYPE First_bb_id(void) const{ return _first_bb_id; }
00423 IDTYPE Last_bb_id(void) const{ return _last_bb_id; }
00424 mUINT32 Total_bb_count(void) const{ return _last_bb_id+1; }
00425
00426 BOOL Removable_bb( const BB_NODE *bb ) const;
00427 void Remove_bb(BB_NODE *bb);
00428 void Remove_path(BB_NODE *pred, BB_NODE *succ);
00429
00430
00431 void Delete_bb(BB_NODE *bb,
00432 MOD_PHI_BB_CONTAINER *);
00433 #ifdef KEY
00434 void Delete_bbs(BB_LIST *bbs,
00435 MOD_PHI_BB_CONTAINER *);
00436 #endif
00437 BB_NODE *Entry_bb(void) const{ return _entry_bb; }
00438 BB_NODE *Exit_bb(void) const{ return _exit_bb; }
00439 BB_NODE *Fake_entry_bb(void) const{ return _fake_entry_bb; }
00440 BB_NODE *Fake_exit_bb(void) const{ return _fake_exit_bb; }
00441 BB_NODE *First_bb(void) const{ return _first_bb; }
00442 BB_NODE *Last_bb(void) const{ return _last_bb; }
00443 void Set_last_bb( BB_NODE *bb) { _last_bb = bb; }
00444 BB_NODE *Get_bb(mINT32 idx) const{ return _bb_vec[idx]; }
00445
00446 BB_NODE *Func_entry_bb(void) const;
00447
00448
00449
00450
00451 BB_NODE *Split_bb_with_wns(BB_NODE *, WN *);
00452
00453
00454
00455 void Change_block_kind(BB_NODE *, BB_KIND) const;
00456
00457 BB_LOOP *Loops(void) const{ return _loops; }
00458 BOOL Loops_valid() const{ return _loops_valid; }
00459 void Set_loops(BB_LOOP *l) { _loops = l; }
00460 void Set_loops_valid(BOOL b) { _loops_valid = b; }
00461 void Set_exc(EXC *exc) { _exc = exc; }
00462 EXC *Exc(void) const{ return _exc; }
00463
00464 void Reset_stmt_id(void) { _last_stmt_id = INVALID_STMT_ID; }
00465 INT32 Get_stmt_id(void) { return ++_last_stmt_id; }
00466
00467 void Invalidate_loops(void);
00468
00469 LABEL_IDX Alloc_label(void) const
00470 {
00471 LABEL_IDX idx;
00472 New_LABEL(CURRENT_SYMTAB, idx);
00473 return idx;
00474 }
00475
00476 INT32 Cur_loop_depth(void) const{ return _cur_loop_depth; }
00477 void Set_cur_loop_depth(INT32 newdepth)
00478 { _cur_loop_depth = newdepth; }
00479
00480
00481 void Prepend_wn_in(BB_NODE *bb, WN *wn);
00482
00483 void Append_wn_in(BB_NODE *bb, WN *wn);
00484
00485
00486 BOOL Lower_fully(void) const { return _lower_fully; }
00487
00488 BOOL Calls_break(void) const { return _calls_break; }
00489
00490 BOOL Rvi_break_stmt(void) const{ return _rvi_break_stmt; }
00491 void Set_rvi_break_stmt(BOOL b){ _rvi_break_stmt = b; }
00492
00493 OPT_FEEDBACK *Feedback(void) const { return _feedback; }
00494 void Set_feedback(OPT_FEEDBACK *fb) { _feedback = fb; }
00495 BOOL Has_feedback(void) const { return _feedback != NULL; }
00496
00497
00498
00499 void Push_bb_region(BB_REGION *bbr) { _bb_region.Push(bbr); }
00500 BB_REGION *Pop_bb_region(void) { return _bb_region.Pop(); }
00501 BB_REGION *Top_bb_region(void) const { return _bb_region.Top(); }
00502 void Clear_bb_region(void) { _bb_region.Clear(); }
00503 BOOL Null_bb_region(void) const { return _bb_region.Is_Empty(); }
00504
00505
00506 void Push_mp_type(MP_TY t) { _mp_type.Push(t);}
00507 void Push_mp_rid(RID *rid) { _mp_rid.Push(rid); }
00508 MP_TY Pop_mp_type(void) { return _mp_type.Pop(); }
00509 RID *Pop_mp_rid(void) { return _mp_rid.Pop(); }
00510 MP_TY Top_mp_type(void) const { return _mp_type.Top(); }
00511 RID *Top_mp_rid(void) const { return _mp_rid.Top(); }
00512 BOOL NULL_mp_type(void) const { return _mp_type.Is_Empty(); }
00513 void Clear_mp_type(void) { _mp_type.Clear(); }
00514 void Clear_mp_rid(void) { _mp_rid.Clear(); }
00515
00516 BOOL Inside_mp_do(void) { return !NULL_mp_type() &&
00517 Top_mp_type() != MP_REGION;
00518 }
00519 #if defined(TARG_SL) //PARA_EXTENSION
00520
00521 void Push_sl2_para_type(SL2_PARA_TY t) { _sl2_para_type.Push(t);}
00522 void Push_sl2_para_rid(RID *rid) { _sl2_para_rid.Push(rid); }
00523 SL2_PARA_TY Pop_sl2_para_type(void) { return _sl2_para_type.Pop(); }
00524 RID *Pop_sl2_para_rid(void) { return _sl2_para_rid.Pop(); }
00525 SL2_PARA_TY Top_sl2_para_type(void) const { return _sl2_para_type.Top(); }
00526 RID *Top_sl2_para_rid(void) const { return _sl2_para_rid.Top(); }
00527 BOOL NULL_sl2_para_type(void) const { return _sl2_para_type.Is_Empty(); }
00528 void Clear_sl2_para_type(void) { _sl2_para_type.Clear(); }
00529 void Clear_sl2_para_rid(void) { _sl2_para_rid.Clear(); }
00530
00531 BOOL Inside_sl2_para_do(void) { return !NULL_sl2_para_type() &&
00532 Top_sl2_para_type() != SL2_PARA_REGION;
00533 }
00534
00535 #endif
00536
00537
00538 RID *Rid(void) const { return _rid; }
00539
00540 REGION_LEVEL Rgn_level(void) const { return _rgn_level; }
00541
00542 void Set_has_regions(void) { _has_regions = TRUE; }
00543 BOOL Has_regions(void) const { return _has_regions; }
00544
00545 void Inc_dohead_cnt(void) { _dohead_cnt++; }
00546 INT32 Dohead_cnt(void) const { return _dohead_cnt; }
00547
00548
00549
00550 BB_NODE *Get_bb_from_label(INT32 l) const
00551 { return (BB_NODE*)
00552 _label_map->Get_val((POINTER)(INTPTR)l);
00553 }
00554 void Append_label_map (INT32 labnum, BB_NODE *bb)
00555 { _label_map->Add_map((POINTER)(INTPTR)labnum,
00556 (POINTER)bb);
00557 bb->Set_labnam(labnum);
00558 }
00559
00560 BB_NODE *Add_bb_to_edge(BB_NODE *, BB_NODE *);
00561
00562
00563 const BB_LOOP *Find_innermost_loop_contains(BB_NODE *bb);
00564
00565
00566
00567 BB_NODE *Find_enclosing_region_bb( BB_NODE *, WN_PRAGMA_ID );
00568 #ifdef KEY
00569
00570
00571 BB_NODE *Find_enclosing_parallel_region_bb( BB_NODE *);
00572 #endif
00573
00574
00575
00576
00577 BOOL Is_outermost_loop_in_parallel_region( BB_LOOP *loop,
00578 WN_PRAGMA_ID pragma_id );
00579
00580
00581
00582
00583 void Find_not_reached();
00584
00585
00586 void Connect_agotos();
00587
00588
00589 void Remove_agoto_pred( BB_NODE *bb );
00590
00591
00592 INT32 Agoto_succ_entries();
00593
00594
00595 BB_NODE *Agoto_succ_bb(INT32 idx);
00596
00597
00598
00599 void Process_multi_entryexit( BOOL is_whirl );
00600
00601
00602
00603 void Remove_fake_entryexit_arcs( void );
00604
00605
00606
00607 void Invalidate_and_update_aux_info(void);
00608
00609
00610
00611
00612 INT Remove_critical_edge();
00613
00614
00615
00616
00617
00618
00619 void Get_pred_first_vec( BB_NODE *bbvec[], INT32 *numbbs );
00620 BB_NODE **Dfs_vec(void);
00621 INT32 Dfs_vec_sz(void) const { return _dfs_vec_sz; }
00622
00623 BB_NODE **Po_vec(void);
00624 INT32 Po_vec_sz(void) const { return _po_vec_sz; }
00625 BB_NODE *Po_Bb(INT32 n) const { return _po_vec[n]; }
00626
00627
00628 BB_NODE **Dpo_vec(void);
00629 INT32 Dpo_vec_sz(void) const { return _dpo_vec_sz; }
00630 BB_NODE *Dpo_Bb(INT32 n) const { return _dpo_vec[n]; }
00631
00632
00633 BB_NODE **Pdo_vec(void);
00634 INT32 Pdo_vec_sz(void) const { return _pdo_vec_sz; }
00635 BB_NODE *Pdo_Bb(INT32 n) const { return _pdo_vec[n]; }
00636
00637 BOOL Verify_tree(WN *);
00638 BOOL Verify_cfg(void);
00639
00640
00641
00642
00643 void Find_loop_cycles( void );
00644
00645 BB_LOOP *Analyze_loops(void);
00646
00647 BB_NODE *Find_entry_bb(void);
00648
00649 BOOL Fall_through(BB_NODE *bb1, BB_NODE *bb2);
00650
00651 void Delete_empty_BB();
00652
00653 void Clone_bb(IDTYPE source, IDTYPE dest);
00654
00655
00656 BB_NODE *Create_and_allocate_bb( BB_KIND k )
00657 { BB_NODE *bb = Create_bb(k);
00658 bb->Set_id(Alloc_bb_id());
00659 _bb_vec[bb->Id()] = bb;
00660 return bb;
00661 }
00662
00663
00664 BOOL LMV_eligible_for_multiversioning (const BB_LOOP*, BOOL);
00665 void LMV_clone_loop (LMV_CFG_ADAPTOR*);
00666 BOOL If_convertible_cond(WN* wn);
00667 BOOL If_conv_criteria_met(WN* wn, WN* else_wn, WN* then_wn, BOOL empty_else, BOOL empty_then);
00668 BOOL Screen_cand(WN* wn, WN* else_wn, WN* then_wn, BOOL empty_else, BOOL empty_then);
00669 WN* Conv_to_select(WN* wn);
00670
00671 };
00672
00673
00674
00675
00676 class CFG_ITER {
00677 private:
00678 const CFG *cfg;
00679 BB_NODE *cur;
00680
00681 CFG_ITER(const CFG_ITER&);
00682 CFG_ITER& operator = (const CFG_ITER&);
00683
00684 public:
00685 CFG_ITER(void) { cfg = NULL; cur = NULL; }
00686 CFG_ITER(CFG *g) { cfg = g; cur = NULL; }
00687 CFG_ITER(const CFG *g) { cfg = g; cur = NULL; }
00688 ~CFG_ITER(void) {}
00689
00690 void Init(CFG *g) { cfg = g; }
00691 void Init(void) {}
00692 BB_NODE *First(void) { return cur = cfg->First_bb(); }
00693 BB_NODE *Last(void) { return cur = cfg->Last_bb(); }
00694 BB_NODE *Next(void) { return cur = ((cur)? cur->Next() : NULL); }
00695 BB_NODE *Prev(void) { return cur = ((cur)? cur->Prev() : NULL); }
00696 BB_NODE *Cur(void) { return cur; }
00697 BOOL Is_Empty(void) { return cur == NULL; }
00698 BOOL Is_Empty_Reverse(void){ return cur == NULL; }
00699 BB_NODE *First_elem(void) { return cur = cfg->First_bb(); }
00700 BB_NODE *Next_elem(void) { return cur = ((cur)? cur->Next() : NULL); }
00701 BB_NODE *Prev_elem(void) { return cur = ((cur)? cur->Prev() : NULL); }
00702 };
00703
00704
00705 class DFSBB_ITER {
00706 BB_NODE **_dfs_bbs;
00707 INT32 _bbs_count;
00708 INT32 _cur;
00709
00710
00711 DFSBB_ITER(void);
00712 DFSBB_ITER(const DFSBB_ITER&);
00713 DFSBB_ITER& operator = (const DFSBB_ITER&);
00714
00715 BB_NODE *Dfs_Bb(INT32 n) const{ return _dfs_bbs[n]; }
00716 INT32 Bbs_count(void) const{ return _bbs_count; }
00717
00718 public:
00719 DFSBB_ITER(CFG *cfg) { _dfs_bbs = cfg->Dfs_vec();
00720 _bbs_count = cfg->Dfs_vec_sz();
00721 }
00722 ~DFSBB_ITER(void) {}
00723
00724 void Init(void) {}
00725 INT32 First(void) { return _cur = 0; }
00726 INT32 Last(void) { return _cur = Bbs_count() - 1; }
00727 INT32 Next(void) { return _cur = _cur + 1; }
00728 INT32 Prev(void) { return _cur = _cur - 1; }
00729 INT32 Cur(void) { return _cur; }
00730 BOOL Is_Empty(void) { return _cur >= Bbs_count(); }
00731 BOOL Is_Empty_Reverse(void){ return _cur < 0; }
00732 BB_NODE *First_elem(void) { First(); return Dfs_Bb(_cur); }
00733 BB_NODE *Last_elem(void) { Last(); return Dfs_Bb(_cur); }
00734 BB_NODE *Next_elem(void) { Next(); return Dfs_Bb(_cur); }
00735 BB_NODE *Prev_elem(void) { Prev(); return Dfs_Bb(_cur); }
00736
00737 };
00738
00739
00740
00741
00742 class POBB_ITER {
00743 BB_NODE **_po_bbs;
00744 INT32 _bbs_count;
00745 INT32 _cur;
00746
00747
00748 POBB_ITER(void);
00749 POBB_ITER(const POBB_ITER&);
00750 POBB_ITER& operator = (const POBB_ITER&);
00751
00752 BB_NODE *Po_Bb(INT32 n) const{ return _po_bbs[n]; }
00753 INT32 Bbs_count(void) const{ return _bbs_count; }
00754
00755 public:
00756 POBB_ITER(CFG *cfg)
00757 {
00758 _po_bbs = cfg->Po_vec();
00759 _bbs_count = cfg->Po_vec_sz();
00760 }
00761
00762 ~POBB_ITER(void) {}
00763
00764 void Init(void) {}
00765 INT32 First(void) { return _cur = 0; }
00766 INT32 Last(void) { return _cur = Bbs_count() - 1; }
00767 INT32 Next(void) { return _cur = _cur + 1; }
00768 INT32 Prev(void) { return _cur = _cur - 1; }
00769 INT32 Cur(void) { return _cur; }
00770 BOOL Is_Empty(void) { return _cur >= Bbs_count(); }
00771 BOOL Is_Empty_Reverse(void){ return _cur < 0; }
00772 BB_NODE *First_elem(void) { First(); return Po_Bb(_cur); }
00773 BB_NODE *Last_elem(void) { Last(); return Po_Bb(_cur); }
00774 BB_NODE *Next_elem(void) { Next(); return Po_Bb(_cur); }
00775 BB_NODE *Prev_elem(void) { Prev(); return Po_Bb(_cur); }
00776 };
00777
00778
00779
00780
00781 class RPOBB_ITER {
00782 POBB_ITER _po_iter;
00783
00784
00785 RPOBB_ITER(void);
00786 RPOBB_ITER(const RPOBB_ITER&);
00787 RPOBB_ITER& operator = (const RPOBB_ITER&);
00788
00789 public:
00790 RPOBB_ITER(CFG *cfg) : _po_iter(cfg) {}
00791 ~RPOBB_ITER(void) {}
00792
00793 void Init(void) {}
00794 INT32 First(void) { return _po_iter.Last(); }
00795 INT32 Last(void) { return _po_iter.First(); }
00796 INT32 Next(void) { return _po_iter.Prev(); }
00797 INT32 Prev(void) { return _po_iter.Next(); }
00798 INT32 Cur(void) { return Last() + First() - _po_iter.Cur(); }
00799 BOOL Is_Empty(void) { return _po_iter.Is_Empty_Reverse(); }
00800 BOOL Is_Empty_Reverse(void){ return _po_iter.Is_Empty(); }
00801 BB_NODE *First_elem(void) { return _po_iter.Last_elem(); }
00802 BB_NODE *Last_elem(void) { return _po_iter.First_elem(); }
00803 BB_NODE *Next_elem(void) { return _po_iter.Prev_elem(); }
00804 BB_NODE *Prev_elem(void) { return _po_iter.Next_elem(); }
00805 };
00806
00807
00808
00809 class DPOBB_ITER {
00810 BB_NODE **_dpo_bbs;
00811 INT32 _bbs_count;
00812 INT32 _cur;
00813
00814
00815 DPOBB_ITER(void);
00816 DPOBB_ITER(const DPOBB_ITER&);
00817 DPOBB_ITER& operator = (const DPOBB_ITER&);
00818
00819 BB_NODE *Dpo_Bb(INT32 n) const{ return _dpo_bbs[n]; }
00820 INT32 Bbs_count(void) const{ return _bbs_count; }
00821
00822 public:
00823 DPOBB_ITER(CFG *cfg, BOOL dom = TRUE)
00824 {
00825 if (dom) {
00826 _dpo_bbs = cfg->Dpo_vec();
00827 _bbs_count = cfg->Dpo_vec_sz();
00828 } else {
00829 _dpo_bbs = cfg->Pdo_vec();
00830 _bbs_count = cfg->Pdo_vec_sz();
00831 }
00832 }
00833
00834 ~DPOBB_ITER(void) {}
00835
00836 void Init(void) {}
00837 INT32 First(void) { return _cur = 0; }
00838 INT32 Last(void) { return _cur = Bbs_count() - 1; }
00839 INT32 Next(void) { return _cur = _cur + 1; }
00840 INT32 Prev(void) { return _cur = _cur - 1; }
00841 INT32 Cur(void) { return _cur; }
00842 BOOL Is_Empty(void) { return _cur >= Bbs_count(); }
00843 BOOL Is_Empty_Reverse(void){ return _cur < 0; }
00844 BB_NODE *First_elem(void) { First(); return Dpo_Bb(_cur); }
00845 BB_NODE *Last_elem(void) { Last(); return Dpo_Bb(_cur); }
00846 BB_NODE *Next_elem(void) { Next(); return Dpo_Bb(_cur); }
00847 BB_NODE *Prev_elem(void) { Prev(); return Dpo_Bb(_cur); }
00848 };
00849
00850
00851 class EXITBB_ITER {
00852 CFG *_cfg;
00853 INT32 _cur;
00854
00855
00856
00857 EXITBB_ITER(void);
00858 EXITBB_ITER(const EXITBB_ITER&);
00859 EXITBB_ITER& operator = (const EXITBB_ITER&);
00860
00861 public:
00862 EXITBB_ITER(CFG *cfg) { _cfg = cfg; }
00863 ~EXITBB_ITER(void) {}
00864
00865 BB_NODE *Cur_exit_bb() const { return _cfg->_exit_vec[_cur]; }
00866 void Init(void) {}
00867 void First(void) { _cur = 0; }
00868 void Next(void) { _cur++; }
00869 BOOL Is_Empty(void) { return _cur > _cfg->_exit_vec.Lastidx(); }
00870 };
00871
00872 class MOD_PHI_BB : public SLIST_NODE {
00873 BB_NODE *_bb;
00874 PHI_LIST *_old_lst;
00875 PHI_LIST *_new_lst;
00876
00877
00878 MOD_PHI_BB(const MOD_PHI_BB&);
00879 MOD_PHI_BB& operator = (const MOD_PHI_BB&);
00880 MOD_PHI_BB(void);
00881 public:
00882
00883 MOD_PHI_BB(BB_NODE *bb, PHI_LIST *old_lst, PHI_LIST *new_lst):
00884 _bb(bb), _old_lst(old_lst), _new_lst(new_lst) {}
00885 ~MOD_PHI_BB(void) {}
00886
00887 BB_NODE *Bb(void) const { return _bb; }
00888 PHI_LIST *Old_lst(void) const { return _old_lst; }
00889 PHI_LIST *New_lst(void) const { return _new_lst; }
00890 void Set_new_lst(PHI_LIST *lst) { _new_lst = lst; }
00891 };
00892
00893 class MOD_PHI_BB_CONTAINER : public SLIST {
00894 private:
00895 MEM_POOL *_mem_pool;
00896
00897 MOD_PHI_BB_CONTAINER(const MOD_PHI_BB_CONTAINER&);
00898 MOD_PHI_BB_CONTAINER& operator = (const MOD_PHI_BB_CONTAINER&);
00899
00900 DECLARE_SLIST_CLASS( MOD_PHI_BB_CONTAINER, MOD_PHI_BB )
00901
00902 public:
00903 MOD_PHI_BB_CONTAINER(MEM_POOL *pool):_mem_pool(pool) {}
00904 ~MOD_PHI_BB_CONTAINER(void) {}
00905
00906 void Add_entry(BB_NODE *bb,
00907 PHI_LIST *old_lst,
00908 PHI_LIST *new_lst,
00909 MEM_POOL *pool);
00910 };
00911
00912 class MOD_PHI_BB_ITER : public SLIST_ITER {
00913 DECLARE_SLIST_ITER_CLASS( MOD_PHI_BB_ITER, MOD_PHI_BB, MOD_PHI_BB_CONTAINER )
00914 public:
00915 void Init() {}
00916 };
00917
00918 extern BOOL Remove_region_exit(BB_NODE *, BOOL);
00919 extern void Remove_region_entry(BB_NODE *);
00920
00921 inline BOOL Is_backedge(BB_NODE *tail, BB_NODE *head)
00922 {
00923 return head->Dominates(tail);
00924 }
00925
00926 extern void Add_new_auxid_to_entry_chis(AUX_ID, CFG *, CODEMAP *, OPT_STAB *);
00927
00928 #endif // opt_cfg_INCLUDED