00001
00002 #ifndef opt_lclsc_INCLUDED
00003 #define opt_lclsc_INCLUDED "opt_lclsc.h"
00004
00005 #include "opt_bb.h"
00006 #include "cxx_memory.h"
00007 #include "opt_cfg.h"
00008 #include "opt_sym.h"
00009 #include "opt_mu_chi.h"
00010 #include "opt_htable.h"
00011 #include "errors.h"
00012 #include "defs.h"
00013 #include "vector"
00014 #include "map"
00015 #include "bb_node_set.h"
00016 #include "idx_32_set.h"
00017 #include "opt_alias_rule.h"
00018 #include "opt_points_to.h"
00019 #include "stblock.h"
00020
00021 using namespace std;
00022
00023 class LCLSC_NODE{
00024 private:
00025 ST* _st;
00026 BB_NODE_SET *_live_range;
00027 public:
00028 LCLSC_NODE(ST *st, CFG *cfg, MEM_POOL *pool)
00029 {
00030 _st=st;
00031 _live_range=CXX_NEW(BB_NODE_SET(cfg->Total_bb_count(), cfg, pool, BBNS_EMPTY), pool);
00032 }
00033 ~LCLSC_NODE() {}
00034 ST* Get_st() {return _st;}
00035 BB_NODE_SET * Get_lr(void) {return _live_range;}
00036 void Print( FILE *fp=stderr)
00037 {
00038 fprintf(fp, "st: %s ", ST_name(Get_st()));
00039 fprintf(fp, "live range:");
00040 Get_lr()->Print(fp);
00041 fprintf(fp, "\n");
00042 return;
00043 }
00044 };
00045
00046 typedef map<ST*, IDX_32> STBP_MAP;
00047 typedef vector<LCLSC_NODE*> LCLSC_NTAB;
00048
00049 class LOCAL_CLSC{
00050 private:
00051 CFG *_cfg;
00052 OPT_STAB *_opt_stab;
00053 STBP_MAP _bp_map;
00054 IDX_32 _bs_size;
00055 LCLSC_NTAB _clsc_ntab;
00056 MEM_POOL _pool;
00057 BOOL _tracing;
00058
00059 CFG* Cfg() {return _cfg;}
00060 OPT_STAB* Opt_stab() {return _opt_stab;}
00061 MEM_POOL *Pool() {return &_pool;}
00062 BOOL Tracing() {return _tracing;}
00063 IDX_32 Bs_size() {return _bs_size;}
00064
00065 IDX_32 Get_bitpos(AUX_ID aux_id)
00066 {
00067 AUX_STAB_ENTRY *sym=Opt_stab()->Aux_stab_entry(aux_id);
00068 if(sym!=NULL) {
00069 ST *st=sym->St();
00070 if(st!=NULL && ST_class(st)==CLASS_PREG) {
00071 WN *preg_home=Preg_Home(sym->St_ofst());
00072 if(preg_home!=NULL && WN_has_sym(preg_home)) {
00073 st=WN_st(preg_home);
00074 }
00075 }
00076
00077 return Get_bitpos(st);
00078 }
00079 return ILLEGAL_BP;
00080 }
00081
00082 IDX_32 Get_bitpos(ST *st)
00083 {
00084 if(st!=NULL) {
00085 if(_bp_map.count(st)) {
00086 return _bp_map[st];
00087 }
00088 }
00089 return ILLEGAL_BP;
00090 }
00091
00092 LCLSC_NODE * Add_node(ST *st, CFG *cfg)
00093 {
00094 LCLSC_NODE *node=CXX_NEW(LCLSC_NODE(st, cfg, Pool()), Pool());
00095 _clsc_ntab.push_back(node);
00096 return node;
00097 }
00098
00099 BOOL LR_overlapped(BB_NODE_SET *lr0, BB_NODE_SET *lr1, CFG *cfg);
00100 void Init_bp_map(OPT_STAB *opt_stab);
00101 BOOL Aux_id_in_bs(AUX_ID aux_id, IDX_32_SET *bs);
00102 BOOL Add_aux_id_to_bs(AUX_ID aux_id, IDX_32_SET *bs);
00103 void Get_aux_id_by_alias(AUX_ID aux_id, AUX_ID_LIST *alist);
00104 void Collect_def_by_chi_list(CHI_LIST *chi_list, IDX_32_SET *appear_set);
00105 AUX_ID_LIST *Get_use_by_mu_node(MU_NODE *mnode);
00106 void Collect_use_by_mu_node(MU_NODE *mnode, IDX_32_SET *upwd_set, IDX_32_SET *appear_set, IDX_32_SET *def_set);
00107 void Collect_use_rec(CODEREP *cr, IDX_32_SET *upwd_set, IDX_32_SET *appear_set, IDX_32_SET *def_set);
00108 void Collect_def(CODEREP *cr, IDX_32_SET *appear_set, IDX_32_SET *def_set);
00109 void Collect_local_refs(CFG *cfg);
00110 void Calculate_liveness(CFG *cfg);
00111 void Get_lr(CFG *cfg);
00112 void Update_cr_alias(POINTS_TO *pt0, POINTS_TO *pt1, CODEREP *cr, OPT_STAB *opt_stab);
00113 void Update_alias(ST *st0, ST *st1, CFG *cfg, OPT_STAB *opt_stab);
00114 void Perform_clsc(CFG *cfg);
00115
00116 public:
00117 LOCAL_CLSC(CFG *cfg, OPT_STAB *opt_stab)
00118 {
00119 _cfg=cfg;
00120 _opt_stab=opt_stab;
00121 _tracing=Get_Trace( TP_WOPT2, LCLSC_TRACE_FLAG);
00122 }
00123
00124 ~ LOCAL_CLSC() { }
00125 void Do_local_clsc();
00126 };
00127 #endif