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 #ifndef opt_sym_INCLUDED
00095 #define opt_sym_INCLUDED "opt_sym.h"
00096
00097 #include "defs.h"
00098 #include "opt_defs.h"
00099 #include "mempool.h"
00100 #include "opt_array.h"
00101 #include "mtypes.h"
00102 #include "stab.h"
00103 #include "cxx_base.h"
00104 #include "cxx_memory.h"
00105 #include "cxx_template.h"
00106 #include "optimizer.h"
00107 #include "opt_wn.h"
00108 #include "opt_points_to.h"
00109 #include "opt_alias_analysis.h"
00110 #include "region_util.h"
00111 #include "wn_map.h"
00112 #include "opt_bb.h"
00113 #include "be_symtab.h"
00114 #include "id_map.h"
00115
00116 extern "C" {
00117 #include "bitset.h"
00118 }
00119
00120 using idmap::ID_MAP;
00121
00122
00123 class COMP_UNIT;
00124 class CFG;
00125 class BB_NODE;
00126 class BB_LIST;
00127 class PHI_NODE;
00128 class CODEREP;
00129 class STMTREP;
00130 class CODEMAP;
00131 class VER_LIST;
00132 class ALIAS_RULE;
00133 class OCC_TAB_ENTRY;
00134 class MU_NODE;
00135 class MU_LIST;
00136 class MU_LIST_ITER;
00137 class CHI_NODE;
00138 class CHI_LIST;
00139 class CHI_LIST_ITER;
00140 class VER_STAB_LIST_NODE;
00141 class EXP_WORKLST;
00142 class EXP_OCCURS;
00143 class ALIAS_CLASSIFICATION;
00144 class MEMOP_ANNOT_CR_SR_MGR;
00145
00146 #define VER_STAB_ARRAY_TYPE SEGMENTED_ARRAY<VER_STAB_ENTRY,128>
00147
00148 enum INVALID_AUX_ID {
00149 ILLEGAL_AUX_ID = 0,
00150 };
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 class AUX_ID_NODE : public SLIST_NODE {
00163 DECLARE_SLIST_NODE_CLASS(AUX_ID_NODE)
00164 private:
00165 AUX_ID _aux_id;
00166 public:
00167 AUX_ID_NODE(void) {};
00168 AUX_ID_NODE(const AUX_ID_NODE&);
00169 AUX_ID_NODE& operator = (const AUX_ID_NODE&);
00170 AUX_ID Aux_id(void) const { return _aux_id; }
00171 void Set_aux_id(AUX_ID aux_id) { _aux_id = aux_id; }
00172 void Print(FILE *fp=stderr) const;
00173 };
00174
00175
00176 class AUX_ID_LIST : public SLIST {
00177 DECLARE_SLIST_CLASS (AUX_ID_LIST, AUX_ID_NODE)
00178 private:
00179 AUX_ID_LIST(const AUX_ID_LIST&);
00180 AUX_ID_LIST& operator = (const AUX_ID_LIST&);
00181 public:
00182 AUX_ID_NODE *New_aux_id_node(AUX_ID var, MEM_POOL *pool) {
00183 AUX_ID_NODE *p = (AUX_ID_NODE *) CXX_NEW (AUX_ID_NODE , pool);
00184 p->Set_aux_id(var);
00185 Append(p);
00186 return p;
00187 }
00188 void Print(FILE *fp=stderr);
00189 };
00190
00191
00192 class AUX_ID_LIST_ITER : public SLIST_ITER {
00193 private:
00194 DECLARE_SLIST_ITER_CLASS (AUX_ID_LIST_ITER, AUX_ID_NODE, AUX_ID_LIST)
00195 AUX_ID_LIST_ITER(const AUX_ID_LIST_ITER&);
00196 AUX_ID_LIST_ITER& operator = (const AUX_ID_LIST_ITER&);
00197 public:
00198 ~AUX_ID_LIST_ITER(void) {}
00199 AUX_ID_NODE *First_elem(void) { return First(); }
00200 AUX_ID_NODE *Next_elem(void) { return Next(); }
00201 };
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 enum OPT_VAR_TYPE {
00217 #ifdef __MINGW32__
00218 VT_UNKNOWN_HACK = 0,
00219 #else
00220 VT_UNKNOWN = 0,
00221 #endif
00222 VT_OTHER = 0x1,
00223 VT_NO_LDA_SCALAR = 0x2,
00224 VT_LDA_SCALAR = 0x3,
00225 VT_LDA_VSYM = 0x4,
00226 VT_UNIQUE_VSYM = 0x5,
00227 VT_SPECIAL_VSYM = 0x6,
00228 };
00229
00230
00231 enum AUXF_FLAGS {
00232 AUXF_CONST_INIT = 0x01,
00233 AUXF_LR_SHRINK_CAND = 0x02,
00234 AUXF_VOLATILE = 0x04,
00235 AUXF_LOOP_INDEX = 0x08,
00236 AUXF_DMOD = 0x10,
00237 AUXF_MP_FIRSTPRIVATE= 0x20,
00238 AUXF_MP_SHARED = 0x40,
00239 AUXF_MP_LASTLOCAL = 0x80,
00240 AUXF_NESTED_REF = 0x100,
00241 AUXF_MP_REDUCTION = 0x200,
00242 AUXF_DONT_REPLACE_IV = 0x400,
00243 AUXF_NO_SPRE = 0x800,
00244 #ifdef KEY
00245 AUXF_MP_NO_DSE = 0x800,
00246
00247 #endif
00248 AUXF_EPRE_TEMP = 0x1000,
00249 AUXF_SPRE_TEMP = 0x2000,
00250 AUXF_SIGN_EXTD = 0x4000,
00251 AUXF_DISABLE_LOCAL_RVI = 0x8000,
00252 #ifdef KEY
00253 AUXF_INDIRECT_ACCESS = 0x10000,
00254 #endif
00255 };
00256
00257
00258 enum AUXF2_FLAGS {
00259 AUXF2_HAS_STORE_IN_PU = 0x1,
00260 AUXF2_IS_SIGN_EXTD = 0x2,
00261 AUXF2_IS_ZERO_EXTD = 0x4,
00262
00263 AUXF2_IS_ADDRESS = 0x8,
00264 AUXF2_NOT_ADDRESS = 0x10,
00265 AUXF2_PROP_CHAIN_SEEN = 0x20,
00266
00267 AUXF2_NO_REG = 0x40,
00268 AUXF2_LPRE_VNFRE_TEMP = 0x80,
00269 };
00270
00271
00272
00273 enum AUXEF_FLAGS {
00274 AUXEF_SOME_VERSION_RENUMBERED = 0x01
00275
00276 };
00277
00278
00279 class AUX_STAB_ENTRY
00280 {
00281 friend class OPT_STAB;
00282 friend class SSU;
00283 friend class WOVP;
00284
00285
00286 private:
00287 mINT8 stype;
00288 UINT8 _more_flags;
00289 UINT8 _mclass;
00290 mTYPE_ID _mtype;
00291 mINT32 _flags;
00292 ST *st;
00293 mINT64 _st_ofst;
00294
00295 AUX_ID st_chain;
00296
00297
00298
00299
00300
00301
00302
00303 EXP_WORKLST *_spre_node;
00304
00305 union {
00306 VER_STAB_LIST_NODE *_nonzerophis;
00307
00308
00309 CODEREP *_cr_list;
00310
00311 } v;
00312 mUINT16 _field_id;
00313 POINTS_TO points_to;
00314
00315 AUX_ID st_group;
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 AUX_ID_LIST *_aux_id_list;
00334
00335
00336
00337
00338
00339 AUX_ID _home_symbol;
00340
00341 mUINT16 _value_size;
00342 mUINT16 _version;
00343 CODEREP *_zero_cr;
00344 #ifdef KEY
00345 WN *_wn;
00346
00347 #endif
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358 union {
00359 AUX_ID synonym;
00360 BB_LIST *def_bbs;
00361 struct {
00362 IDX_32 _itab_bitpos;
00363 } itab;
00364 struct {
00365 VER_LIST *versions;
00366 STACK<CODEREP*> *coderep;
00367 } rename_cr;
00368 struct {
00369 INT32 un_used;
00370 STACK<AUX_ID> *stack;
00371 } rename_ver;
00372 mUINT32 emitter_flags;
00373 } u;
00374
00375 AUX_STAB_ENTRY(void)
00376 { st_chain = 0;
00377 st = NULL;
00378 _mclass= 0;
00379 _mtype = MTYPE_UNKNOWN;
00380 _flags = 0;
00381 _more_flags = 0;
00382 _spre_node = NULL;
00383 _field_id = 0;
00384 v._nonzerophis = NULL;
00385 _home_symbol = ILLEGAL_AUX_ID;
00386 _value_size = 0;
00387 _zero_cr = NULL;
00388 #ifdef KEY
00389 _wn = NULL;
00390 #endif
00391 };
00392 ~AUX_STAB_ENTRY(void);
00393 AUX_STAB_ENTRY(const AUX_STAB_ENTRY&);
00394 AUX_STAB_ENTRY& operator = (const AUX_STAB_ENTRY&);
00395
00396 void Clear_coderep(void) { u.rename_cr.coderep->Clear(); }
00397 void Set_def_bbs(BB_LIST *v) { u.def_bbs = v; }
00398 void Set_itab_bitpos(IDX_32 bp) { u.itab._itab_bitpos = bp; }
00399 UINT Version(void) const { return _version; }
00400 void Set_version(UINT v) { _version = v; }
00401 STACK<VER_ID> *Stack(void) const { return u.rename_ver.stack; }
00402 VER_LIST *Versions(void) const { return u.rename_cr.versions; }
00403 STACK<CODEREP*> *Coderep(void) const{ return u.rename_cr.coderep; }
00404 void Set_coderep(STACK<CODEREP*> *cr)
00405 { u.rename_cr.coderep = cr; }
00406 AUX_ID St_chain(void) const { return st_chain; }
00407 AUX_ID St_group(void) const { return st_group; }
00408
00409 void Set_st_chain(AUX_ID i) { st_chain = i; }
00410 void Set_st_group(AUX_ID i) { st_group = i; }
00411 void Set_st(ST *s) { st = s; }
00412 void Set_st_ofst(mINT64 ofst) { _st_ofst = ofst; }
00413 void Set_stype(INT32 type) { stype = type; }
00414 void Set_mclass(INT32 mclass) { _mclass = mclass; }
00415 void Set_mtype(MTYPE mtype) { _mtype = mtype; }
00416 void Set_synonym(AUX_ID i) { u.synonym = i; }
00417 void Set_aux_id_list(AUX_ID_LIST *a)
00418 { _aux_id_list = a; }
00419
00420
00421 void Clear_flags(void) { _flags = 0; _more_flags = 0; }
00422 void Set_const_init(void) { _flags |= AUXF_CONST_INIT; }
00423
00424 public:
00425 OPT_VAR_TYPE Stype(void) const { return (OPT_VAR_TYPE) stype; }
00426 INT32 Mclass(void) const { return _mclass; }
00427 MTYPE Mtype(void) const { return _mtype; }
00428 ST *St(void) const { return st; }
00429 const char *St_name(void);
00430 mINT64 St_ofst(void) const { return _st_ofst; }
00431 const char *Base_name(void) const { return (Base() && ST_class(Base()) == CLASS_VAR)
00432 ? ST_name(Base()) : "null"; }
00433 AUX_ID Home_sym(void) const { return _home_symbol; }
00434 void Set_home_sym(AUX_ID i) { _home_symbol = i; }
00435 UINT Value_size(void) const { return _value_size; }
00436 void Set_value_size(UINT vsize) { _value_size = vsize; }
00437 CODEREP *Zero_cr(void) const { return _zero_cr; }
00438 void Set_zero_cr(CODEREP *p) { _zero_cr = p; }
00439 #ifdef KEY
00440 WN *Wn(void) const { return _wn; }
00441 void Set_wn(WN *w) { _wn = w; }
00442 #endif
00443 BOOL Equivalent(AUX_STAB_ENTRY *);
00444 void Prepend_def_bbs(BB_NODE *bb, MEM_POOL *p)
00445 { if ( u.def_bbs == NULL ||
00446 u.def_bbs->Node() == NULL ||
00447 u.def_bbs->Node()->Id()!=bb->Id() )
00448 u.def_bbs = u.def_bbs->Prepend(bb,p);
00449 }
00450 void Clear_version(void) { _version = 0; }
00451 void Clear_stack(void) { u.rename_ver.stack->Clear(); }
00452 BB_LIST *Def_bbs(void) const { return u.def_bbs; }
00453 void Set_stack(STACK<VER_ID> *s){ u.rename_ver.stack = s; }
00454 IDX_32 Itab_bitpos(void) const { return u.itab._itab_bitpos; }
00455 AUX_ID_LIST *Aux_id_list(void)
00456 { Is_True(Is_virtual(), ("only virtual var has aux_id list."));
00457 return _aux_id_list; }
00458 BOOL Lr_shrink_cand(void) { return _flags & AUXF_LR_SHRINK_CAND; }
00459 void Set_lr_shrink_cand(void) { _flags |= AUXF_LR_SHRINK_CAND; }
00460 BOOL Is_volatile(void) const { return _flags & AUXF_VOLATILE; }
00461 void Set_volatile(void) { _flags |= AUXF_VOLATILE; }
00462 BOOL Mp_firstprivate(void) { return _flags & AUXF_MP_FIRSTPRIVATE; }
00463 void Set_mp_firstprivate(void) { _flags |= AUXF_MP_FIRSTPRIVATE; }
00464 void Reset_mp_firstprivate(void){ _flags &= ~AUXF_MP_FIRSTPRIVATE; }
00465 BOOL Mp_shared(void) { return _flags & AUXF_MP_SHARED; }
00466 void Set_mp_shared(void) { _flags |= AUXF_MP_SHARED; }
00467 void Reset_mp_shared(void) { _flags &= ~AUXF_MP_SHARED; }
00468 BOOL Mp_lastlocal(void) { return _flags & AUXF_MP_LASTLOCAL; }
00469 void Set_mp_lastlocal(void) { _flags |= AUXF_MP_LASTLOCAL; }
00470 void Reset_mp_lastlocal(void) { _flags &= ~AUXF_MP_LASTLOCAL; }
00471 BOOL Mp_reduction(void) { return _flags & AUXF_MP_REDUCTION; }
00472 void Set_mp_reduction(void) { _flags |= AUXF_MP_REDUCTION; }
00473 void Reset_mp_reduction(void) { _flags &= ~AUXF_MP_REDUCTION; }
00474 BOOL Has_nested_ref(void) const { return _flags & AUXF_NESTED_REF; }
00475 void Set_has_nested_ref(void) { _flags |= AUXF_NESTED_REF; }
00476 void Reset_has_nested_ref(void) { _flags &= ~AUXF_NESTED_REF; }
00477 BOOL Loop_index(void) { return _flags & AUXF_LOOP_INDEX; }
00478 void Set_loop_index(void) { _flags |= AUXF_LOOP_INDEX; }
00479 BOOL Is_flag_const_init(void) { return (_flags & AUXF_CONST_INIT); }
00480 BOOL Dmod(void) { return (_flags & AUXF_DMOD); }
00481 void Set_dmod(void) { _flags |= AUXF_DMOD; }
00482 BOOL Dont_replace_iv(void) const { return _flags & AUXF_DONT_REPLACE_IV; }
00483 void Set_dont_replace_iv(void) { _flags |= AUXF_DONT_REPLACE_IV; }
00484 BOOL No_spre(void) const { return _flags & AUXF_NO_SPRE; }
00485 void Set_no_spre(void) { _flags |= AUXF_NO_SPRE; }
00486 #ifdef KEY
00487 BOOL Mp_no_dse(void) const { return _flags & AUXF_MP_NO_DSE; }
00488 void Set_mp_no_dse(void) { _flags |= AUXF_MP_NO_DSE; }
00489 #endif
00490 BOOL EPRE_temp(void) const { return _flags & AUXF_EPRE_TEMP; }
00491 void Set_EPRE_temp(void) { _flags |= AUXF_EPRE_TEMP; }
00492 BOOL SPRE_temp(void) const { return _flags & AUXF_SPRE_TEMP; }
00493 void Set_SPRE_temp(void) { _flags |= AUXF_SPRE_TEMP; }
00494 BOOL LPRE_sign_extd(void) const { return _flags & AUXF_SIGN_EXTD; }
00495 void Set_LPRE_sign_extd(void) { _flags |= AUXF_SIGN_EXTD; }
00496 BOOL Disable_local_rvi(void) const{ return _flags & AUXF_DISABLE_LOCAL_RVI;}
00497 void Set_disable_local_rvi(void) { _flags |= AUXF_DISABLE_LOCAL_RVI; }
00498 #ifdef KEY
00499 BOOL Indirect_access(void) const{ return _flags & AUXF_INDIRECT_ACCESS;}
00500 void Set_indirect_access(void) { _flags |= AUXF_INDIRECT_ACCESS; }
00501 #endif
00502 BOOL Has_store_in_PU(void) const{ return _more_flags & AUXF2_HAS_STORE_IN_PU; }
00503 void Set_has_store_in_PU(void) { _more_flags |= AUXF2_HAS_STORE_IN_PU; }
00504 BOOL Is_sign_extd(void) const { return _more_flags & AUXF2_IS_SIGN_EXTD; }
00505 void Set_sign_extd(void) { _more_flags |= AUXF2_IS_SIGN_EXTD; }
00506 BOOL Is_zero_extd(void) const { return _more_flags & AUXF2_IS_ZERO_EXTD; }
00507 void Set_zero_extd(void) { _more_flags |= AUXF2_IS_ZERO_EXTD; }
00508 BOOL Is_address(void) const { return _more_flags & AUXF2_IS_ADDRESS; }
00509 void Set_is_address(void) { _more_flags |= AUXF2_IS_ADDRESS; }
00510 BOOL Not_address(void) const { return _more_flags & AUXF2_NOT_ADDRESS; }
00511 void Set_not_address(void) { _more_flags |= AUXF2_NOT_ADDRESS; }
00512 BOOL Prop_chain_seen(void) const{ return _more_flags & AUXF2_PROP_CHAIN_SEEN; }
00513 void Set_prop_chain_seen(void) { _more_flags |= AUXF2_PROP_CHAIN_SEEN; }
00514 BOOL No_register(void) const { return _more_flags & AUXF2_NO_REG; }
00515 void Set_no_register(void) { _more_flags |= AUXF2_NO_REG; }
00516 BOOL LPRE_VNFRE_temp(void) const { return _more_flags & AUXF2_LPRE_VNFRE_TEMP; }
00517 void Set_LPRE_VNFRE_temp(void) { _more_flags |= AUXF2_LPRE_VNFRE_TEMP; }
00518
00519 void Reset_emitter_flags(void) { u.emitter_flags = 0; }
00520 BOOL Some_version_renumbered(void) const
00521 { return u.emitter_flags & AUXEF_SOME_VERSION_RENUMBERED; }
00522 void Set_some_version_renumbered(void)
00523 { u.emitter_flags |= AUXEF_SOME_VERSION_RENUMBERED; }
00524
00525 BOOL Has_multiple_signs(void) const;
00526 BOOL Unique_vsym(void) { return stype == VT_UNIQUE_VSYM; }
00527 BOOL Special_vsym(void) { return stype == VT_SPECIAL_VSYM; }
00528 BOOL Lda_vsym(void) { return stype == VT_LDA_VSYM; }
00529 BOOL Is_virtual(void) const { return stype >= VT_LDA_SCALAR; }
00530 BOOL Is_real_var(void) const { return stype == VT_NO_LDA_SCALAR || stype == VT_LDA_SCALAR; }
00531 AUX_ID Synonym(void) const { return u.synonym; }
00532
00533 BOOL Has_def_by_const(void);
00534
00535
00536 BOOL Is_local_rvi_candidate(BOOL varargs_func) const
00537 { return (Is_real_var() &&
00538 !No_register() &&
00539 !Has_nested_ref() &&
00540 !Disable_local_rvi() &&
00541 ST_class(st) != CLASS_PREG &&
00542 ST_sclass(st) != SCLASS_FORMAL_REF &&
00543 ST_sclass(st) != SCLASS_PSTATIC &&
00544 (! (varargs_func && ST_sclass(st) == SCLASS_FORMAL) ) &&
00545 ! Is_volatile() &&
00546 Cr_list() &&
00547 points_to.Local() &&
00548 points_to.No_alias() &&
00549 ! points_to.F_param() &&
00550 ! Has_multiple_signs() );
00551 }
00552
00553
00554 BOOL Is_preg(void) const
00555 {
00556 return (stype == VT_NO_LDA_SCALAR &&
00557 ST_sclass(st) == SCLASS_REG);
00558 }
00559
00560
00561 BOOL Is_non_dedicated_preg(void) const
00562 {
00563 return (Is_preg() &&
00564 _st_ofst > Last_Dedicated_Preg_Offset);
00565 }
00566
00567
00568 BOOL Is_dedicated_preg(void) const
00569 {
00570 return (Is_preg() &&
00571 _st_ofst <= Last_Dedicated_Preg_Offset);
00572 }
00573
00574 void Change_to_new_preg(OPT_STAB *opt_stab, CODEMAP *htable);
00575
00576 VER_STAB_LIST_NODE *Nonzerophis(void) const { return v._nonzerophis; }
00577 void Set_nonzerophis(VER_STAB_LIST_NODE *nz) { v._nonzerophis = nz; }
00578 CODEREP *Cr_list(void) const { return v._cr_list; }
00579 void Set_cr_list(CODEREP *c) { v._cr_list = c; }
00580 void Set_spre_node(EXP_WORKLST *w) { _spre_node = w; }
00581 EXP_WORKLST *Spre_node(void) const { return _spre_node; }
00582 UINT Field_id(void) const { return _field_id; }
00583 void Set_field_id(UINT i) { _field_id = i; }
00584
00585
00586
00587 POINTS_TO *Points_to(void) { return &points_to; }
00588 EXPR_KIND Expr_kind(void) const { return points_to.Expr_kind(); }
00589 BASE_KIND Base_kind(void) const { return points_to.Base_kind(); }
00590 OFST_KIND Ofst_kind(void) const { return points_to.Ofst_kind(); }
00591 ST *Base(void) const { return points_to.Base(); }
00592 mINT64 Base_byte_ofst(void) const { return points_to.Byte_Ofst(); }
00593 mINT64 Byte_size(void) const { return points_to.Byte_Size(); }
00594 UINT8 Bit_size(void) const { return points_to.Bit_Size(); }
00595 UINT8 Bit_ofst(void) const { return points_to.Bit_Ofst(); }
00596 TY_IDX Ty(void) const { return points_to.Ty(); }
00597 BOOL Base_is_fixed(void) const { return points_to.Base_is_fixed(); }
00598
00599
00600
00601 void Set_expr_kind(EXPR_KIND expr_kind) { points_to.Set_expr_kind(expr_kind); }
00602 void Set_base_kind(BASE_KIND base_kind) { points_to.Set_base_kind(base_kind); }
00603 void Set_ofst_kind(OFST_KIND ofst_kind) { points_to.Set_ofst_kind(ofst_kind); }
00604 void Set_base(ST *base) { points_to.Set_base(base); }
00605 void Set_base_byte_ofst(mINT64 ofst) { points_to.Set_byte_ofst(ofst); }
00606 void Set_byte_size(mINT64 size) { points_to.Set_byte_size(size);}
00607 void Set_bit_ofst_size(UINT8 ofst, UINT8 size) {
00608 points_to.Set_bit_ofst_size (ofst, size);
00609 }
00610 void Set_ty(TY_IDX ty) { points_to.Set_ty(ty); }
00611
00612 };
00613
00614
00615 extern BOOL Completely_replaced(AUX_STAB_ENTRY *);
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628 enum STMT_TYPE {
00629 NO_STMT,
00630 WHIRL_STMT,
00631 PHI_STMT,
00632 CHI_STMT,
00633 MU_STMT,
00634 ENTRY_STMT,
00635 };
00636
00637
00638
00639 enum VER_STAB_FLAG {
00640 VS_ANY_USE = 0x01,
00641 VS_REAL_USE = 0x02,
00642 VS_ZERO_VERS = 0x04,
00643
00644
00645
00646 };
00647
00648
00649 class VER_STAB_ENTRY {
00650 AUX_ID aux_id;
00651 INT32 version;
00652 union {
00653 WN *wn;
00654 PHI_NODE *phi;
00655 CHI_NODE *chi;
00656
00657 };
00658 BB_NODE *bb;
00659 union {
00660 WN *_ref_wn;
00661
00662 WN *_chi_wn;
00663 };
00664 CODEREP *coderep;
00665 POINTS_TO *points_to;
00666 VER_ID _synonym;
00667 mINT8 type;
00668 mUINT8 flags;
00669
00670
00671 public:
00672 VER_STAB_ENTRY(void) { Init(); }
00673 ~VER_STAB_ENTRY(void) {}
00674
00675 void Init(void)
00676 { aux_id = ILLEGAL_AUX_ID; version = 0; type = NO_STMT; _ref_wn = NULL;
00677 bb = NULL; coderep = NULL; points_to = NULL; flags = 0; _synonym = 0;
00678 }
00679 void Init(AUX_ID vr, INT32 ver,
00680 BB_NODE *b,
00681 CODEREP *cr, STMT_TYPE t)
00682 { aux_id = vr; version = ver; type = t; bb = b; coderep = cr;
00683 points_to = NULL; _ref_wn = NULL; flags = 0; _synonym = 0;
00684 }
00685 INT32 Version(void) const { return version; }
00686 AUX_ID Aux_id(void) const { return aux_id; }
00687 BB_NODE *Bb(void) const { return bb; }
00688 CODEREP *Coderep(void) const { return coderep; }
00689 WN *Wn(void) const { return wn; }
00690 WN *Ref_wn(void) const { return _ref_wn; }
00691 WN *Chi_wn(void) const { return _chi_wn; }
00692 PHI_NODE *Phi(void) const { return phi; }
00693 CHI_NODE *Chi(void) const { return chi; }
00694
00695 STMT_TYPE Type(void) const { return (STMT_TYPE) type; }
00696 VER_ID Synonym(void) const { return _synonym; }
00697
00698 POINTS_TO *Points_to(void) const { return points_to; }
00699 void Set_points_to(POINTS_TO *pt) { points_to = pt; }
00700 void Set_version(INT32 v) { version = v; }
00701 void Set_aux_id(AUX_ID v) { aux_id = v; }
00702 void Set_stmt(WN *w, BB_NODE *b){ wn = w; type = WHIRL_STMT; bb = b;}
00703 void Set_stmt(PHI_NODE *p,
00704 BB_NODE *b) { phi = p; type = PHI_STMT; bb = b; }
00705 void Set_stmt(CHI_NODE *p,
00706 BB_NODE *b) { chi = p; type = CHI_STMT; bb = b; }
00707 void Set_ref_wn(WN *wn) { _ref_wn = wn; }
00708 void Set_chi_wn(WN *wn) { _chi_wn = wn; }
00709 void Set_type(STMT_TYPE t) { type = t; }
00710 void Set_coderep(CODEREP *cr) { coderep = cr; }
00711 void Set_synonym(VER_ID v) { _synonym = v; }
00712
00713 BOOL Any_use(void) { return flags & VS_ANY_USE; }
00714 void Set_Any_use(void) { flags |= VS_ANY_USE; }
00715 void Reset_Any_use(void) { flags &= ~VS_ANY_USE; }
00716 BOOL Real_use(void) { return flags & VS_REAL_USE; }
00717 void Set_Real_use(void) { flags |= VS_REAL_USE; }
00718 void Reset_Real_use(void) { flags &= ~VS_REAL_USE; }
00719 BOOL Zero_vers(void) { return flags & VS_ZERO_VERS; }
00720 void Set_Zero_vers(void) { flags |= VS_ZERO_VERS; }
00721
00722 void Print(FILE *fp, VER_ID ver_id) const;
00723 void Print_use(WN *wn, FILE *fp=stderr) const;
00724 void Print_use(PHI_NODE *phi, BB_NODE *bb, FILE *fp) const;
00725 };
00726
00727
00728 class VER_STAB_LIST_NODE : public SLIST_NODE {
00729 VER_STAB_ENTRY *_vers;
00730 VER_STAB_LIST_NODE(const VER_STAB_LIST_NODE&);
00731 VER_STAB_LIST_NODE& operator = (const VER_STAB_LIST_NODE&);
00732 public:
00733 VER_STAB_LIST_NODE(void) {}
00734 VER_STAB_LIST_NODE(VER_STAB_ENTRY *v) { _vers = v; }
00735 ~VER_STAB_LIST_NODE(void) {}
00736
00737 DECLARE_SLIST_NODE_CLASS( VER_STAB_LIST_NODE )
00738
00739 VER_STAB_LIST_NODE *Prepend(VER_STAB_LIST_NODE *v)
00740 { v->Set_Next(this); return v; }
00741
00742
00743 VER_STAB_ENTRY *Vers(void) const { return _vers; }
00744 };
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763 class ST_CHAIN_INFO {
00764 private:
00765 AUX_ID list_head;
00766 public:
00767 ST_CHAIN_INFO() { }
00768 ST_CHAIN_INFO(AUX_ID head) : list_head(head) { }
00769 void Set_list_head(AUX_ID head) { list_head = head; }
00770 AUX_ID List_head(void) const { return list_head; }
00771 void Print(FILE *) const { }
00772 };
00773
00774
00775 class OPT_STAB {
00776 private:
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788 DYN_ARRAY<AUX_STAB_ENTRY> aux_stab;
00789 VER_STAB_ARRAY_TYPE *_ver_stab;
00790 CFG *_cfg;
00791 CODEMAP *htable;
00792 const ALIAS_RULE *_rule;
00793 WN *pu_wn;
00794 #ifdef KEY
00795 ALIAS_MANAGER *_alias_mgr;
00796 #endif
00797 OPT_PU_POINTS_TO_SUMMARIZER _pt_sum;
00798 BOOL _rgn_trace;
00799
00800
00801
00802
00803
00804 MEM_POOL *mem_pool;
00805
00806 MEM_POOL _ver_pool;
00807 MEM_POOL _occ_pool;
00808 MEM_POOL _st_chain_pool;
00809 MEM_POOL _asm_pragma_pool;
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830 ID_MAP<ST_CHAIN_INFO *, ST_IDX> *st_chain_map;
00831 IDTYPE _orig_last_preg;
00832 IDTYPE _last_preg_num;
00833 AUX_ID _default_vsym;
00834 AUX_ID _return_vsym;
00835 OPT_PHASE _phase;
00836 BOOL _flow_free_analysis;
00837 BOOL _allow_sim_type;
00838 BOOL _has_exc_handler;
00839 POINTS_TO *_points_to_globals;
00840 BOOL _is_varargs_func;
00841 #ifdef KEY
00842 BOOL _is_prototyped_func;
00843 BOOL _has_nonlocal_goto_target;
00844 #endif
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883 BS *_addr_saved;
00884 BS *_addr_passed;
00885 BS *_addr_used_locally;
00886 BS *_external;
00887 BS *_local_static;
00888 BS *_dedicated;
00889 BS *_ref_formal;
00890 BS *_named;
00891 BS *_const;
00892 BS *_unique_pt;
00893 BS *_virtual_var;
00894 BS *_weak_var;
00895 BS *_weak_base;
00896
00897 BS *_inaccessible_to_callees;
00898
00899 BS *_indirect;
00900 BS *_call_by_value;
00901 BS *_call_by_ref;
00902 BS *_asm_alias;
00903
00904
00905
00906
00907
00908
00909
00910 WN_MAP _wn_sym_map;
00911 WN_MAP _wn_box_refs;
00912 WN_MAP _wn_box_defs;
00913
00914
00915
00916 typedef mempool_allocator< std::pair<IDTYPE, AUX_ID> > AC_VSYM_ALLOC;
00917 ID_MAP<IDTYPE, AUX_ID> _ac_2_vsym_map;
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928 REGION_LEVEL _rgn_level;
00929
00930
00931
00932
00933 ALIAS_CLASSIFICATION *_alias_classification;
00934 MEMOP_ANNOT_CR_SR_MGR * _cr_sr_annot_mgr;
00935
00936 INT32 _const_found;
00937
00938
00939
00940 OPT_STAB(void);
00941 OPT_STAB(const OPT_STAB&);
00942 OPT_STAB& operator = (const OPT_STAB&);
00943
00944 void Count_syms(WN *);
00945 void Convert_ST_to_AUX(WN *, WN *);
00946 void Convert_black_box(WN *);
00947 void Convert_IO_statement(WN *,WN *,INT);
00948 void Process_varfmt_for_cvt_io(WN * );
00949
00950 POINTS_TO_LIST *Create_barrier_defs( WN *);
00951 BOOL Not_affected_by_barrier(AUX_ID id, BB_NODE *bb);
00952 void Compute_barrier_mu_chi( OCC_TAB_ENTRY *, POINTS_TO_LIST *,
00953 BB_NODE *, BOOL, BOOL, BOOL, BOOL );
00954 void Make_st_group(void);
00955 void Update_attr_cache(AUX_ID, ST *, POINTS_TO *, BOOL *);
00956 void Collect_ST_attr(void);
00957 void Canonicalize(void);
00958 void Remap_aux_synonym(WN *);
00959 void Allocate_mu_chi_and_virtual_var(WN *, BB_NODE *);
00960 void Update_alias_set_with_virtual_var(void);
00961 void Update_aux_id_list(AUX_ID);
00962 BOOL Var_is_loop_index(AUX_ID, BB_NODE *);
00963 void Collect_f90_pointer_info(POINTS_TO *, const WN *);
00964 void Collect_nested_ref_info(void);
00965 void Generate_mu_and_chi_list(WN *, BB_NODE *);
00966 void Compute_FSA_stmt_or_expr(WN *);
00967 void Compute_FSA_dominator_order(BB_NODE *);
00968 void Compute_black_box_mu_chi(const WN *, OCC_TAB_ENTRY *);
00969 BOOL Has_read_only_parm(AUX_ID, WN *, INT32);
00970 void Generate_call_mu_chi_by_value(WN *wn, ST *, MU_LIST *mu, CHI_LIST *chi, INT32);
00971 void Generate_asm_mu_chi(WN *wn, MU_LIST *, CHI_LIST *);
00972 void Generate_call_mu_chi_by_ref(WN *wn, ST *, MU_LIST *mu, CHI_LIST *chi, INT32, BB_NODE *);
00973 void Generate_exit_mu(WN *);
00974 void Add_nested_call_mu_chi(WN *wn, ST *, MU_LIST *mu, CHI_LIST *chi);
00975
00976 void Inc_const_found(void) { _const_found++; }
00977 INT32 Const_found(void) { return _const_found; }
00978
00979
00980 void REGION_add_aux_id_points_to(POINTS_TO_SET **pset, AUX_ID aux_id);
00981 BOOL REGION_merge_aux_id_points_to(POINTS_TO_SET **pset, AUX_ID aux_id);
00982 void REGION_add_to_bound(RID *rid, AUX_ID aux_id, BOOL empty);
00983 BOOL REGION_verify_bound(RID *rid, AUX_ID aux_id);
00984
00985
00986 BOOL Its_ret_val_of_malloc (VER_ID ver);
00987 #if defined(TARG_SL)
00988 void Generate_call_mu_chi_by_intrninfo(WN *wn, MU_LIST *mu, CHI_LIST *chi);
00989 void Refine_intrn_alias_info(WN *intrn);
00990 void Refine_intrn_mu_chi_list(WN *intrn);
00991 #endif
00992
00993
00994
00995 public:
00996 OPT_STAB(MEM_POOL *);
00997 ~OPT_STAB(void);
00998 VER_STAB_ARRAY_TYPE *Ver_stab(void) { return _ver_stab; }
00999
01000 void Create(COMP_UNIT *, REGION_LEVEL);
01001 AUX_ID Create_vsym(EXPR_KIND k);
01002 AUX_ID Create_preg(MTYPE preg_ty, const char *name = NULL, WN *home_wn = NULL);
01003 AUX_ID Find_vsym_with_base(ST *);
01004 #ifdef KEY
01005 AUX_ID Find_vsym_with_st(ST *, BOOL, POINTS_TO * = NULL);
01006 #else
01007 AUX_ID Find_vsym_with_st(ST *);
01008 #endif
01009 AUX_ID Find_vsym_with_base_ofst_and_size(ST *, INT64, INT64, UINT8, UINT8);
01010 AUX_ID Find_sym_with_st_and_ofst(ST *, INT64);
01011 void Clear_coderep(void);
01012 BOOL Verify_stack(void);
01013 void New_coderep(MEM_POOL *pool);
01014 void New_stack(MEM_POOL *pool);
01015 void Check_stack(void);
01016 WN *Pu(void) const { return pu_wn; }
01017 #ifdef KEY
01018 ALIAS_MANAGER *Alias_Mgr(void) const { return _alias_mgr; }
01019 #endif
01020 OPT_PU_POINTS_TO_SUMMARIZER* Points_to_summarizer (void)
01021 { return &_pt_sum; }
01022 MEM_POOL *Occ_pool(void) { return &_occ_pool; }
01023 MEM_POOL* Ver_pool(void) { return &_ver_pool; }
01024 CFG *Cfg(void) const { return _cfg; }
01025 const ALIAS_RULE *Rule(void) const { return _rule; }
01026 BOOL Is_varargs_func(void) const { return _is_varargs_func; }
01027 #ifdef KEY
01028 BOOL Is_prototyped_func(void) const{ return _is_prototyped_func; }
01029 BOOL Has_nonlocal_goto_target(void) const { return _has_nonlocal_goto_target; }
01030 #endif
01031 BOOL Allow_sim_type(void) const { return _allow_sim_type; }
01032 BOOL Has_exc_handler(void) const { return _has_exc_handler; }
01033
01034 AUX_STAB_ENTRY *Aux_stab_entry(AUX_ID v) const
01035 { return &aux_stab[v]; }
01036
01037 VER_STAB_ENTRY *Ver_stab_entry(VER_ID v) const
01038 { return &(*_ver_stab)[v]; }
01039 INT32 Lastidx(void) const { return aux_stab.Lastidx(); }
01040 INT32 Version(AUX_ID var) const { return aux_stab[var].Version(); }
01041 BB_LIST *Def_bbs(AUX_ID var) const { return aux_stab[var].Def_bbs(); }
01042 VER_LIST *Versions(AUX_ID var) const { return aux_stab[var].Versions(); }
01043 STACK<CODEREP*> *Coderep
01044 (AUX_ID var) const { return aux_stab[var].Coderep(); }
01045 TY_IDX Ty(AUX_ID var) const { return aux_stab[var].Ty(); }
01046 MTYPE Stype(AUX_ID var) const { return aux_stab[var].Stype(); }
01047 INT64 Base_ofst(AUX_ID var) const { return aux_stab[var].Base_byte_ofst(); }
01048 UINT8 Bit_size(AUX_ID var) const { return aux_stab[var].Bit_size (); }
01049 UINT8 Bit_ofst(AUX_ID var) const { return aux_stab[var].Bit_ofst (); }
01050 INT64 St_ofst(AUX_ID var) const { return aux_stab[var].St_ofst(); }
01051 ST *Base(AUX_ID var) const { return aux_stab[var].Base(); }
01052 ST *St(AUX_ID var) const { return aux_stab[var].St(); }
01053 const char *St_name(AUX_ID var) const { return aux_stab[var].St_name(); }
01054 BOOL Unique_vsym(AUX_ID var) const { return aux_stab[var].Unique_vsym(); }
01055 void Init_mp_attribute(void);
01056 BOOL Mp_shared(AUX_ID var) const { return aux_stab[var].Mp_shared(); }
01057 void Reset_mp_shared(AUX_ID var) { aux_stab[var].Reset_mp_shared(); }
01058 BOOL Mp_lastlocal(AUX_ID var) const{ return aux_stab[var].Mp_lastlocal(); }
01059 void Set_mp_lastlocal(AUX_ID var) { aux_stab[var].Set_mp_lastlocal();}
01060 void Set_mp_firstprivate(AUX_ID var){ aux_stab[var].Set_mp_firstprivate();}
01061 BOOL Mp_reduction(AUX_ID var) const{ return aux_stab[var].Mp_reduction(); }
01062 void Set_mp_reduction(AUX_ID var) { aux_stab[var].Set_mp_reduction();}
01063 void Reset_mp_reduction(AUX_ID var){ aux_stab[var].Reset_mp_reduction(); }
01064 BOOL Lda_vsym(AUX_ID var) const { return aux_stab[var].Lda_vsym(); }
01065 BOOL Special_vsym(AUX_ID var) const{ return aux_stab[var].Special_vsym(); }
01066
01067 UINT16 Field_id(AUX_ID var) const { return aux_stab[var].Field_id(); }
01068
01069 POINTS_TO *Points_to(AUX_ID var) const { return aux_stab[var].Points_to(); }
01070 void Set_version(AUX_ID var,
01071 UINT32 version) { aux_stab[var].Set_version(version); }
01072 CODEREP *Zero_cr(AUX_ID var) const { return aux_stab[var].Zero_cr(); }
01073 void Set_zero_cr(AUX_ID var,
01074 CODEREP *p) { aux_stab[var].Set_zero_cr(p); }
01075
01076 void Push_coderep(AUX_ID var,
01077 CODEREP *cr) { Coderep(var)->Push(cr); }
01078 INT32 Stack_elements(AUX_ID var) { return Coderep(var)->Elements(); }
01079 CODEREP *Top_coderep(AUX_ID var) const { return Coderep(var)->Top(); }
01080 CODEREP *Top_nth_coderep(AUX_ID var, INT32 n) const { return Coderep(var)->Top_nth(n); }
01081 CODEREP *Pop_coderep(AUX_ID var) { return Coderep(var)->Pop(); }
01082 BOOL NULL_coderep(AUX_ID var) const{ return Coderep(var)->Is_Empty(); }
01083 INT32 Elements_coderep(AUX_ID var) const {return Coderep(var)->Elements();}
01084 STACK<VER_ID> *Stack(AUX_ID var) const { return aux_stab[var].Stack(); }
01085 AUX_ID Du_aux_id(VER_ID du) const { return Ver_stab_entry(du)->Aux_id(); }
01086 INT32 Du_version(VER_ID du) const { return Ver_stab_entry(du)->Version(); }
01087 TY_IDX Du_ty(VER_ID du) const { return Ty(Du_aux_id(du)); }
01088 OPT_VAR_TYPE Du_stype(VER_ID du) const { return (OPT_VAR_TYPE)Stype(Du_aux_id(du)); }
01089 INT64 Du_base_ofst(VER_ID du) const { return Base_ofst(Du_aux_id(du)); }
01090 UINT8 Du_bit_size(VER_ID du) const { return Bit_ofst(Du_aux_id(du)); }
01091 UINT8 Du_bit_ofst(VER_ID du) const { return Bit_size(Du_aux_id(du)); }
01092 INT64 Du_st_ofst(VER_ID du) const { return St_ofst(Du_aux_id(du)); }
01093 CODEREP *Du_coderep(VER_ID du) const { return Ver_stab_entry(du)->Coderep(); }
01094 BOOL Du_any_use(VER_ID du) const { return Ver_stab_entry(du)->Any_use(); }
01095 BOOL Du_real_use(VER_ID du) const { return Ver_stab_entry(du)->Real_use(); }
01096 BOOL Du_virtual_use(VER_ID du) const { return Du_any_use(du) && !Du_real_use(du); }
01097 BOOL Du_unique_vsym(VER_ID du)const{ return Unique_vsym(Du_aux_id(du)); }
01098 BOOL Du_zero_vers(VER_ID du) const { return Ver_stab_entry(du)->Zero_vers(); }
01099 void Du_set_coderep(VER_ID du,
01100 CODEREP *cr) { Ver_stab_entry(du)->Set_coderep(cr); }
01101 BOOL Is_virtual(AUX_ID id) const { return aux_stab[id].Is_virtual(); }
01102 BOOL Is_real_var(AUX_ID id) const { return aux_stab[id].Is_real_var(); }
01103 BOOL Du_is_virtual(VER_ID du)const { return Is_virtual(Du_aux_id(du)); }
01104
01105 BOOL Is_volatile(AUX_ID id) const { return aux_stab[id].Is_volatile(); }
01106 BOOL Du_is_volatile(VER_ID du)const { return Is_volatile(Du_aux_id(du)); }
01107
01108 AUX_ID_LIST *Aux_id_list(AUX_ID id) const
01109 { return aux_stab[id].Aux_id_list(); }
01110
01111 REGION_LEVEL Rgn_level(void) const { return _rgn_level; }
01112
01113 VER_ID Gen_name(AUX_ID);
01114 VER_ID Gen_name_phi(PHI_NODE *);
01115 VER_ID Gen_name_chi(CHI_NODE *, WN *wn);
01116 VER_ID Get_name(AUX_ID);
01117
01118
01119 AUX_ID Enter_symbol(OPERATOR opr, ST *st, INT64 ofst, TY_IDX wn_object_ty,
01120 BOOL is_volatile, WN* wn = NULL);
01121 AUX_ID Enter_ded_preg(ST *, INT64, TY_IDX, INT32);
01122 AUX_ID Identify_vsym(WN *);
01123 #ifdef KEY
01124 AUX_ID Allocate_vsym(WN *, POINTS_TO *);
01125 #endif
01126
01127
01128 void Enter_du(AUX_ID du, WN *wn, BB_NODE *bb)
01129 { Ver_stab_entry(du)->Set_stmt(wn, bb); }
01130
01131 void Enter_du(AUX_ID du, PHI_NODE *phi, BB_NODE *bb)
01132 { Ver_stab_entry(du)->Set_stmt(phi, bb); }
01133
01134 void Enter_du(AUX_ID du, CHI_NODE *chi, BB_NODE *bb)
01135 { Ver_stab_entry(du)->Set_stmt(chi, bb); }
01136
01137 void Enter_du(AUX_ID du)
01138 { Ver_stab_entry(du)->Set_type(ENTRY_STMT); }
01139
01140 void Delete_ver_pool(void)
01141 {
01142 OPT_POOL_Pop(&_ver_pool, MEM_DUMP_FLAG+8);
01143 OPT_POOL_Delete(&_ver_pool, MEM_DUMP_FLAG+8);
01144
01145 }
01146
01147
01148
01149
01150
01151 BOOL Addr_saved(AUX_ID idx) const { return BS_MemberP(_addr_saved, idx); }
01152 BOOL Addr_passed(AUX_ID idx) const { return BS_MemberP(_addr_passed, idx); }
01153 BOOL Addr_used_locally(AUX_ID idx) const { return BS_MemberP(_addr_used_locally, idx); }
01154 BOOL External(AUX_ID idx) const { return BS_MemberP(_external, idx); }
01155 BOOL Local_static(AUX_ID idx) const { return BS_MemberP(_local_static, idx); }
01156 BOOL Dedicated(AUX_ID idx) const { return BS_MemberP(_dedicated, idx); }
01157 BOOL Ref_formal(AUX_ID idx) const { return BS_MemberP(_ref_formal, idx); }
01158 BOOL Named(AUX_ID idx) const { return BS_MemberP(_named, idx); }
01159 BOOL Const(AUX_ID idx) const { return BS_MemberP(_const, idx); }
01160 BOOL Unique_pt(AUX_ID idx) const { return BS_MemberP(_unique_pt, idx); }
01161
01162 BOOL Call_by_value(AUX_ID idx) const{ return BS_MemberP(_call_by_value, idx); }
01163 BOOL Call_by_ref(AUX_ID idx) const{ return BS_MemberP(_call_by_ref, idx); }
01164 BOOL Asm_alias(AUX_ID idx) const { return BS_MemberP(_asm_alias, idx); }
01165 BOOL Weak_var(AUX_ID idx) const { return BS_MemberP(_weak_var, idx); }
01166 BOOL Weak_base(AUX_ID idx) const { return BS_MemberP(_weak_base, idx); }
01167
01168 void Set_addr_saved(AUX_ID idx) { _addr_saved = BS_Union1D(_addr_saved, idx, mem_pool); }
01169 void Set_addr_passed(AUX_ID idx) { _addr_passed = BS_Union1D(_addr_passed, idx, mem_pool); }
01170 void Set_addr_used_locally(AUX_ID idx) { _addr_used_locally = BS_Union1D(_addr_used_locally, idx, mem_pool); }
01171 void Set_external(AUX_ID idx) { _external = BS_Union1D(_external, idx, mem_pool); }
01172 void Set_local_static(AUX_ID idx) { _local_static = BS_Union1D(_local_static, idx, mem_pool); }
01173 void Set_dedicated(AUX_ID idx) { _dedicated = BS_Union1D(_dedicated, idx, mem_pool); }
01174 void Set_ref_formal(AUX_ID idx) { _ref_formal = BS_Union1D(_ref_formal, idx, mem_pool); }
01175 void Set_named(AUX_ID idx) { _named = BS_Union1D(_named, idx, mem_pool); }
01176 void Set_const(AUX_ID idx) { _const = BS_Union1D(_const, idx, mem_pool); }
01177 void Reset_const(AUX_ID idx) { _const = BS_Difference1D(_const, idx); }
01178 void Set_unique_pt(AUX_ID idx) { _unique_pt = BS_Union1D(_unique_pt, idx, mem_pool); }
01179 void Set_virtual_var(AUX_ID idx) { _virtual_var= BS_Union1D(_virtual_var, idx, mem_pool); }
01180 void Set_weak_var(AUX_ID idx) { _weak_var = BS_Union1D(_weak_var, idx, mem_pool); }
01181 void Set_weak_base(AUX_ID idx) { _weak_base = BS_Union1D(_weak_base, idx, mem_pool); }
01182
01183 BS * Addr_saved(void) const { return _addr_saved; }
01184 BS * Addr_passed(void) const { return _addr_passed; }
01185 BS * Addr_used_locally(void) const { return _addr_used_locally; }
01186 BS * External(void) const { return _external; }
01187 BS * Local_static(void) const { return _local_static; }
01188 BS * Dedicated(void) const { return _dedicated; }
01189 BS * Ref_formal(void) const { return _ref_formal; }
01190 BS * Named(void) const { return _named; }
01191 BS * Const(void) const { return _const; }
01192 BS * Unique_pt(void) const { return _unique_pt; }
01193 BS * Indirect(void) const { return _indirect; }
01194 BS * Inaccessible_to_callees(void) const { return _inaccessible_to_callees; }
01195 BS * Call_by_value(void) const { return _call_by_value; }
01196 BS * Call_by_ref(void) const { return _call_by_ref; }
01197 BS * Virtual_var(void) const { return _virtual_var; }
01198 BS * Weak_var(void) const { return _weak_var; }
01199 BS * Weak_base(void) const { return _weak_base; }
01200 BS * Asm_alias(void) const { return _asm_alias; }
01201
01202 void Set_addr_saved(BS *bs) { _addr_saved = bs; }
01203 void Set_addr_passed(BS *bs) { _addr_passed = bs; }
01204 void Set_addr_used_locally(BS *bs) { _addr_used_locally = bs; }
01205 void Set_external(BS *bs) { _external = bs; }
01206 void Set_local_static(BS *bs) { _local_static = bs; }
01207 void Set_dedicated(BS *bs) { _dedicated = bs; }
01208 void Set_ref_formal(BS *bs) { _ref_formal = bs; }
01209 void Set_named(BS *bs) { _named = bs; }
01210 void Set_const(BS *bs) { _const = bs; }
01211 void Set_unique_pt(BS *bs) { _unique_pt = bs; }
01212 void Set_indirect(BS *bs) { _indirect = bs; }
01213 void Set_inaccessible_to_callees(BS *bs) { _inaccessible_to_callees = bs; }
01214 void Set_call_by_value(BS *bs) { _call_by_value = bs; }
01215 void Set_call_by_ref(BS *bs) { _call_by_ref = bs; }
01216 void Set_virtual_var(BS *bs) { _virtual_var = bs; }
01217 void Set_weak_var(BS *bs) { _weak_var = bs; }
01218 void Set_weak_base(BS *bs) { _weak_base = bs; }
01219 void Set_asm_alias(BS *bs) { _asm_alias = bs; }
01220
01221
01222
01223 WN_MAP WN_sym_map(void) const { return _wn_sym_map; }
01224 WN_MAP WN_box_refs(void) const { return _wn_box_refs; }
01225 WN_MAP WN_box_defs(void) const { return _wn_box_defs; }
01226 void Set_WN_sym_map(WN_MAP wnm) { _wn_sym_map = wnm; }
01227 void Set_WN_box_refs(WN_MAP wnm) { _wn_box_refs = wnm; }
01228 void Set_WN_box_defs(WN_MAP wnm) { _wn_box_defs = wnm; }
01229
01230
01231
01232
01233 AUX_ID Default_vsym(void) const { return _default_vsym; }
01234 void Set_default_vsym(AUX_ID vsym){ _default_vsym = vsym; }
01235
01236 AUX_ID Return_vsym(void) const { return _return_vsym; }
01237 void Set_return_vsym(AUX_ID vsym){ _return_vsym = vsym; }
01238
01239 OPT_PHASE Phase(void) const { return _phase; }
01240
01241
01242 POINTS_TO_LIST *Black_box_refs(const WN *wn) const;
01243 POINTS_TO_LIST *Black_box_defs(const WN *wn) const;
01244 void Add_black_box_ref( WN *wn, POINTS_TO *ref ) const;
01245 void Add_black_box_def( WN *wn, POINTS_TO *def ) const;
01246
01247
01248
01249
01250
01251
01252 BOOL FFA(void) const { return _flow_free_analysis; }
01253 BOOL FSA(void) const { return !_flow_free_analysis; }
01254 void Set_FFA(void) { _flow_free_analysis = TRUE; }
01255 void Set_FSA(void) { _flow_free_analysis = FALSE; }
01256
01257
01258 BOOL Transfer_alias_class_to_occ_and_aux(RID *, WN *);
01259 void Compute_FFA(RID *);
01260 void Compute_FFA_for_copy(WN *, BB_NODE *, BOOL);
01261 void Compute_FSA(void);
01262 void Remap_ver_synonym(WN *wn);
01263
01264
01265 WN *Create_entry_chi_stmt(BB_NODE *);
01266
01267
01268 void Analyze_Range(WN *, POINTS_TO *);
01269
01270 ID_MAP<ST_CHAIN_INFO *, ST_IDX> *St_chain_map(void) const
01271 { return st_chain_map; }
01272
01273
01274
01275 POINTS_TO *Points_to_globals( void ) const
01276 { return _points_to_globals; }
01277 void Set_points_to_globals( POINTS_TO *pt )
01278 { _points_to_globals = pt; }
01279
01280
01281
01282 void Simplify_Pointer_Ver(VER_ID ver, POINTS_TO *ai);
01283 void Simplify_Pointer_Arith(WN *wn, POINTS_TO *ai);
01284 void Simplify_Pointer(WN *wn_addr, POINTS_TO *ai);
01285
01286
01287 void Lower_to_base(POINTS_TO *, WN *);
01288
01289
01290 void Analyze_Base_Flow_Free(POINTS_TO *pt, WN *wn);
01291
01292
01293 void Analyze_Base_Flow_Sensitive(POINTS_TO *, WN *);
01294 #if defined (TARG_SL)
01295 void Analyze_Base_Flow_Free_for_Intrn(POINTS_TO *pt, WN *wn);
01296 void Analyze_Base_Flow_Sensitive_for_Intrn(POINTS_TO *pt, WN *wn);
01297 #endif
01298
01299 void Update_iload_vsym(OCC_TAB_ENTRY *);
01300 void Update_istore_vsym(OCC_TAB_ENTRY *);
01301
01302
01303 void Update_return_mu(void);
01304
01305
01306 ST *Find_Based_Pointer(WN *, INT *depth);
01307
01308
01309 void Analyze_Based_Pointer(POINTS_TO *, WN *);
01310
01311
01312 AUX_ID Adjust_vsym(AUX_ID vp_idx, OCC_TAB_ENTRY *occ);
01313
01314
01315
01316
01317 void Init_last_preg(const IDTYPE preg)
01318 { _last_preg_num = _orig_last_preg = preg; }
01319
01320
01321
01322
01323 IDTYPE Alloc_preg(TYPE_ID mtype, const char *name = NULL, WN *home_wn = NULL)
01324 {
01325 IDTYPE preg = Create_Preg(mtype,name,home_wn);
01326 _last_preg_num = Get_Preg_Num(PREG_Table_Size (CURRENT_SYMTAB));
01327 return preg;
01328 }
01329
01330 IDTYPE Last_preg(void) const
01331 { return _last_preg_num; }
01332
01333 BOOL Is_up_level_var(ST *st) const
01334 { return ST_sym_class (st) == CLASS_VAR &&
01335 GLOBAL_SYMTAB != ST_level(st) &&
01336 CURRENT_SYMTAB != ST_level(st);
01337 }
01338
01339
01340
01341
01342
01343 #ifdef KEY
01344 void Print(FILE *fp=stderr, WN* entry_wn=NULL);
01345 #endif
01346 void Print_aux_entry(AUX_ID i, FILE *fp=stderr);
01347 void Print_alias_info(FILE *fp=stderr);
01348 #ifdef KEY
01349 void Print_occ_tab(FILE *fp=stderr, WN* entry_wn=NULL);
01350 #endif
01351 void Print_top_nth_coderep(AUX_ID i, INT n, FILE *fp=stderr);
01352
01353
01354
01355
01356
01357 #ifdef KEY
01358 OCC_TAB_ENTRY *Enter_occ_tab(WN *, AUX_ID, POINTS_TO * = NULL);
01359 #else
01360 OCC_TAB_ENTRY *Enter_occ_tab(WN *, AUX_ID);
01361 #endif
01362 OCC_TAB_ENTRY *Get_occ(const WN *) const;
01363 CHI_LIST *Get_mem_chi_list(const WN *) const;
01364 MU_NODE *Get_mem_mu_node(const WN *) const;
01365 CHI_LIST *Get_stmt_chi_list(const WN *) const;
01366 MU_LIST *Get_stmt_mu_list(const WN *) const;
01367 CHI_LIST *Get_generic_chi_list(const WN *) const;
01368 void Update_pf_list(WN *, STMTREP *);
01369
01370
01371
01372
01373
01374 void Clear_itab_bitpos( void );
01375 void Set_itab_bitpos( AUX_ID var, IDX_32 bitpos )
01376 { aux_stab[var].Set_itab_bitpos(bitpos); }
01377 void Rename_aux_id_list_to_bitpos( void );
01378
01379
01380
01381
01382 void Create_entry_chi(void);
01383
01384
01385 void Compute_region_mu_chi(WN *, RID *, BOOL, BB_NODE *);
01386
01387
01388 void Reset_def_bbs(void);
01389
01390
01391 void Screen_rvi_candidates(void);
01392
01393 void Set_alias_classification(ALIAS_CLASSIFICATION &ac)
01394 { _alias_classification = ∾ }
01395 ALIAS_CLASSIFICATION *Alias_classification(void) const
01396 { return _alias_classification; }
01397
01398 MEMOP_ANNOT_CR_SR_MGR* Cr_sr_annot_mgr (void) const { return _cr_sr_annot_mgr;}
01399
01400 void Incorporate_alias_class_info(void);
01401
01402
01403
01404 void Convert_EH_pragmas(WN *wn);
01405
01406 BOOL Safe_to_speculate(AUX_ID);
01407
01408 #ifdef KEY
01409 AUX_ID Part_of_reg_size_symbol(AUX_ID);
01410 #endif
01411
01412 ST *St_ptr(WN *wn) const { return aux_stab[WN_aux(wn)].St(); }
01413 void Summarize_points_to (void);
01414 };
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434 class AUX_STAB_ITER {
01435 private:
01436 AUX_ID sym_id;
01437 OPT_STAB *stab;
01438
01439 AUX_STAB_ITER(void);
01440 AUX_STAB_ITER(const AUX_STAB_ITER&);
01441 AUX_STAB_ITER& operator = (const AUX_STAB_ITER&);
01442
01443 public:
01444 AUX_STAB_ITER(OPT_STAB *symtab)
01445 : sym_id(1), stab(symtab) {}
01446 ~AUX_STAB_ITER(void) {}
01447 void Init(void) const {}
01448 AUX_ID First(void) { return (sym_id = 1); }
01449 BOOL Is_Empty(void) { return sym_id > stab->Lastidx(); }
01450 AUX_ID Next(void) { return ++sym_id; }
01451 AUX_ID Cur(void) const { return sym_id; }
01452 };
01453
01454
01455 class AUX_STAB_REVERSE_ITER {
01456 private:
01457 AUX_ID sym_id;
01458 OPT_STAB *stab;
01459
01460 AUX_STAB_REVERSE_ITER(void);
01461 AUX_STAB_REVERSE_ITER(const AUX_STAB_REVERSE_ITER&);
01462 AUX_STAB_REVERSE_ITER& operator = (const AUX_STAB_REVERSE_ITER&);
01463
01464 public:
01465 AUX_STAB_REVERSE_ITER(OPT_STAB *symtab)
01466 : sym_id(symtab->Lastidx()), stab(symtab) {}
01467 ~AUX_STAB_REVERSE_ITER(void) {}
01468 void Init(void) const {}
01469 AUX_ID First(void) { return (sym_id = stab->Lastidx()); }
01470 BOOL Is_Empty(void) { return sym_id < 1; }
01471 AUX_ID Next(void) { return --sym_id; }
01472 AUX_ID Cur(void) const { return sym_id; }
01473 };
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490 class VER_STAB_ITER {
01491 private:
01492 VER_ID ver_id;
01493 VER_STAB_ARRAY_TYPE *ver_stab;
01494
01495 VER_STAB_ITER(void);
01496 VER_STAB_ITER(const VER_STAB_ITER&);
01497 VER_STAB_ITER& operator = (const VER_STAB_ITER&);
01498
01499 public:
01500 VER_STAB_ITER(VER_STAB_ARRAY_TYPE *vertab)
01501 : ver_id(2), ver_stab(vertab) {}
01502 ~VER_STAB_ITER(void) {}
01503 void Init(void) const {}
01504 VER_ID First(void) { return (ver_id = 2); }
01505 BOOL Is_Empty(void) { return ver_id >= ver_stab->Size(); }
01506 VER_ID Next(void) { return ++ver_id; }
01507 VER_ID Cur(void) const { return ver_id; }
01508 };
01509
01510
01511
01512
01513
01514 #endif // opt_sym_INCLUDED