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 #ifndef opt_ssa_INCLUDED
00060 #define opt_ssa_INCLUDED "opt_ssa.h"
00061
00062 #include "defs.h"
00063 #include "opt_defs.h"
00064 #include "cxx_memory.h"
00065 #include "opt_sym.h"
00066
00067
00068 class CFG;
00069 class OPT_STAB;
00070 class BB_NODE;
00071 class BB_LIST;
00072 class STMTREP;
00073 class COLOR;
00074 class PHI_LIST;
00075 class COPYPROP;
00076 class EXC;
00077 class EXC_SCOPE;
00078
00079 class SSA {
00080 private:
00081 MEM_POOL *mem_pool;
00082 MEM_POOL *loc_pool;
00083 CFG *_cfg;
00084 CODEMAP *_htable;
00085 OPT_STAB *_opt_stab;
00086
00087 SSA(void);
00088 SSA(const SSA&);
00089 SSA& operator = (const SSA&);
00090
00091 OPT_STAB *Opt_stab(void) { return _opt_stab; }
00092 CFG *Cfg(void) { return _cfg; }
00093 CODEMAP *Htable(void) { return _htable; }
00094
00095 void Collect_defs_bb(MEM_POOL *);
00096 void Place_phi_node(MEM_POOL *);
00097 BB_NODE *Insert_identity_assignment_4_loopexit(BB_NODE *,AUX_ID,MEM_POOL *);
00098 void Insert_identity_assignment_4_entry(CFG *cfg, OPT_STAB *opt_stab);
00099 void Rename(CFG *cfg, OPT_STAB *opt_stab, BB_NODE *bb);
00100 void Rename_rhs(OPT_STAB *opt_stab, WN *wn);
00101 void Gen_name(OPT_STAB *opt_stab, IDTYPE var);
00102 void Value_number(CODEMAP *htable, OPT_STAB *opt_stab, BB_NODE *bb,
00103 COPYPROP *copyprop, EXC *exc);
00104 CODEREP *Du2cr( CODEMAP *htable, OPT_STAB *opt_stab, VER_ID du, STMTREP *stmt);
00105 CODEREP *Revive_phi_chi_opnd(VER_ID du);
00106 void Make_live_phi_chi_opnd(VER_ID du);
00107 #ifdef KEY
00108 void Print_ssa_ver_for_wn(WN* wn);
00109 #endif
00110 public:
00111 SSA(MEM_POOL *gpool,
00112 MEM_POOL *lpool){mem_pool=gpool; loc_pool=lpool; }
00113 ~SSA(void) {};
00114 MEM_POOL *Mem_pool(void) { return mem_pool; }
00115
00116 void Construct(CODEMAP *htable,
00117 CFG *cfg, OPT_STAB *opt_stab);
00118
00119 CODEREP *Get_zero_version_CR(AUX_ID aux_id, OPT_STAB *, VER_ID);
00120 void Pointer_Alias_Analysis(void);
00121 void Dead_store_elim(CFG *, OPT_STAB *, EXC *);
00122 void Find_zero_versions();
00123 void Create_CODEMAP(void);
00124 void Value_number_mu_list(MU_LIST *mu_list);
00125 void Value_number_mu_node(MU_NODE *mu_node);
00126 void Resurrect_phi(PHI_NODE *phi);
00127 void Resurrect_chi(CHI_NODE *chi);
00128 };
00129
00130 class CODEREP;
00131
00132
00133 class PHI_KEY {
00134 IDTYPE _bb_id;
00135 AUX_ID _aux_id;
00136 public:
00137
00138
00139 void Init(IDTYPE bb_id, AUX_ID aux_id) {
00140 _bb_id = bb_id;
00141 _aux_id = aux_id;
00142 }
00143 friend BOOL operator==(const PHI_KEY x, const PHI_KEY y)
00144 {
00145 return (x._bb_id == y._bb_id && x._aux_id == y._aux_id);
00146 }
00147 friend BOOL operator!=(const PHI_KEY x, const PHI_KEY y)
00148 {
00149 return (x._bb_id != y._bb_id || x._aux_id != y._aux_id);
00150 }
00151 };
00152
00153
00154
00155 class PHI_NODE : public SLIST_NODE {
00156 DECLARE_SLIST_NODE_CLASS(PHI_NODE)
00157 private:
00158
00159 enum PHI_NODE_FLAGS {
00160 PNF_NONE = 0x00,
00161 PNF_LIVE = 0x01,
00162 PNF_DSE_DEAD = 0x02,
00163 PNF_DCE_DEAD = 0x04,
00164 PNF_RES_IS_CR = 0x08,
00165 PNF_OPND_IV_UPDATE = 0x10,
00166 PNF_OPND_NOT_IV_UPDATE = 0x20,
00167 PNF_VISITED = 0x40,
00168 PNF_NULL_SSU_PROCESSED = 0x80,
00169
00170 PNF_FIND_DEF_PROCESSED = 0x100,
00171
00172 PNF_INCOMPLETE = 0x200,
00173
00174
00175 PNF_SIZE_VISITED = 0x400,
00176 PNF_FIND_CORR_PROCESSED = 0x800,
00177
00178 };
00179
00180 AUX_ID _aux_id;
00181 mUINT32 _flags;
00182 mINT16 size;
00183 mINT16 count;
00184 BB_NODE *_bb;
00185 union PHI_ELEM {
00186 friend class PHI_NODE;
00187 private:
00188 AUX_ID version;
00189 CODEREP *cr;
00190 };
00191
00192
00193
00194 PHI_ELEM *vec;
00195
00196 PHI_NODE(void);
00197 PHI_NODE(const PHI_NODE&);
00198 PHI_NODE& operator = (const PHI_NODE&);
00199
00200 public:
00201 PHI_NODE(mINT16 in_degree, MEM_POOL *pool, BB_NODE *bb)
00202 { vec = (PHI_ELEM*) CXX_NEW_ARRAY(PHI_ELEM, (in_degree + 1), pool);
00203 size = in_degree; count = 0; _bb = bb;
00204 _flags = PNF_NONE; }
00205 ~PHI_NODE(void) { }
00206
00207 AUX_ID Opnd(INT32 i) const { return vec[i+1].version; }
00208 AUX_ID Result(void) const { return vec[0].version; }
00209 CODEREP *OPND(INT32 i) const { return vec[i+1].cr; }
00210 CODEREP *RESULT(void) const { return vec[0].cr; }
00211 mINT16 Size(void) const { return size; }
00212 mINT16 Count(void) const { return count; }
00213 IDTYPE Aux_id(void) const { return _aux_id; }
00214 BB_NODE *Bb(void) const { return _bb; }
00215 void Set_bb(BB_NODE *bb) { _bb = bb; }
00216
00217 PHI_KEY Key(void) const { PHI_KEY key; key.Init(_bb->Id(), _aux_id); return key; }
00218
00219 mUINT8 Flags(void) const { return _flags; }
00220 void Set_flags(mUINT8 i) { _flags = i; }
00221 void Set_opnd(const INT32 i, AUX_ID cr)
00222 { vec[i+1].version = cr;}
00223 void Set_result(AUX_ID cr) { vec[0].version = cr; }
00224 void Set_opnd(const INT32 i, CODEREP *c)
00225 { vec[i+1].cr = c; }
00226 void Set_result(CODEREP *c) { vec[0].cr = c; }
00227 void Set_count(mINT16 c) { count = c; }
00228 void Set_aux_id(AUX_ID v) { _aux_id = v; }
00229 void Set_invalid(void) { vec[0].cr = NULL; }
00230 void Reset_OPND(INT32 i) { vec[i+1].cr = NULL; }
00231 PHI_ELEM *Vec() { return vec; }
00232
00233
00234 void Remove_opnd(INT32 i);
00235
00236
00237 BOOL Live(void) const { return _flags & PNF_LIVE; }
00238 void Set_live(void) { _flags |= PNF_LIVE; }
00239 void Reset_live(void) { _flags &= ~PNF_LIVE; }
00240 BOOL Dse_dead(void) const { return _flags & PNF_DSE_DEAD; }
00241 void Set_dse_dead(void) { _flags |= PNF_DSE_DEAD; }
00242 void Reset_dse_dead(void) { _flags &= ~PNF_DSE_DEAD; }
00243 BOOL Dce_dead(void) const { return _flags & PNF_DCE_DEAD; }
00244 void Reset_dce_dead(void) { _flags &= ~PNF_DCE_DEAD; }
00245 void Set_dce_dead(void) { _flags |= PNF_DCE_DEAD; }
00246 BOOL Res_is_cr(void) const { return _flags & PNF_RES_IS_CR; }
00247 void Set_res_is_cr(void) { _flags |= PNF_RES_IS_CR; }
00248
00249 BOOL Opnd_iv_update(void) const { return _flags & PNF_OPND_IV_UPDATE; }
00250 void Set_opnd_iv_update(void) { _flags |= PNF_OPND_IV_UPDATE; }
00251
00252 BOOL Opnd_not_iv_update(void) const{ return _flags & PNF_OPND_NOT_IV_UPDATE; }
00253 void Set_opnd_not_iv_update(void) { _flags |= PNF_OPND_NOT_IV_UPDATE; }
00254 BOOL Visited(void) const { return _flags & PNF_VISITED; }
00255 void Set_visited(void) { _flags |= PNF_VISITED; }
00256 void Reset_visited(void) { _flags &= ~PNF_VISITED; }
00257 BOOL Null_ssu_processed(void) const { return _flags & PNF_NULL_SSU_PROCESSED; }
00258 void Set_null_ssu_processed(void) { _flags |= PNF_NULL_SSU_PROCESSED; }
00259 BOOL Find_def_processed(void) const { return _flags & PNF_FIND_DEF_PROCESSED; }
00260 void Set_find_def_processed(void) { _flags |= PNF_FIND_DEF_PROCESSED; }
00261 void Reset_find_def_processed(void) { _flags &= ~PNF_FIND_DEF_PROCESSED; }
00262 BOOL Find_corr_processed(void) const { return _flags & PNF_FIND_CORR_PROCESSED; }
00263 void Set_find_corr_processed(void) { _flags |= PNF_FIND_CORR_PROCESSED; }
00264 BOOL Incomplete(void) const { return _flags & PNF_INCOMPLETE; }
00265 void Set_incomplete(void) { _flags |= PNF_INCOMPLETE; }
00266 void Reset_incomplete(void) { _flags &= ~PNF_INCOMPLETE; }
00267
00268 BOOL Is_size_visited(void) const { return _flags & PNF_SIZE_VISITED; }
00269 void Set_size_visited(void) { _flags |= PNF_SIZE_VISITED; }
00270 void Reset_size_visited(void) { _flags &= ~PNF_SIZE_VISITED; }
00271
00272
00273 void Print(INT32 in_degree,
00274 FILE *fp=stderr) const;
00275 void PRINT(INT32 in_degree,
00276 FILE *fp=stderr) const;
00277 void Print(FILE *fp=stderr) const;
00278 };
00279
00280
00281 class PHI_LIST : public SLIST {
00282 DECLARE_SLIST_CLASS (PHI_LIST, PHI_NODE)
00283
00284 private:
00285 INT32 in_degree;
00286
00287 PHI_LIST(const PHI_LIST&);
00288 PHI_LIST& operator = (const PHI_LIST&);
00289
00290 public:
00291 PHI_LIST(BB_NODE *bb);
00292 ~PHI_LIST(void) {}
00293
00294 PHI_NODE *New_phi_node(IDTYPE var, MEM_POOL *pool, BB_NODE *bb)
00295 { PHI_NODE *p = (PHI_NODE *) CXX_NEW (PHI_NODE(in_degree, pool, bb), pool);
00296 for (INT32 i = 0; i < in_degree; i++)
00297 p->Set_opnd(i, (AUX_ID)0);
00298 p->Set_result((AUX_ID)0);
00299 p->Set_aux_id(var);
00300 Append(p);
00301 return p;
00302 }
00303
00304 PHI_LIST *Dup_phi_node(MEM_POOL *pool, BB_NODE *bb, INT pos);
00305 PHI_LIST *Dup_phi_node(MEM_POOL *pool, BB_NODE *bb);
00306
00307 void Remove_opnd(INT32 i);
00308
00309 INT32 In_degree(void) const { return in_degree; }
00310 void Set_in_degree( INT32 n ) { in_degree = n; }
00311
00312 void Print(FILE *fp=stderr);
00313 void PRINT(FILE *fp=stderr);
00314 };
00315
00316
00317 class PHI_LIST_ITER : public SLIST_ITER {
00318 private:
00319 DECLARE_SLIST_ITER_CLASS (PHI_LIST_ITER, PHI_NODE, PHI_LIST)
00320
00321 PHI_LIST_ITER(const PHI_LIST_ITER&);
00322 PHI_LIST_ITER& operator = (const PHI_LIST_ITER&);
00323
00324 public:
00325 ~PHI_LIST_ITER(void) {}
00326
00327 PHI_NODE *First_elem(void) { return First(); }
00328 PHI_NODE *Next_elem(void) { return Next(); }
00329 };
00330
00331 class PHI_OPND_ITER {
00332 private:
00333 PHI_NODE *_phi;
00334 INT _curidx;
00335
00336 PHI_OPND_ITER(void);
00337 PHI_OPND_ITER(const PHI_OPND_ITER&);
00338 PHI_OPND_ITER& operator = (const PHI_OPND_ITER&);
00339
00340 public:
00341 PHI_OPND_ITER(PHI_NODE *phi) { _phi = phi; }
00342 ~PHI_OPND_ITER(void) {}
00343 void Init(PHI_NODE *phi) { _phi = phi; }
00344 void Init(void) {}
00345 CODEREP *First_elem(void) { _curidx = 0; return _phi->OPND(_curidx); }
00346 CODEREP *Next_elem(void) { _curidx++;
00347 return (Is_Empty())? NULL:_phi->OPND(_curidx); }
00348 BOOL Is_Empty(void) const { return _curidx >= _phi->Size(); }
00349 INT Curidx(void) const { return _curidx; }
00350 };
00351
00352 #endif // opt_ssa_INCLUDED