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 #ifndef opt_ssu_INCLUDED
00071 #define opt_ssu_INCLUDED "opt_ssu.h"
00072
00073 #include "defs.h"
00074 #ifndef errors_INCLUDE
00075 #include "errors.h"
00076 #endif
00077 #include "opt_defs.h"
00078 #include "cxx_memory.h"
00079 #include "opt_sym.h"
00080
00081
00082 class CFG;
00083 class OPT_STAB;
00084 class BB_NODE;
00085 class BB_LIST;
00086 class STMTREP;
00087 class IPHI_LIST;
00088 class COPYPROP;
00089 class EXP_OCCURS;
00090 class ETABLE;
00091
00092 class SSU {
00093 private:
00094 MEM_POOL *_mem_pool;
00095 MEM_POOL *_loc_pool;
00096 CFG *_cfg;
00097 CODEMAP *_htable;
00098 OPT_STAB *_opt_stab;
00099 ETABLE *_etable;
00100 BOOL _tracing;
00101 IDX_32_SET *_e_num_set;
00102 IDX_32_SET **_make_diff_ssu_version_called_in_bb;
00103
00104
00105
00106 SSU(const SSU&);
00107 SSU& operator = (const SSU&);
00108
00109 OPT_STAB *Opt_stab(void) const { return _opt_stab; }
00110 CFG *Cfg(void) const { return _cfg; }
00111 CODEMAP *Htable(void) const { return _htable; }
00112 ETABLE *Etable(void) const { return _etable; }
00113 BOOL Tracing(void) const { return _tracing; }
00114
00115 EXP_WORKLST *SPRE_candidate(CODEREP *cr);
00116 void Insert_iphis_recursive(EXP_WORKLST *, BB_NODE *);
00117 void Make_non_postdominated_iphi_opnd_null(BB_NODE *iphibb,
00118 EXP_PHI *iphi);
00119 BOOL Find_intervening_iphi(EXP_WORKLST *wk, CODEREP *v, BB_NODE *usebb);
00120 void Make_diff_ssu_version_at_phi(EXP_WORKLST *wk,
00121 BB_NODE *defbb,
00122 PHI_NODE *phi);
00123 void Check_iphi_presence(EXP_WORKLST *wk,
00124 BB_NODE *iphibb);
00125 void Make_null_ssu_version_in_iphi_for_e_num_set(
00126 BB_NODE *iphibb,
00127 BB_NODE *usebb);
00128 void Make_diff_ssu_version(EXP_WORKLST *wk,
00129 CODEREP *v,
00130 BB_NODE *usebb,
00131 BOOL only_itself);
00132 void Traverse_mu_read(MU_LIST *, BB_NODE *);
00133 void Traverse_cr_rw(CODEREP *, BB_NODE *, BOOL is_store);
00134 void Iphi_insertion(void);
00135 inline void Reset_tos_downsafe(void);
00136 void Propagate_occurrences(EXP_OCCURS *iphi_occ, CODEREP *cr);
00137 void Rename(BB_NODE *bb);
00138
00139 public:
00140 SSU(void);
00141 SSU(CODEMAP *htable,
00142 CFG *cfg,
00143 OPT_STAB *opt_stab,
00144 ETABLE *etable,
00145 MEM_POOL *gpool,
00146 MEM_POOL *lpool,
00147 BOOL tracing)
00148 { _htable = htable;
00149 _cfg = cfg;
00150 _opt_stab = opt_stab;
00151 _etable = etable;
00152 _mem_pool = gpool;
00153 _loc_pool = lpool;
00154 _tracing = tracing;
00155 _e_num_set = CXX_NEW(IDX_32_SET(etable->Exp_worklst()->Len(),
00156 lpool,
00157 OPTS_DONT_CARE),
00158 lpool);
00159 _make_diff_ssu_version_called_in_bb =
00160 (IDX_32_SET **) CXX_NEW_ARRAY(IDX_32_SET *,
00161 cfg->Total_bb_count(), lpool);
00162 for (INT32 i = 0; i < cfg->Total_bb_count();
00163 i++)
00164 _make_diff_ssu_version_called_in_bb[i] =
00165 CXX_NEW(IDX_32_SET(opt_stab->Lastidx(),
00166 lpool,
00167 OPTS_FALSE),
00168 lpool);
00169 }
00170 ~SSU(void) { }
00171
00172 void Construct(void);
00173 MEM_POOL *Mem_pool(void) const { return _mem_pool; }
00174 MEM_POOL *Loc_pool(void) const { return _loc_pool; }
00175 };
00176
00177 #if 0
00178 class CODEREP;
00179
00180
00181 class IPHI_NODE : public SLIST_NODE {
00182 DECLARE_SLIST_NODE_CLASS(IPHI_NODE)
00183 private:
00184
00185 enum IPHI_NODE_FLAGS {
00186 IPNF_NONE = 0x00,
00187 };
00188
00189 AUX_ID _aux_id;
00190 mUINT8 _flags;
00191 INT16 _size;
00192 INT16 _count;
00193 BB_NODE *_bb;
00194
00195 union IPHI_ELEM {
00196 friend class IPHI_NODE;
00197 private:
00198 EXP_OCCURS *_occ;
00199 };
00200
00201
00202
00203 IPHI_ELEM *_vec;
00204
00205 IPHI_NODE(void);
00206 IPHI_NODE(const IPHI_NODE&);
00207 IPHI_NODE& operator = (const IPHI_NODE&);
00208
00209 public:
00210
00211 IPHI_NODE(INT16 in_degree, MEM_POOL *pool, BB_NODE *bb)
00212 { _vec = (IPHI_ELEM*) CXX_NEW_ARRAY(IPHI_ELEM, (in_degree + 1), pool);
00213 _size = in_degree; _count = 0; _bb = bb; _flags = IPNF_NONE; }
00214 ~IPHI_NODE(void)
00215 { }
00216
00217 EXP_OCCURS *Opnd(INT32 i) const { return _vec[i+1]._occ; }
00218 EXP_OCCURS *Result(void) const { return _vec[0]._occ; }
00219 INT16 Size(void) const { return _size; }
00220 INT16 Count(void) const { return _count; }
00221 IDTYPE Aux_id(void) const { return _aux_id; }
00222 BB_NODE *Bb(void) const { return _bb; }
00223
00224 mUINT8 Flags(void) const { return _flags; }
00225 void Set_flags(mUINT8 i) { _flags = i; }
00226 void Set_aux_id(IDTYPE id) { _aux_id = id; }
00227 void Set_result(EXP_OCCURS *occ) { _vec[0]._occ = occ; }
00228 void Set_count(INT16 c) { _count = c; }
00229 void Set_opnd(const INT32 i,
00230 EXP_OCCURS *occ) { _vec[i+1]._occ = occ; }
00231
00232
00233 void Remove_opnd(INT32 i);
00234
00235
00236
00237
00238 void Print(INT32 in_degree, FILE *fp=stderr) const;
00239 void PRINT(INT32 in_degree, FILE *fp=stderr) const;
00240 };
00241
00242 class IPHI_LIST : public SLIST {
00243 DECLARE_SLIST_CLASS (IPHI_LIST, IPHI_NODE)
00244
00245 private:
00246 INT32 in_degree;
00247
00248 IPHI_LIST(const IPHI_LIST&);
00249 IPHI_LIST& operator = (const IPHI_LIST&);
00250
00251 public:
00252 IPHI_LIST(BB_NODE *bb);
00253 ~IPHI_LIST(void) {}
00254
00255 IPHI_NODE *New_iphi_node(IDTYPE var, MEM_POOL *pool, BB_NODE *bb)
00256 {
00257 IPHI_NODE *p =
00258 (IPHI_NODE *) CXX_NEW(IPHI_NODE(in_degree, pool, bb), pool);
00259 for (INT32 i = 0; i < in_degree; i++)
00260 p->Set_opnd(i, NULL);
00261 p->Set_result(NULL);
00262 p->Set_aux_id(var);
00263 Append(p);
00264 return p;
00265 }
00266
00267 IPHI_LIST *Dup_iphi_node(MEM_POOL *pool, BB_NODE *bb, INT pos);
00268
00269 void Remove_opnd(INT32 i);
00270
00271 INT32 In_degree(void) const { return in_degree; }
00272 void Set_in_degree( INT32 n ) { in_degree = n; }
00273
00274 void Print(FILE *fp=stderr);
00275 void PRINT(FILE *fp=stderr);
00276 };
00277
00278
00279 class IPHI_LIST_ITER : public SLIST_ITER {
00280 private:
00281 DECLARE_SLIST_ITER_CLASS (IPHI_LIST_ITER, IPHI_NODE, IPHI_LIST)
00282
00283 IPHI_LIST_ITER(const IPHI_LIST_ITER&);
00284 IPHI_LIST_ITER& operator = (const IPHI_LIST_ITER&);
00285
00286 public:
00287 ~IPHI_LIST_ITER(void) {}
00288
00289 IPHI_NODE *First_elem(void) { return First(); }
00290 IPHI_NODE *Next_elem(void) { return Next(); }
00291 };
00292
00293 class IPHI_OPND_ITER {
00294 private:
00295 IPHI_NODE *_iphi;
00296 INT _curidx;
00297
00298 IPHI_OPND_ITER(void);
00299 IPHI_OPND_ITER(const IPHI_OPND_ITER&);
00300 IPHI_OPND_ITER& operator = (const IPHI_OPND_ITER&);
00301
00302 public:
00303 IPHI_OPND_ITER(IPHI_NODE *iphi) { _iphi = iphi; }
00304 ~IPHI_OPND_ITER(void) {}
00305 void Init(IPHI_NODE *iphi) { _iphi = iphi; }
00306 void Init(void) {}
00307 EXP_OCCURS *First_elem(void) { _curidx = 0;
00308 return _iphi->Opnd(_curidx); }
00309 EXP_OCCURS *Next_elem(void) { _curidx++; return
00310 (Is_Empty() ? NULL :
00311 _iphi->Opnd(_curidx)); }
00312 BOOL Is_Empty(void) const { return _curidx >= _iphi->Size(); }
00313 INT Curidx(void) const { return _curidx; }
00314 };
00315
00316
00317
00318
00319
00320
00321
00322 class IPHI_HASH_ENTRY : public SLIST_NODE {
00323 DECLARE_SLIST_NODE_CLASS(IPHI_HASH_ENTRY)
00324
00325 private:
00326 const BB_NODE *_bb;
00327 IPHI_NODE *_var_iphi;
00328
00329 IPHI_HASH_ENTRY(const IPHI_HASH_ENTRY&);
00330 IPHI_HASH_ENTRY& operator = (const IPHI_HASH_ENTRY&);
00331
00332 public:
00333 IPHI_HASH_ENTRY(void) {}
00334 IPHI_HASH_ENTRY(const BB_NODE *bb, IPHI_NODE *var_iphi);
00335 ~IPHI_HASH_ENTRY();
00336
00337
00338 BOOL Is_the_same_as(const AUX_ID aux_id, const BB_NODE *bb);
00339 IPHI_NODE *Var_iphi(void) const { return _var_iphi; }
00340 };
00341
00342 class IPHI_HASH_ENTRY_CONTAINER : public SLIST {
00343 private:
00344 IPHI_HASH_ENTRY_CONTAINER(const IPHI_HASH_ENTRY_CONTAINER&);
00345 IPHI_HASH_ENTRY_CONTAINER& operator = (const IPHI_HASH_ENTRY_CONTAINER&);
00346 DECLARE_SLIST_CLASS( IPHI_HASH_ENTRY_CONTAINER, IPHI_HASH_ENTRY )
00347
00348 public:
00349 ~IPHI_HASH_ENTRY_CONTAINER(void) {};
00350
00351 IPHI_HASH_ENTRY *Find_iphi_hash_entry(const AUX_ID aux_id, const BB_NODE *bb);
00352
00353 void Append (IPHI_HASH_ENTRY *hash_entry,
00354 IDX_32 idx,
00355 CODEMAP *htable);
00356 };
00357
00358 class IPHI_HASH_ENTRY_ITER : public SLIST_ITER {
00359 DECLARE_SLIST_ITER_CLASS(IPHI_HASH_ENTRY_ITER,
00360 IPHI_HASH_ENTRY,
00361 IPHI_HASH_ENTRY_CONTAINER )
00362 public:
00363 void Init(void) {}
00364 };
00365
00366 #endif
00367 #endif // opt_ssu_INCLUDED