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_htable_INCLUDED
00060 #define opt_htable_INCLUDED "opt_htable.h"
00061
00062 #ifndef __ALLOCA_H
00063 #include <alloca.h>
00064 #endif
00065
00066 #ifndef ERRORS_INCLUDED
00067 #include "errors.h"
00068 #endif
00069 #ifndef opt_defs_INCLUDED
00070 #include "opt_defs.h"
00071 #endif
00072 #ifndef opt_array_INCLUDED
00073 #include "opt_array.h"
00074 #endif
00075 #ifndef wn_INCLUDED
00076 #include "wn.h"
00077 #endif
00078 #ifndef wn_map_INCLUDED
00079 #include "wn_map.h"
00080 #endif
00081 #ifndef opt_util_INCLUDED
00082 #include "opt_util.h"
00083 #endif
00084 #include "stab.h"
00085 #include "cxx_base.h"
00086 #include "cxx_memory.h"
00087 #include "opt_leaf_iter.h"
00088 #include "opt_wn.h"
00089 #ifndef opt_wn_INCLUDED
00090 #include "opt_wn.h"
00091 #endif
00092 #ifndef optimizer_INCLUDED
00093 #include "optimizer.h"
00094 #endif
00095 #ifndef opt_stmt_INCLUDED
00096 #include "opt_stmt.h"
00097 #endif
00098 #ifndef targ_const_INCLUDED
00099 #include "targ_const.h"
00100 #endif
00101
00102 #include "tracing.h"
00103 #include "id_map.h"
00104 #include "opt_ssa.h"
00105
00106 #include <vector>
00107 #include <map>
00108 #include "be_memop_annot.h"
00109
00110 using idmap::ID_MAP;
00111
00112
00113 class BB_NODE;
00114 class BB_LOOP;
00115 class BB_NODE_SET;
00116 class CANON_CR;
00117 class CFG;
00118 class CHI_LIST;
00119 class CHI_NODE;
00120 class CODEREP;
00121 class COLOR;
00122 class DU_MANAGER;
00123 class EMITTER;
00124 class EXC;
00125 class EXC_SCOPE;
00126 class IND_EXPR;
00127 class ITABLE;
00128 class MAIN_EMITTER;
00129 class MU_NODE;
00130 class MU_LIST;
00131 class OCC_TAB_ENTRY;
00132 class OPT_STAB;
00133 class PHI_HASH_ENTRY;
00134 class POINTS_TO;
00135 class SSA;
00136 class STMT_CONTAINER;
00137 class STMTREP;
00138 class USE_LIST;
00139 class COPYPROP;
00140
00141 struct CLOBBER_PRAGMA_INFO {
00142 ST_IDX preg_st_idx;
00143 PREG_IDX preg_number;
00144 INT32 clobber_string_idx;
00145 };
00146
00147 struct CONSTRAINT_PRAGMA_INFO {
00148 ST_IDX preg_st_idx;
00149 ST_IDX constraint_st_idx;
00150 PREG_NUM asm_neg_preg;
00151 UINT32 asm_opnd_num;
00152 };
00153
00154 struct ASM_PRAGMA_INFO {
00155 vector<CLOBBER_PRAGMA_INFO,
00156 mempool_allocator<CLOBBER_PRAGMA_INFO> > clobber_info;
00157 vector<CONSTRAINT_PRAGMA_INFO,
00158 mempool_allocator<CONSTRAINT_PRAGMA_INFO> > constraint_info;
00159
00160 ASM_PRAGMA_INFO(MEM_POOL *pool) :
00161 clobber_info(pool),
00162 constraint_info(pool)
00163 { }
00164 };
00165
00166 typedef CODEREP *CODEREP_P;
00167
00168
00169 #define NIL -1
00170
00171 enum CODEKIND {
00172 CK_LDA = 0x01,
00173 CK_CONST = 0x02,
00174 CK_RCONST = 0x04,
00175 CK_VAR = 0x08,
00176 CK_IVAR = 0x10,
00177 CK_OP = 0x20,
00178 CK_DELETED = 0x40,
00179
00180 };
00181
00182 inline BOOL inCODEKIND( CODEKIND ck, INT ck_flags )
00183 {
00184 return ( (ck & ck_flags) != 0 );
00185 }
00186
00187 enum CR_FLAG {
00188 CF_EMPTY = 0x00,
00189 CF_C_P_PROCESSED = 0x01,
00190
00191 CF_LDA_LABEL = 0x01,
00192 CF_DONT_PROP = 0x02,
00193 CF_C_P_REHASHED = 0x02,
00194
00195
00196 CF_SPRE_REMOVED = 0x04,
00197
00198 CF_DEF_BY_PHI = 0x08,
00199 CF_DEF_BY_CHI = 0x10,
00200
00201
00202 CF_OWNED_BY_TEMP = 0x20,
00203
00204 CF_INCOMPLETE_USES = 0x40,
00205
00206
00207
00208 CF_IS_ZERO_VERSION= 0x80,
00209 CF_FOLDED_LDID = 0x100,
00210 CF_MADEUP_TYPE = 0x200,
00211 #ifdef TARG_SL
00212
00213
00214 CF_INTERNAL_MEM_OFFSET = 0x400,
00215 #endif
00216
00217 };
00218
00219 enum ISOP_FLAG {
00220 ISOP_EMPTY = 0x00,
00221 ISOP_ICOPY_VISITED = 0x01,
00222 ISOP_COPY_VISITED = 0x02,
00223 ISOP_FOLD_EXPR_VISITED = 0x04,
00224 ISOP_FOLD_TREE_VISITED = 0x08,
00225 ISOP_DCE_VISITED = 0x10,
00226 ISOP_RETVSYM_VISITED = 0x20,
00227 ISOP_VER_MAP_VISITED = 0x40,
00228 ISOP_CANON_VISITED = 0x80,
00229 ISOP_CONTAIN_VISITED = 0x100,
00230 ISOP_ANTLOC_VISITED = 0x200,
00231 ISOP_INVARIANT_VISITED = 0x400,
00232 ISOP_EMIT_CONST_VISITED = 0x800,
00233
00234 ISOP_IVE_LIVE = 0x1000,
00235 ISOP_SSAPRE_OMITTED = 0x1000,
00236 ISOP_IVE_VISITED = 0x2000,
00237
00238 ISOP_XLOWER_VISITED = 0x4000,
00239 ISOP_LDAFOLD_VISITED = 0x8000,
00240
00241 ISOP_LDAFOLD2_VISITED = 0x10000,
00242
00243 #if defined(TARG_NVISA)
00244 ISOP_MTYPE_B_CR_VISITED = 0x20000,
00245 ISOP_VERIFY_EXPR_VISITED = 0x40000,
00246 ISOP_DEF_BEFORE_VISITED = 0x80000,
00247 #endif
00248 };
00249
00250 enum ISVAR_FLAG {
00251 ISVAR_SAFE_TO_RENUMBER_PREG = 0x01,
00252 ISVAR_BIT_FIELD_VALID = 0X02,
00253 #ifdef KEY
00254 ISVAR_PROMOTE_TO_REG_SIZE = 0x04,
00255
00256
00257 ISVAR_MP_SHARED = 0x08,
00258 #endif
00259 };
00260
00261 enum ISCONST_FLAG {
00262 ISCONST_RVI_CANDIDATE = 0x1,
00263 };
00264
00265
00266
00267 enum PROPAGATABILITY {
00268 NOT_PROPAGATABLE,
00269 PROP_WITH_INVERSE,
00270
00271
00272 PROPAGATABLE,
00273
00274
00275 };
00276
00277
00278
00279 enum ADDRESSABILITY {
00280 ADDRESSABILITY_UNKNOWN,
00281 ADDRESSABILITY_NOT_ADDRESS,
00282 ADDRESSABILITY_IS_ADDRESS,
00283 };
00284
00285
00286
00287 class EXP_KIDS_ITER {
00288 mUINT32 kid_count;
00289 mUINT32 cur_idx;
00290 CODEREP **kids;
00291
00292 EXP_KIDS_ITER(void);
00293 EXP_KIDS_ITER(const EXP_KIDS_ITER&);
00294 EXP_KIDS_ITER& operator = (const EXP_KIDS_ITER&);
00295 public:
00296 EXP_KIDS_ITER( mUINT32 cnt, CODEREP **kp);
00297 ~EXP_KIDS_ITER(void) {}
00298 void Init(void) {}
00299 BOOL Is_Empty(void) { return (cur_idx>=kid_count);}
00300 CODEREP *Cur_elem(void) { return (!Is_Empty())?
00301 kids[cur_idx] : NULL; }
00302 CODEREP *First_elem(void) { cur_idx = 0; return Cur_elem(); }
00303 CODEREP *Next_elem(void) { cur_idx++; return Cur_elem(); }
00304 IDX_32 First(void) { cur_idx = 0; return cur_idx; }
00305 IDX_32 Next(void) { cur_idx++; return cur_idx; }
00306 IDX_32 Cur(void) { return cur_idx; }
00307 };
00308
00309 class CODEREP : public SLIST_NODE {
00310 friend class CODEREP_CONTAINER;
00311 friend class CODEMAP;
00312 private:
00313 CODEKIND kind:7;
00314 MTYPE _dtyp:6;
00315 MTYPE dsctyp:6;
00316 #ifdef TARG_SL
00317 UINT32 usecnt:12;
00318
00319
00320 CR_FLAG flags:11;
00321 #else
00322 UINT32 usecnt:13;
00323
00324
00325 CR_FLAG flags:10;
00326 #endif
00327 UINT32 _is_sign_extd:1;
00328 UINT32 is_lcse:1;
00329 UINT32 is_saved:1;
00330 UINT32 _is_volatile:1;
00331 IDTYPE _bb_id:18;
00332 #define ILLEGAL_BB 0xfffff // initialization value for emit_bb
00333
00334 INT32 _coderep_id;
00335 union {
00336 struct {
00337 union {
00338 IDX_32 bitpos;
00339 IDTYPE e_num;
00340 UINT32 asm_operand_num;
00341
00342 IDTYPE scalar_aux_id;
00343
00344 OCC_TAB_ENTRY *scalar_ivar_occ;
00345 } _u01;
00346 union {
00347 mINT32 offset;
00348 struct {
00349 mUINT8 op_bit_offset;
00350 mUINT8 op_bit_size;
00351 } op_bit_offset_size;
00352 INTRINSIC intrinsic;
00353 #ifdef KEY
00354 ST_IDX call_op_aux_id;
00355 #endif
00356 CODEREP *index;
00357 TY_IDX ty_index;
00358 ST_IDX asm_constraint;
00359 } u11;
00360 } nonarr;
00361 INT64 elm_siz;
00362 }u1;
00363
00364 union {
00365 struct {
00366 IDTYPE aux_id;
00367 mUINT32 version;
00368 union {
00369
00370
00371 CHI_NODE *chi;
00372 PHI_NODE *phi;
00373 } def;
00374 mUINT16 _isvar_flags;
00375 mUINT16 fieldid;
00376 STMTREP *defstmt;
00377 TY_IDX ty;
00378 } isvar;
00379 struct {
00380 IDTYPE aux_id;
00381 ST *base_st;
00382 TY_IDX ty;
00383 mUINT16 afieldid;
00384 } islda;
00385 union {
00386 ST *const_id;
00387 #if defined(TARG_SL)
00388 struct {
00389 INT64 const_val;
00390 mUINT16 _isconst_flags;
00391 }isconst_val;
00392 #else
00393 INT64 const_val;
00394 #endif
00395 } isconst;
00396
00397 struct {
00398 OPERATOR _opr:8;
00399 ISOP_FLAG isop_flags:22;
00400 PROPAGATABILITY propagatability:2;
00401 mINT32 kid_count:14;
00402 MTYPE _asm_input_dtyp:6;
00403 MTYPE _asm_input_dsctyp:6;
00404 mINT32 _unused:6;
00405 mUINT8 max_depth;
00406 IDTYPE _temp_id:24;
00407 #if defined(TARG_NVISA)
00408 void * node_cache;
00409 #endif
00410 CODEREP *kids[3];
00411 } isop;
00412 struct {
00413 OPERATOR _opr:8;
00414 mINT32 _unused:8;
00415 mUINT16 ifieldid;
00416 MU_NODE *mu_node;
00417 STMTREP *defstmt;
00418 CODEREP *base[2];
00419
00420
00421
00422
00423
00424
00425 } isivar;
00426 }u2;
00427 #define IVAR_EXTRA_NODE_CNT 3
00428
00429 CODEREP& operator = (const CODEREP&);
00430
00431
00432
00433
00434
00435 BOOL Is_volatile(void) const { return _is_volatile; }
00436 void Set_is_volatile(void) { _is_volatile = 1; }
00437 void Reset_is_volatile(void) { _is_volatile = 0; }
00438 void Assign_is_volatile(BOOL b){ _is_volatile = b; }
00439
00440
00441
00442 void Init(CODEKIND ck)
00443 {
00444 Set_kind(ck);
00445 Set_usecnt(0);
00446 Set_Bitpos(ILLEGAL_BP);
00447 Reset_is_lcse();
00448 Reset_is_saved();
00449 Reset_sign_extd();
00450 Reset_is_volatile();
00451 Set_emit_bb(ILLEGAL_BB);
00452 _coderep_id = 0;
00453 Reset_flags();
00454 if (ck == CK_IVAR)
00455 Set_ivar_mu_node(NULL);
00456 }
00457
00458
00459 BOOL Match_mu_and_def(STMTREP *, INT32, OPT_STAB *) const;
00460
00461 BOOL Match_mu_and_mu(MU_NODE *, INT32, OPT_STAB *) const;
00462
00463 BOOL Antloc_rec (BB_NODE *);
00464
00465 public:
00466 CODEREP(void) {}
00467 CODEREP(const CODEREP &cr) { Copy(cr); }
00468 ~CODEREP(void) {}
00469
00470
00471 #define Alloc_stack_cr(cnt) ((CODEREP*)alloca(sizeof(CODEREP)+(cnt)*sizeof(CODEREP *)))
00472
00473 UINT32 Extra_ptrs_used(void) const
00474 {
00475 switch (Kind()) {
00476 case CK_OP:
00477 if (Kid_count() > 3) {
00478 return Kid_count() - 3;
00479 }
00480 else {
00481 return 0;
00482 }
00483 case CK_IVAR:
00484 return IVAR_EXTRA_NODE_CNT;
00485 default:
00486 return 0;
00487 }
00488 }
00489
00490 size_t Extra_space_used(void) const
00491 { return sizeof(CODEREP *) * Extra_ptrs_used(); }
00492
00493 void Init_lda(MTYPE wt, IDTYPE st, mINT32 ofst, TY_IDX tt, ST *bas,
00494 UINT16 field_id = 0)
00495 {
00496 Init(CK_LDA); Set_dtyp(wt); Set_lda_ty(tt); Set_offset(ofst);
00497 Set_lda_aux_id(st); Set_lda_base_st(bas); Set_afield_id(field_id);
00498 #ifdef KEY
00499 Set_dsctyp(MTYPE_V);
00500 #endif
00501
00502 }
00503
00504 void Init_const(MTYPE wt, INT64 v)
00505 {
00506 Init(CK_CONST);
00507 #if !defined(TARG_X8664) && !defined(TARG_NVISA)
00508 if (wt == MTYPE_U4 || wt == MTYPE_I4)
00509 Set_dtyp_const_val(wt, (v << 32) >> 32);
00510 #else
00511 if (wt == MTYPE_I4)
00512 Set_dtyp_const_val(wt, (v << 32) >> 32);
00513 else if (wt == MTYPE_U4)
00514 Set_dtyp_const_val(wt, (UINT64) ((UINT64) v << 32) >> 32);
00515 #endif
00516 else Set_dtyp_const_val(wt, v);
00517
00518 #ifdef KEY
00519 Set_dsctyp(MTYPE_V);
00520 #endif
00521
00522 }
00523
00524 void Init_rconst(MTYPE wt, ST *v)
00525 {
00526 Init(CK_RCONST); Set_dtyp(wt); Set_const_id(v);
00527 #ifdef KEY
00528 Set_dsctyp(MTYPE_V);
00529 #endif
00530
00531 }
00532
00533 void Init_op(OPCODE c, mINT16 kcnt)
00534 {
00535 Init(CK_OP); Set_opr(OPCODE_operator(c));
00536 Set_dtyp(OPCODE_rtype(c));
00537 Set_dsctyp(OPCODE_desc(c));
00538 Set_kid_count(kcnt);
00539 Set_temp_id(0);
00540 Reset_isop_flags();
00541 Set_max_depth(0);
00542 #if defined(TARG_NVISA)
00543 Set_ISOP_mtype_b_cache(NULL);
00544 #endif
00545 }
00546
00547 void Init_var(MTYPE wt, IDTYPE st, mUINT16 ver, MTYPE dt, mINT32 ofst,
00548 TY_IDX ty, UINT16 field_id)
00549 {
00550 Init(CK_VAR); Set_dtyp(wt); Set_aux_id(st); Set_version(ver);
00551 Set_dsctyp(dt); Set_offset(ofst); Set_lod_ty(ty); Set_defstmt(NULL);
00552 Reset_isvar_flags(); Set_field_id(field_id);
00553 }
00554
00555 void Init_ivar(OPCODE opc, MTYPE wt, OCC_TAB_ENTRY *occ,
00556 MTYPE dt, TY_IDX ldty, CODEREP *lbase, CODEREP *sbase,
00557 INT32 ofst, CODEREP *size, UINT16 field_id)
00558 {
00559 Init(CK_IVAR); Set_opr(OPCODE_operator(opc)); Set_dtyp(wt); Set_ivar_occ(occ);
00560 Set_dsctyp(dt); Set_ilod_ty(ldty);
00561 Set_ilod_base(lbase); Set_istr_base(sbase);
00562 Set_offset(ofst); Set_mstore_size(size); Set_ivar_defstmt(NULL);
00563 Set_i_field_id(field_id);
00564 }
00565
00566 void Init_expr(OPCODE c, CODEREP *expr)
00567 {
00568 Init_op( c, 1 );
00569 Set_opnd(0, expr);
00570 }
00571
00572 void Copy(const CODEREP &cr);
00573
00574 BOOL Match(CODEREP *cr,
00575 INT32 mu_vsym_depth = 0,
00576 OPT_STAB *opt_stab = NULL);
00577
00578 BOOL Match_constval(const CODEREP *);
00579
00580
00581
00582 BOOL Contains(const CODEREP *cr) const;
00583
00584
00585 BOOL Contains_image(const CODEREP *cr) const;
00586
00587 BOOL Satisfy_IV_cond(CODEREP*,
00588 BB_NODE_SET*,
00589 INT);
00590 BOOL Removed_by_LDX(BB_NODE *bb)const;
00591
00592 void Print(INT32 indent,
00593 FILE *fp = stderr)
00594 const;
00595
00596 void Print_node(INT32 indent,
00597 FILE *fp = stderr) const;
00598
00599 char *Print_str(BOOL) const;
00600 char *Print_kind(void) const;
00601
00602 BOOL Verify_IR(CFG *, CODEMAP *, BOOL, INT);
00603
00604 INT Count_parents(CFG *, CODEMAP *);
00605
00606
00607 WN *Gen_wn(EMITTER*);
00608 WN *Gen_wn(MAIN_EMITTER*, BB_NODE*);
00609
00610
00611 void Check_unsaved_exprs(MAIN_EMITTER*, BB_NODE*);
00612 void Canon_expr(CODEMAP *htable);
00613 BOOL Ind_expr_canon(CODEMAP *htable,
00614 CODEREP *exp,
00615 CODEREP **factor,
00616 INT64 *scale);
00617
00618
00619
00620 CODEREP *Convert_type(CODEMAP *, CODEREP *expr, BOOL icopy_phase=FALSE);
00621 CODEREP *Fixup_type(MTYPE,CODEMAP*);
00622 void IncUsecnt_rec(void);
00623 void DecUsecnt_rec(void);
00624 void DecKidsUsecnt_rec(void);
00625
00626
00627 CODEKIND Kind(void) const { return (CODEKIND)(0x7f&(INT)kind); }
00628 void Set_kind(CODEKIND k) { kind = k; }
00629 MTYPE Dtyp(void) const { return _dtyp; }
00630
00631
00632
00633
00634 void Set_dtyp(MTYPE dt) { Is_True(Kind() != CK_CONST,
00635 ("CODEREP::Set_dtyp, illegal kind"));
00636 _dtyp = dt; }
00637 #ifdef KEY
00638 MTYPE Asm_input_rtype(void) const { return u2.isop._asm_input_dtyp; }
00639 void Set_asm_input_rtype(MTYPE dt) { u2.isop._asm_input_dtyp = dt; }
00640 MTYPE Asm_input_dsctype(void) const { return u2.isop._asm_input_dsctyp; }
00641 MTYPE Set_asm_input_dsctype(MTYPE dt) { u2.isop._asm_input_dsctyp = dt; }
00642 #endif
00643 #if defined(TARG_SL) || defined(TARG_NVISA)
00644 void Set_dtyp_const_val(MTYPE dt, INT64 v) {
00645 Is_True(Kind() == CK_CONST,
00646 ("CODEREP::Set_dtyp_const_val, illegal kind"));
00647
00648 #if defined(TARG_SL)
00649 if ((dt == MTYPE_U4 || dt == MTYPE_I4) && (v == (v << 32) >> 32))
00650 _dtyp = MTYPE_I4;
00651 #else
00652 if (dt == MTYPE_U4
00653 && (v == ((UINT64) v << 32) >> 32))
00654 _dtyp = MTYPE_U4;
00655 else if (dt == MTYPE_I4
00656 && (v == ((INT64) v << 32) >> 32))
00657 _dtyp = MTYPE_I4;
00658 #endif // TARG_SL
00659 else if (dt == MTYPE_U8)
00660 _dtyp = MTYPE_U8;
00661 else
00662 _dtyp = MTYPE_I8;
00663 #if defined(TARG_SL)
00664 u2.isconst.isconst_val.const_val = v; }
00665 #else
00666 u2.isconst.const_val = v; }
00667 #endif // TARG_SL
00668 #else // TARG_X8664 || TARG_IA64
00669 #ifndef TARG_X8664
00670 void Set_dtyp_const_val(MTYPE dt, INT64 v) { Is_True(Kind() == CK_CONST,
00671 ("CODEREP::Set_dtyp_const_val, illegal kind"));
00672 if (v == (v << 32) >> 32)
00673 _dtyp = MTYPE_I4;
00674 else _dtyp = MTYPE_I8;
00675 u2.isconst.const_val = v; }
00676 #else
00677 void Set_dtyp_const_val(MTYPE dt, UINT64 v) { Is_True(Kind() == CK_CONST,
00678 ("CODEREP::Set_dtyp_const_val, illegal kind"));
00679 if (v == (v << 32) >> 32)
00680 _dtyp = MTYPE_U4;
00681 else _dtyp = MTYPE_I8;
00682 u2.isconst.const_val = v; }
00683 #endif
00684 #endif // TARG_SL || TARG_NVISA
00685 void Set_dtyp_strictly(MTYPE dt) { _dtyp = dt; }
00686 MTYPE Dsctyp(void) const { return dsctyp; }
00687 void Set_dsctyp(const MTYPE t) { dsctyp = t; }
00688 mINT16 Usecnt(void) const { return usecnt; }
00689 void IncUsecnt(void) { if (usecnt >= 1023) Warn_todo
00690 ("CODEREP::IncUsecnt overflow");
00691 usecnt++; }
00692 void DecUsecnt(void) {
00693
00694 usecnt--; }
00695 void Set_usecnt(mINT16 c) { usecnt = c;
00696 if (c < 0 && c > 1023) Warn_todo
00697 ("CODEREP::Set_usecnt range"); }
00698 BOOL Is_var_nodef(void) const { if (Is_flag_set(CF_DEF_BY_PHI))
00699 return Defphi() == NULL;
00700 else if (Is_flag_set(CF_DEF_BY_CHI))
00701 return Defchi() == NULL;
00702 else return Defstmt() == NULL; }
00703 CR_FLAG Flags(void) const { return flags; }
00704 void Reset_flags(void) { flags = CF_EMPTY; }
00705 void Reset_flag(CR_FLAG f) { flags = (CR_FLAG)(flags&~f); }
00706 void Assign_flags(CR_FLAG f) { flags = f; }
00707 void Set_flag(CR_FLAG f) { flags = (CR_FLAG)(flags | f); }
00708 BOOL Is_flag_set(CR_FLAG f)const{ return flags & f; }
00709 INT32 Coderep_id(void) const { return _coderep_id; }
00710 void Set_coderep_id(INT32 i) { _coderep_id = i; }
00711 mINT32 Offset(void) const { return u1.nonarr.u11.offset; }
00712 void Set_offset(mINT32 ofst) { Is_True(ofst == 0
00713 || Use_Load_Store_Offset
00714 || !Non_leaf()
00715 || !(OPERATOR_is_load(Opr()) ||
00716 OPERATOR_is_store(Opr()) ||
00717 OPERATOR_is_prefetch(Opr())),
00718 ("Set_offset: offset != 0"));
00719 u1.nonarr.u11.offset = ofst; }
00720 INT32 Op_bit_offset(void) const { return u1.nonarr.u11.op_bit_offset_size.op_bit_offset; }
00721 void Set_op_bit_offset(INT32 bofst) { u1.nonarr.u11.op_bit_offset_size.op_bit_offset = bofst; }
00722 INT32 Op_bit_size(void) const { return u1.nonarr.u11.op_bit_offset_size.op_bit_size; }
00723 void Set_op_bit_size(INT32 bsiz) { u1.nonarr.u11.op_bit_offset_size.op_bit_size = bsiz; }
00724 CODEREP *Index(void) const { return u1.nonarr.u11.index; }
00725 void Set_index(CODEREP *idx) { u1.nonarr.u11.index = idx; }
00726 mINT32 Num_dim(void) const { return u2.isop.kid_count >> 1; }
00727 INT64 Elm_siz(void) const { return u1.elm_siz; }
00728 void Set_elm_siz(INT64 siz) { u1.elm_siz = siz; }
00729 INTRINSIC Intrinsic(void) const { return u1.nonarr.u11.intrinsic; }
00730 void Set_intrinsic(INTRINSIC i) { u1.nonarr.u11.intrinsic = i; }
00731 #if defined(TARG_SL)
00732 BOOL Is_C3_Intrinsic() { ((u1.nonarr.u11.intrinsic >= INTRN_C3_INTRINSIC_BEGIN) &&
00733 (u1.nonarr.u11.intrinsic <= INTRN_C3_INTRINSIC_END)); };
00734 #endif
00735 #ifdef KEY
00736 ST_IDX Call_op_aux_id(void) const { return u1.nonarr.u11.call_op_aux_id; }
00737 void Set_call_op_aux_id(ST_IDX i) { u1.nonarr.u11.call_op_aux_id = i; }
00738 #endif
00739 TY_IDX Ty_index(void) const { return u1.nonarr.u11.ty_index; }
00740 void Set_ty_index(TY_IDX i) { u1.nonarr.u11.ty_index = i; }
00741 ST_IDX Asm_constraint(void) const{ return u1.nonarr.u11.asm_constraint; }
00742 void Set_asm_constraint(ST_IDX i){u1.nonarr.u11.asm_constraint = i; }
00743 UINT32 Asm_opnd_num(void) const
00744 {
00745 Is_True(Opr() == OPR_ASM_INPUT, ("Only ASM_INPUT has Asm_opnd_num()"));
00746 return u1.nonarr._u01.asm_operand_num;
00747 }
00748 void Set_asm_opnd_num(UINT32 i)
00749 {
00750 Is_True(Opr() == OPR_ASM_INPUT, ("Only ASM_INPUT has Asm_opnd_num()"));
00751 u1.nonarr._u01.asm_operand_num = i;
00752 }
00753
00754 IDTYPE Aux_id(void) const { Is_True(Kind() == CK_VAR,
00755 ("CODEREP::Var_aux_id, illegal kind"));
00756 return u2.isvar.aux_id; }
00757 void Set_aux_id(IDTYPE n) { Is_True(Kind() == CK_VAR,
00758 ("CODEREP::Set_aux_id, illegal kind"));
00759 u2.isvar.aux_id = n; }
00760 IDTYPE Version(void) const { Is_True(Kind() == CK_VAR,
00761 ("CODEREP::Version, illegal kind"));
00762 return u2.isvar.version; }
00763 void Set_version(IDTYPE v) { Is_True(Kind() == CK_VAR,
00764 ("CODEREP::Set_version, illegal kind"));
00765 u2.isvar.version = v; }
00766 STMTREP *Get_defstmt(void) const { if (Kind()==CK_VAR)
00767 return Defstmt();
00768 if (Kind()==CK_IVAR)
00769 return Ivar_defstmt();
00770 return NULL;
00771 }
00772 STMTREP *Defstmt(void) const { Is_True(Kind() == CK_VAR,
00773 ("CODEREP::Defstmt, not CK_VAR"));
00774 return u2.isvar.defstmt; }
00775 void Set_defstmt(STMTREP *s) { Is_True(Kind() == CK_VAR,
00776 ("CODEREP::Set_defstmt, illegal kind"));
00777 u2.isvar.defstmt = s; }
00778 PHI_NODE *Defphi(void) const { Is_True(Kind() == CK_VAR,
00779 ("CODEREP::Defphi, illegal kind"));
00780 return u2.isvar.def.phi; }
00781 void Set_defphi(PHI_NODE *phi) { Is_True(Kind() == CK_VAR,
00782 ("CODEREP::Set_defphi, illegal kind"));
00783 u2.isvar.def.phi = phi; }
00784 CHI_NODE *Defchi(void) const { Is_True(Kind() == CK_VAR,
00785 ("CODEREP::Defchi, illegal kind"));
00786 return u2.isvar.def.chi; }
00787 void Set_defchi(CHI_NODE *chi) { Is_True(Kind() == CK_VAR,
00788 ("CODEREP::Set_defchi, illegal kind"));
00789 u2.isvar.def.chi = chi; }
00790 BB_NODE *Defbb(void) const;
00791 BOOL Def_at_entry(void) const;
00792 TY_IDX Lod_ty(void) const { Is_True(Kind() == CK_VAR,
00793 ("CODEREP::Lod_ty, illegal kind"));
00794 return u2.isvar.ty; }
00795 void Set_lod_ty(TY_IDX t) { Is_True(Kind() == CK_VAR,
00796 ("CODEREP::Set_lod_ty, illegal kind"));
00797 u2.isvar.ty = t; }
00798 void Copy_type(CODEREP *cr) { Set_dtyp_strictly(cr->Dtyp());
00799 Set_dsctyp(cr->Dsctyp());
00800 Set_lod_ty(MTYPE_To_TY(cr->Dtyp()));
00801 Assign_sign_extd(cr->Is_sign_extd());
00802 }
00803
00804 BOOL Is_var_volatile(void) const
00805 { return Is_volatile(); }
00806 void Set_var_volatile(void)
00807 { Set_is_volatile(); }
00808 void Reset_var_volatile(void)
00809 { Reset_is_volatile(); }
00810 BOOL Is_ivar_volatile(void) const;
00811
00812 void Reset_isvar_flags(void)
00813 { u2.isvar._isvar_flags = 0; }
00814
00815 void Set_isvar_flags(UINT32 flags) { u2.isvar._isvar_flags = flags; }
00816
00817 UINT32 Isvar_flags(void) const { return u2.isvar._isvar_flags; }
00818
00819 void Set_safe_to_renumber_preg(void)
00820 { u2.isvar._isvar_flags |= ISVAR_SAFE_TO_RENUMBER_PREG; }
00821
00822 void Reset_safe_to_renumber_preg(void)
00823 { u2.isvar._isvar_flags &= ~ISVAR_SAFE_TO_RENUMBER_PREG; }
00824
00825 BOOL Safe_to_renumber_preg(void) const
00826 { return u2.isvar._isvar_flags & ISVAR_SAFE_TO_RENUMBER_PREG; }
00827
00828 void Set_bit_field_valid() {
00829 u2.isvar._isvar_flags |= ISVAR_BIT_FIELD_VALID;
00830 }
00831
00832 void Reset_bit_field_valid() {
00833 u2.isvar._isvar_flags &= ~ISVAR_BIT_FIELD_VALID;
00834 }
00835
00836 BOOL Bit_field_valid() const {
00837 return u2.isvar._isvar_flags & ISVAR_BIT_FIELD_VALID;
00838 }
00839
00840 #ifdef KEY
00841 void Set_promote_to_reg_size() {
00842 u2.isvar._isvar_flags |= ISVAR_PROMOTE_TO_REG_SIZE;
00843 }
00844
00845 void Reset_promote_to_reg_size() {
00846 u2.isvar._isvar_flags &= ~ISVAR_PROMOTE_TO_REG_SIZE;
00847 }
00848
00849 BOOL Promote_to_reg_size() const {
00850 return u2.isvar._isvar_flags & ISVAR_PROMOTE_TO_REG_SIZE;
00851 }
00852
00853 void Set_mp_shared() {
00854 u2.isvar._isvar_flags |= ISVAR_MP_SHARED;
00855 }
00856
00857 BOOL Mp_shared() const {
00858 return u2.isvar._isvar_flags & ISVAR_MP_SHARED;
00859 }
00860 #endif
00861 #if defined(TARG_SL)
00862 void Set_RVI_Candidate() {
00863 u2.isconst.isconst_val._isconst_flags |= ISCONST_RVI_CANDIDATE;
00864 }
00865 BOOL RVI_Candidate() {
00866 return u2.isconst.isconst_val._isconst_flags & ISCONST_RVI_CANDIDATE;
00867 }
00868 void Reset_RVI_Candidate() {
00869 u2.isconst.isconst_val._isconst_flags &= ~ISCONST_RVI_CANDIDATE;
00870 }
00871
00872 #endif
00873
00874 void Reset_field_id(void) { u2.isvar.fieldid = 0; }
00875
00876 void Set_field_id(UINT field_id) { u2.isvar.fieldid = field_id; }
00877
00878 UINT Field_id(void) const { return u2.isvar.fieldid; }
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895 void Set_bit_offset_size (UINT8 ofst, UINT8 size) {
00896 u2.isvar.fieldid = (ofst << 7) + size;
00897 Set_bit_field_valid ();
00898 }
00899
00900 UINT Bit_offset(void) const {
00901 Is_True(Bit_field_valid(), ("CODEREP::Bit_offset, bit field not valid"));
00902 return u2.isvar.fieldid >> 7;
00903 }
00904
00905 UINT Bit_size(void) const {
00906 Is_True(Bit_field_valid(), ("CODEREP::Bit_offset, bit field not valid"));
00907 return u2.isvar.fieldid & 0x7f;
00908 }
00909
00910 void Reset_i_field_id(void) { u2.isivar.ifieldid = 0; }
00911
00912 void Set_i_field_id(UINT field_id) { u2.isivar.ifieldid = field_id; }
00913
00914 UINT I_field_id(void) const { return u2.isivar.ifieldid; }
00915
00916 void Set_i_bit_offset_size (UINT8 ofst, UINT8 size) {
00917 u2.isivar.ifieldid = (ofst << 7) + size;
00918 }
00919
00920 UINT I_bit_offset(void) const { return u2.isivar.ifieldid >> 7; }
00921
00922 UINT I_bit_size(void) const { return u2.isivar.ifieldid & 0x7f; }
00923
00924 STMTREP *Ivar_defstmt(void) const { Is_True(Kind() == CK_IVAR,
00925 ("CODEREP::Ivar_defstmt, illegal kind"));
00926 return u2.isivar.defstmt; }
00927 void Set_ivar_defstmt(STMTREP *s) { Is_True(Kind() == CK_IVAR,
00928 ("CODEREP::Set_ivar_defstmt, illegal kind"));
00929 u2.isivar.defstmt = s; }
00930 IDTYPE Lda_aux_id(void) const { Is_True(Kind() == CK_LDA,
00931 ("CODEREP::Lda_aux_id, illegal kind"));
00932 return u2.islda.aux_id; }
00933 void Set_lda_aux_id(IDTYPE n) { Is_True(Kind() == CK_LDA,
00934 ("CODEREP::Set_lda_aux_id, illegal kind"));
00935 u2.islda.aux_id = n; }
00936 ST *Lda_base_st(void) const { Is_True(Kind() == CK_LDA,
00937 ("CODEREP::Lda_base_st, illegal kind"));
00938 return u2.islda.base_st; }
00939 void Set_lda_base_st(ST *s) { Is_True(Kind() == CK_LDA,
00940 ("CODEREP::Set_lda_base_st, illegal kind"));
00941 u2.islda.base_st = s; }
00942 TY_IDX Lda_ty(void) const { Is_True(Kind() == CK_LDA,
00943 ("CODEREP::Lda_ty, illegal kind"));
00944 return u2.islda.ty; }
00945 void Set_lda_ty(TY_IDX t) { Is_True(Kind() == CK_LDA,
00946 ("CODEREP::Set_lda_ty, illegal kind"));
00947 u2.islda.ty = t; }
00948 void Set_afield_id(UINT field_id) { Is_True(Kind() == CK_LDA,
00949 ("CODEREP::Set_afield_id, illegal kind"));
00950 u2.islda.afieldid = field_id; }
00951 UINT Afield_id(void) const { Is_True(Kind() == CK_LDA,
00952 ("CODEREP::Afield_id, illegal kind"));
00953 return u2.islda.afieldid; }
00954 void Set_const_val(INT64 v) { Is_True(Kind() == CK_CONST,
00955 ("CODEREP::Set_const_val, illegal kind"));
00956 #if defined(TARG_SL)
00957 u2.isconst.isconst_val.const_val = v; }
00958 #else
00959 u2.isconst.const_val = v; }
00960 #endif
00961 INT64 Const_val(void) const { Is_True(Kind() == CK_CONST,
00962 ("CODEREP::Const_val, illegal kind"));
00963 Is_True(!MTYPE_float(_dtyp),
00964 ("CODEREP::Const_val, illegal type"));
00965 #if defined(TARG_SL)
00966 return u2.isconst.isconst_val.const_val; }
00967 #else
00968 return u2.isconst.const_val; }
00969 #endif
00970
00971
00972
00973 double Const_fval(const CODEMAP *htable) const
00974 { return Targ_To_Host_Float(
00975 Const_ftcon2(htable)); }
00976 TCON_IDX Const_ftcon(const CODEMAP *) const
00977 { Is_True(Kind() == CK_RCONST,
00978 ("CODEREP::Const_fval, illegal kind"));
00979 Is_True(MTYPE_float(Dtyp()),
00980 ("CODEREP::Const_fval, illegal type"));
00981 return ST_tcon(Const_id()); }
00982 TCON Const_ftcon2(const CODEMAP *) const
00983 { Is_True(Kind() == CK_RCONST,
00984 ("CODEREP::Const_fval, illegal kind"));
00985 Is_True(MTYPE_float(Dtyp()),
00986 ("CODEREP::Const_fval, illegal type"));
00987 return STC_val(Const_id()); }
00988 ST *Const_id(void) const { Is_True(Kind() == CK_RCONST,
00989 ("CODEREP::Const_id, illegal kind"));
00990 return u2.isconst.const_id; }
00991 void Set_const_id(ST *v) { Is_True(Kind() == CK_RCONST,
00992 ("CODEREP::Set_const_id, illegal kind"));
00993 u2.isconst.const_id = v; }
00994 OPCODE Op(void) const { Is_True(Non_leaf(),
00995 ("CODEREP::Op, illegal kind"));
00996 return OPCODE_make_op(Opr(), Dtyp(), Dsctyp()); }
00997 OPERATOR Opr(void) const { Is_True(Non_leaf(),
00998 ("CODEREP::Opr, illegal kind"));
00999 #ifndef __GNUC__
01000 return Kind() == CK_OP ? u2.isop._opr :
01001 u2.isivar._opr; }
01002 #else
01003 Is_True(u2.isop._opr == u2.isivar._opr,
01004 ("CODEREP::Opr, GNUC bug workaround violated"));
01005 return u2.isop._opr; }
01006 #endif
01007 void Set_opr(OPERATOR c) { Is_True(Non_leaf(),
01008 ("CODEREP::Set_opr, illegal kind"));
01009 (Kind() == CK_OP) ? u2.isop._opr = c :
01010 u2.isivar._opr = c; }
01011 mINT16 Kid_count(void) const { Is_True(Kind() == CK_OP,
01012 ("CODEREP::Kid_count, illegal kind %s",
01013 Print_kind()));
01014 return u2.isop.kid_count; }
01015 void Set_kid_count(mINT16 c) { Is_True(Kind() == CK_OP,
01016 ("CODEREP::Set_kid_count, illegal kind"));
01017 u2.isop.kid_count = c; }
01018 PROPAGATABILITY Propagatability(void) const { Is_True(Kind() == CK_OP,
01019 ("CODEREP::Propagatability: illegal kind %s", Print_kind()));
01020 return u2.isop.propagatability; }
01021 void Set_propagatability(PROPAGATABILITY p) { Is_True(Kind() == CK_OP,
01022 ("CODEREP::Propagatability: illegal kind %s", Print_kind()));
01023 u2.isop.propagatability = p; }
01024 ISOP_FLAG Isop_flags(void) const { return u2.isop.isop_flags; }
01025 void Reset_isop_flags(void) { u2.isop.isop_flags = ISOP_EMPTY; }
01026 void Set_isop_flag(ISOP_FLAG f){ u2.isop.isop_flags = (ISOP_FLAG)(u2.isop.isop_flags | f);}
01027 void Reset_isop_flag(ISOP_FLAG f) { u2.isop.isop_flags = (ISOP_FLAG)(u2.isop.isop_flags&~f); }
01028 BOOL Is_isop_flag_set(ISOP_FLAG f)const{ return u2.isop.isop_flags & f; }
01029
01030 void Set_omitted(void)
01031 {
01032 FmtAssert(Kind() == CK_OP,
01033 ("CODEREP::Set_omitted: Omission from worklist "
01034 "implemented only for CK_OP"));
01035 Set_isop_flag(ISOP_SSAPRE_OMITTED);
01036 }
01037
01038 BOOL Omitted(void) const
01039 {
01040 if (Kind() == CK_OP) {
01041 return Is_isop_flag_set(ISOP_SSAPRE_OMITTED);
01042 }
01043 else {
01044 return FALSE;
01045 }
01046 }
01047
01048 UINT8 Max_depth(void) const { Is_True(Kind() == CK_OP,
01049 ("CODEREP::Max_depth: illegal kind"));
01050 return u2.isop.max_depth; }
01051 void Set_max_depth(UINT8 d) { Is_True(Kind() == CK_OP,
01052 ("CODEREP::Max_depth: illegal kind"));
01053 u2.isop.max_depth = d; }
01054 CODEREP **Opnd_ptr(void) const { Is_True(Kind() == CK_OP,
01055 ("CODEREP::Opnd_ptr, illegal kind"));
01056 return (CODEREP **) u2.isop.kids; }
01057 CODEREP *Opnd(INT16 i) const { Is_True(Kind() == CK_OP,
01058 ("CODEREP::Opnd, illegal kind %s",
01059 Print_kind()));
01060 return u2.isop.kids[i]; }
01061 CODEREP *Get_opnd(mINT16 i) const { Is_True(Kind() == CK_OP,
01062 ("CODEREP::Get_opnd, illegal kind"));
01063 return (i < u2.isop.kid_count) ?
01064 u2.isop.kids[i] : NULL; }
01065 CODEREP *Skip_opnd(INT16 i) const;
01066
01067 BOOL Set_opnd(mINT16 i,
01068 CODEREP *k) { Is_True(Kind() == CK_OP,
01069 ("CODEREP::Set_opnd, illegal kind"));
01070 if (k && k->Kind() == CK_VAR)
01071 Is_True(k->Dsctyp() != MTYPE_UNKNOWN,
01072 ("CODEREP::Set_opnd: UNKNOWN DSCTYP"));
01073 if (i < u2.isop.kid_count) {
01074 u2.isop.kids[i] = k;
01075 return TRUE;
01076 } else
01077 return FALSE;
01078 }
01079 CODEREP *Ilod_base(void) const { Is_True(Kind() == CK_IVAR,
01080 ("CODEREP::Ilod_base, illegal kind"));
01081 return u2.isivar.base[0]; }
01082 void Set_ilod_base(CODEREP *cr){ Is_True(Kind() == CK_IVAR,
01083 ("CODEREP::Set_ilod_base, illegal kind"));
01084 if (cr && cr->Kind() == CK_VAR)
01085 Is_True(cr->Dsctyp() != MTYPE_UNKNOWN,
01086 ("CODEREP::Set_ilod_base: UNKNOWN DSCTYP"));
01087 u2.isivar.base[0] = cr; }
01088
01089 OCC_TAB_ENTRY *Ivar_occ(void) const { Is_True(Kind() == CK_IVAR,
01090 ("CODEREP::Ivar_aux_id, illegal kind"));
01091 return (OCC_TAB_ENTRY *)u2.isivar.base[1]; }
01092 void Set_ivar_occ(OCC_TAB_ENTRY *occ){ Is_True(Kind() == CK_IVAR,
01093 ("CODEREP::Set_ivar_aux_id, illegal kind"));
01094 u2.isivar.base[1] = (CODEREP*)occ; }
01095 CODEREP *Mload_size(void) const { Is_True(Kind() == CK_IVAR,
01096 ("CODEREP::Mload_size, illegal kind"));
01097 return u2.isivar.base[4]; }
01098 void Set_mload_size(CODEREP *cr){ Is_True(Kind() == CK_IVAR,
01099 ("CODEREP::Set_mload_size, illegal kind"));
01100 u2.isivar.base[4] = cr; }
01101 TY_IDX Ilod_ty(void) const { Is_True(Kind() == CK_IVAR,
01102 ("CODEREP::Ilod_ty, illegal kind"));
01103 return (TY_IDX)(INTPTR)u2.isivar.base[2]; }
01104 void Set_ilod_ty(TY_IDX ty) { Is_True(Kind() == CK_IVAR,
01105 ("CODEREP::Set_ilod_ty, illegal kind"));
01106 u2.isivar.base[2] = (CODEREP*)(INTPTR)ty; }
01107 CODEREP *Mstore_size(void) const { Is_True(Kind() == CK_IVAR,
01108 ("CODEREP::Mstore_size, illegal kind"));
01109 return u2.isivar.base[4]; }
01110 void Set_mstore_size(CODEREP *cr){ Is_True(Kind() == CK_IVAR,
01111 ("CODEREP::Set_mstore_size, illegal kind"));
01112 u2.isivar.base[4] = cr; }
01113 CODEREP *Istr_base(void) const { Is_True(Kind() == CK_IVAR,
01114 ("CODEREP::Istr_base, illegal kind"));
01115 return u2.isivar.base[3]; }
01116 void Set_istr_base(CODEREP *cr){ Is_True(Kind() == CK_IVAR,
01117 ("CODEREP::Set_istr_base, illegal kind"));
01118 if (cr && cr->Kind() == CK_VAR)
01119 Is_True(cr->Dsctyp() != MTYPE_UNKNOWN,
01120 ("CODEREP::Set_ilod_base: UNKNOWN DSCTYP"));
01121 u2.isivar.base[3] = cr; }
01122 TY_IDX Ilod_base_ty(void) const { Is_True(Kind() == CK_IVAR,
01123 ("CODEREP::Ilod_base_ty, illegal kind"));
01124 return (TY_IDX)(INTPTR) u2.isivar.base[4]; }
01125 void Set_ilod_base_ty(TY_IDX ty){ Is_True(Kind() == CK_IVAR,
01126 ("CODEREP::Set_ilod_base_ty, illegal kind"));
01127 u2.isivar.base[4] = (CODEREP*)(INTPTR)ty; }
01128
01129 void Set_ivar_mu_node(MU_NODE *mu){ Is_True(Kind() == CK_IVAR,
01130 ("CODEREP::Set_ivar_mu_node, illegal kind"));
01131 u2.isivar.mu_node = mu; }
01132 MU_NODE *Ivar_mu_node(void) const { Is_True(Kind() == CK_IVAR,
01133 ("CODEREP::Ivar_mu_node, illegal kind"));
01134 return u2.isivar.mu_node; }
01135 CODEREP *Prepend(CODEREP *c) { c->Set_Next(this); return c; }
01136
01137
01138 CODEREP *Get_ivar_vsym(void) const;
01139
01140 POINTS_TO *Points_to(OPT_STAB *opt_stab) const;
01141
01142
01143 IDX_32 Bitpos(void) const { return u1.nonarr._u01.bitpos; }
01144 void Set_Bitpos(IDX_32 bp) { u1.nonarr._u01.bitpos = bp; }
01145 IDTYPE E_num(void) const { return u1.nonarr._u01.e_num; }
01146 void Set_e_num(IDTYPE num) { u1.nonarr._u01.e_num = num; }
01147 BOOL Compare_bitpos(const CODEREP *) const;
01148 BOOL Same_bitpos(const CODEREP *) const;
01149 char *Print_bit(void) const;
01150 IDTYPE Scalar_aux_id(void) const { return u1.nonarr._u01.scalar_aux_id; }
01151 void Set_scalar_aux_id(IDTYPE i) { u1.nonarr._u01.scalar_aux_id = i; }
01152 OCC_TAB_ENTRY *Scalar_ivar_occ(void) const { return u1.nonarr._u01.scalar_ivar_occ; }
01153 void Set_scalar_ivar_occ(OCC_TAB_ENTRY *o) { u1.nonarr._u01.scalar_ivar_occ = o; }
01154
01155 CODEREP *Var_type_conversion(CODEMAP *htable, MTYPE to_dtyp,
01156 MTYPE to_dsctyp, TY_IDX ty, UINT field_id);
01157
01158 STMTREP *Create_cpstmt(CODEREP *a,
01159 MEM_POOL*p);
01160 STMTREP *Create_istr_stmt(CODEREP *a,
01161 MEM_POOL*p);
01162
01163 BOOL Is_const(void) const { return inCODEKIND(Kind(),
01164 CK_CONST|CK_RCONST);}
01165
01166 BOOL Non_leaf(void) const { return inCODEKIND(Kind(),
01167 CK_OP|CK_IVAR); }
01168
01169
01170 BOOL Ivar_has_e_num(void) const { Is_True(Kind() == CK_IVAR,
01171 ("CODEREP::Ivar_has_e_num: illegal kind."));
01172 return (Dtyp() != MTYPE_M &&
01173 (OPERATOR_is_scalar_iload(Opr()) ||
01174 OPERATOR_is_scalar_istore(Opr())) );
01175 }
01176 BOOL Exp_has_e_num(void) const;
01177 BOOL Is_integral_load_store(void) const
01178 { return ((Kind() == CK_IVAR && (OPERATOR_is_scalar_iload (Opr()) ||
01179 OPERATOR_is_scalar_istore (Opr()))
01180 || Kind() == CK_VAR)
01181 && MTYPE_is_integral(Dtyp()));
01182 }
01183
01184
01185 BOOL References_var( AUX_ID var );
01186
01187
01188 CODEREP *Find_cr(const CODEREP *cr);
01189
01190
01191
01192 CODEREP *Create_exp_in_bb(BB_NODE *, CODEMAP *);
01193
01194 BOOL Is_loop_invar(BB_NODE *);
01195
01196
01197
01198
01199 BOOL Can_be_speculated(OPT_STAB *) const;
01200
01201
01202
01203
01204 void Reset_isop_visited(ISOP_FLAG);
01205
01206
01207 BOOL Antloc(BB_NODE *);
01208 BOOL Avloc (BB_NODE *);
01209 BOOL Cseloc(BB_NODE *);
01210 BOOL Is_lcse(void) const { return is_lcse; }
01211 BOOL Is_saved(void) const { return is_saved; }
01212 BOOL On_workstack(void) const { return is_lcse; }
01213 IDTYPE Emit_bb(void) const { return _bb_id; }
01214 IDTYPE Temp_id(void) const { Is_True(Kind()==CK_OP,("CODEREP::Temp_id: not a CK_OP"));
01215 return u2.isop._temp_id; }
01216 void Set_is_lcse(void) { is_lcse = 1; }
01217 void Set_is_saved(void) { is_saved = 1; }
01218 void Set_on_workstack(void) { is_lcse = 1; }
01219 void Reset_is_lcse(void) { is_lcse = 0; }
01220 void Reset_is_saved(void) { is_saved = 0; }
01221 void Reset_on_workstack(void) { is_lcse = 0; }
01222 void Assign_is_lcse(BOOL b) { is_lcse = b; }
01223 void Assign_is_saved(BOOL b) { is_saved = b; }
01224 void Set_emit_bb(IDTYPE bb) { _bb_id = bb; }
01225 void Set_temp_id(IDTYPE id) { Is_True(Kind()==CK_OP,("CODEREP::Temp_id: not a CK_OP"));
01226 u2.isop._temp_id = id; }
01227
01228
01229
01230
01231 BOOL Is_sign_extd(void) const { return _is_sign_extd; }
01232 void Set_sign_extd(void) { _is_sign_extd = 1; }
01233 void Reset_sign_extd(void) { _is_sign_extd = 0; }
01234 void Assign_sign_extd(BOOL b) { _is_sign_extd = b; }
01235 void Set_sign_extension_flag(void);
01236
01237 WN *Insert_expr_wn(MAIN_EMITTER *, BB_NODE *, BOOL);
01238 WN *Store_to_preg(WN *, MAIN_EMITTER *);
01239 WN *Load_from_preg(MAIN_EMITTER *, BOOL gen_cvt = TRUE);
01240
01241 BOOL Var_used(CODEREP *);
01242
01243 BOOL Reference_version(CODEREP *cr);
01244 CODEREP *Replace_version(CODEMAP *htable, CODEREP *cr, CODEREP *newcr);
01245 CODEREP *Replace_CR(CODEMAP *htable, CODEREP *, CODEREP *);
01246
01247 INT32 Offset_nbits(void) const { return sizeof(u1.nonarr.u11.offset) * 8; }
01248
01249 BOOL Propagatable_into_loop(const BB_LOOP *) const;
01250
01251 BOOL Propagatable_along_path(const BB_NODE *, const BB_NODE *) const;
01252
01253 BOOL Propagatable_for_ivr(OPT_STAB *sym) const;
01254
01255 BOOL Is_const_expr(void);
01256
01257 BOOL Is_non_volatile_terminal(OPT_STAB *) const;
01258
01259 BOOL Divisable(const CODEREP *, OPT_STAB *) const;
01260
01261 ADDRESSABILITY Check_if_result_is_address(OPT_STAB *opt_stab) const;
01262
01263 BOOL Is_rvi_const_candidate(const CODEREP *, INT, const OPT_STAB *) const;
01264 BOOL Is_rvi_lda_candidate(const CODEREP *, INT, const OPT_STAB *) const;
01265
01266 void Verify_CODEMAP(CODEMAP *, OPT_STAB *, BOOL);
01267
01268 WN *Rvi_home_wn( OPT_STAB *opt_stab ) const;
01269 BOOL Contains_only_constants(void) const;
01270 BOOL Has_volatile_content(void) const;
01271
01272 #if defined(TARG_NVISA)
01273
01274
01275
01276
01277
01278
01279
01280 CODEREP* Set_ISOP_mtype_b_cache (const CODEREP* CR)
01281 {
01282 u2.isop.node_cache = (void *)CR;
01283 return (CODEREP*) u2.isop.node_cache;
01284 }
01285
01286 CODEREP* Get_ISOP_mtype_b_cache () const
01287 { return (CODEREP*) u2.isop.node_cache; }
01288
01289 BB_NODE* Set_ISOP_def_before_use_cache (const BB_NODE* CR)
01290 {
01291 u2.isop.node_cache =(void*)CR;
01292 return (BB_NODE*)u2.isop.node_cache;
01293 }
01294
01295 BB_NODE* Get_ISOP_def_before_use_cache () const
01296 { return (BB_NODE*) u2.isop.node_cache; }
01297 #endif
01298 };
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309 inline UINT32
01310 Extra_CODEREP_ptrs(const CODEKIND kind, const UINT32 items)
01311 {
01312 switch (kind) {
01313 case CK_OP:
01314 return MAX(0, items - 1);
01315 case CK_IVAR:
01316 return IVAR_EXTRA_NODE_CNT;
01317 default:
01318 return 0;
01319 }
01320 }
01321
01322 inline size_t
01323 Extra_CODEREP_space(const CODEKIND kind, const UINT32 items)
01324 {
01325 return sizeof(CODEREP *) * Extra_CODEREP_ptrs(kind, items);
01326 }
01327
01328 class CODEREP_LIST : public SLIST_NODE {
01329 private:
01330 CODEREP *node;
01331 CODEREP_LIST(const CODEREP_LIST&);
01332 CODEREP_LIST& operator = (const CODEREP_LIST&);
01333 public:
01334 CODEREP_LIST(void) {}
01335 CODEREP_LIST(CODEREP *nd) { node = nd; }
01336 ~CODEREP_LIST(void) {}
01337
01338 DECLARE_SLIST_NODE_CLASS( CODEREP_LIST )
01339
01340 void Init(CODEREP *nd) { node = nd; }
01341 CODEREP_LIST *Prepend (CODEREP *cr,
01342 MEM_POOL *pool);
01343 BOOL Contains(CODEREP *cr) ;
01344
01345
01346 CODEREP *Node(void) const { return node; }
01347 };
01348
01349 class CODEREP_LIST_CONTAINER : public SLIST {
01350 private:
01351 CODEREP_LIST_CONTAINER(const CODEREP_LIST_CONTAINER&);
01352 CODEREP_LIST_CONTAINER& operator = (const CODEREP_LIST_CONTAINER&);
01353
01354 DECLARE_SLIST_CLASS( CODEREP_LIST_CONTAINER, CODEREP_LIST )
01355 public:
01356 ~CODEREP_LIST_CONTAINER(void) {};
01357 BOOL Contains(CODEREP *cr) ;
01358 void Prepend (CODEREP *cr,
01359 MEM_POOL *pool);
01360 };
01361
01362 class CODEREP_LIST_ITER : public SLIST_ITER {
01363 DECLARE_SLIST_ITER_CLASS( CODEREP_LIST_ITER, CODEREP_LIST, CODEREP_LIST_CONTAINER )
01364 public:
01365 void Init(void) { }
01366 CODEREP *First_elem(void) { return (First()) ? Cur()->Node():NULL; }
01367 CODEREP *Next_elem(void) { return (Next()) ? Cur()->Node():NULL; }
01368 };
01369
01370 class CR_PAIR_LIST : public SLIST_NODE {
01371 private:
01372 CODEREP *_nd1;
01373 CODEREP *_nd2;
01374 CR_PAIR_LIST(const CR_PAIR_LIST&);
01375 CR_PAIR_LIST& operator = (const CR_PAIR_LIST&);
01376 public:
01377 CR_PAIR_LIST(void) {}
01378 CR_PAIR_LIST(CODEREP *nd1,
01379 CODEREP *nd2) { Init(nd1, nd2); }
01380 ~CR_PAIR_LIST(void) {}
01381
01382 DECLARE_SLIST_NODE_CLASS( CR_PAIR_LIST )
01383
01384 void Init(CODEREP *nd1,
01385 CODEREP *nd2) { if (nd1 > nd2) { _nd1 = nd1; _nd2 = nd2; }
01386 else { _nd1 = nd2; _nd2 = nd1; }
01387 }
01388 CR_PAIR_LIST *Prepend (CODEREP *nd1,
01389 CODEREP *nd2,
01390 MEM_POOL *pool);
01391 BOOL Contains(CODEREP *nd1,
01392 CODEREP *nd2);
01393
01394
01395 CODEREP *Nd1(void) const { return _nd1; }
01396 CODEREP *Nd2(void) const { return _nd2; }
01397 };
01398
01399 class CR_PAIR_LIST_CONTAINER : public SLIST {
01400 private:
01401 CR_PAIR_LIST_CONTAINER(const CR_PAIR_LIST_CONTAINER&);
01402 CR_PAIR_LIST_CONTAINER& operator = (const CR_PAIR_LIST_CONTAINER&);
01403
01404 DECLARE_SLIST_CLASS( CR_PAIR_LIST_CONTAINER, CR_PAIR_LIST )
01405 public:
01406 ~CR_PAIR_LIST_CONTAINER(void) {};
01407 BOOL Contains(CODEREP *nd1,
01408 CODEREP *nd2);
01409 void Prepend (CODEREP *nd1,
01410 CODEREP *nd2,
01411 MEM_POOL *pool);
01412 };
01413
01414 class CR_PAIR_LIST_ITER : public SLIST_ITER {
01415 DECLARE_SLIST_ITER_CLASS( CR_PAIR_LIST_ITER, CR_PAIR_LIST, CR_PAIR_LIST_CONTAINER)
01416 };
01417
01418
01419 enum { LARGE_KIDS_CNT = 100 };
01420
01421
01422
01423
01424 class LARGE_CODEREP {
01425 private:
01426 CODEREP body;
01427 CODEREP *kids[LARGE_KIDS_CNT];
01428 LARGE_CODEREP(const LARGE_CODEREP&);
01429 LARGE_CODEREP& operator = (const LARGE_CODEREP&);
01430
01431 public:
01432 LARGE_CODEREP(void) {}
01433 CODEREP *Body(void) { return &body; }
01434 };
01435
01436
01437
01438
01439
01440 class CODEREP_CONTAINER : public SLIST {
01441 private:
01442 mUINT32 len;
01443
01444 CODEREP_CONTAINER(const CODEREP_CONTAINER&);
01445 CODEREP_CONTAINER& operator = (const CODEREP_CONTAINER&);
01446
01447 DECLARE_SLIST_CLASS( CODEREP_CONTAINER, CODEREP )
01448 public:
01449 ~CODEREP_CONTAINER(void) {}
01450
01451
01452 void Init(CODEREP *h) { SLIST::Set_Head(h); len = 0; }
01453 void Clear(void) { SLIST::Clear(); len = 0; }
01454 void Add_it (CODEREP *cr,
01455 const mUINT16 idx,
01456 CODEMAP *htable);
01457
01458 void Delete_it (CODEREP *cr,
01459 const mUINT16 idx,
01460 CODEMAP *htable);
01461
01462 BOOL Contains(CODEREP *cr);
01463
01464 CODEREP *Find_cr(CODEREP *cr, INT32 mu_vsym_depth,
01465 OPT_STAB *sym);
01466
01467 };
01468
01469 typedef CODEREP_CONTAINER *CODEREP_CP;
01470
01471 class CODEREP_ITER : public SLIST_ITER {
01472 DECLARE_SLIST_ITER_CLASS( CODEREP_ITER, CODEREP, CODEREP_CONTAINER )
01473 };
01474
01475 class CODEMAP {
01476 friend class CODEMAP_ITER;
01477 private:
01478 SSA *_ssa;
01479 MEM_POOL *mem_pool;
01480 OPT_STAB *sym;
01481 CFG *_cfg;
01482 mUINT32 size;
01483 OPT_PHASE _phase;
01484 CODEREP **hash_vec;
01485 WN_MAP _prefetch_map;
01486 INT32 _coderep_id_cnt;
01487 IDTYPE _pre_temp_id;
01488 INT32 _num_iloadfolds;
01489 INT32 _num_istorefolds;
01490 INT32 _num_inputprops;
01491 INT32 _num_mainprops;
01492 INT32 _num_shrinks;
01493 BOOL _tracing;
01494 BOOL _phi_hash_valid;
01495 ID_MAP<PHI_NODE *, PHI_KEY> _phi_id_map;
01496
01497
01498 CODEMAP(void);
01499 CODEMAP(const CODEMAP&);
01500 CODEMAP& operator = (const CODEMAP&);
01501
01502
01503 IDX_32 Hash_lda(ST *st, IDTYPE ofst) { return (ST_st_idx(st)+ofst)%size; }
01504
01505
01506
01507 IDX_32 Hash_rconst(ST *st, IDTYPE ofst) { return (ST_st_idx(st)+ofst)%size; }
01508 IDX_32 Hash_const(UINT64 val) { return (IDX_32)(val % size); }
01509 IDX_32 Hash_op_and_canon(CODEREP *cr, BOOL canonicalize = TRUE);
01510 IDX_32 Hash_ivar(CODEREP *cr, CODEREP *base);
01511 IDX_32 Hash(CODEREP *cr);
01512
01513 CODEREP *Find_or_append_CR(IDX_32 hash_idx, CODEREP *cr, INT32 mu_vsym_depth);
01514
01515 CODEREP *Append_CR(IDX_32 hash_idx, CODEREP *cr);
01516
01517 CODEREP *Find_CR(IDX_32 hash_idx, CODEREP *cr, INT32 mu_vsym_depth=0, BOOL ok_to_fail=FALSE);
01518
01519
01520 void Alloc_hash_vec(void);
01521 void Free_hash_vec(void);
01522 CODEREP *Hash_bucket(IDX_32 idx)const
01523 { return hash_vec[idx]; }
01524
01525
01526
01527
01528 BOOL Canon_add_sub(WN *wn,
01529 OPT_STAB *opt_stab,
01530 STMTREP *stmt,
01531 CANON_CR *ccr,
01532 CODEREP *cr,
01533 COPYPROP *copyprop);
01534 BOOL Canon_neg(WN *wn,
01535 OPT_STAB *opt_stab,
01536 STMTREP *stmt,
01537 CANON_CR *ccr,
01538 CODEREP *cr,
01539 COPYPROP *copyprop);
01540 BOOL Canon_mpy(WN *wn,
01541 OPT_STAB *opt_stab,
01542 STMTREP *stmt,
01543 CANON_CR *ccr,
01544 CODEREP *cr,
01545 COPYPROP *copyprop);
01546 BOOL Canon_cvt(WN *wn,
01547 OPT_STAB *opt_stab,
01548 STMTREP *stmt,
01549 CANON_CR *ccr,
01550 CODEREP *cr,
01551 COPYPROP *copyprop);
01552 CODEREP *Separate_iv_invar(CODEREP *,
01553 BB_NODE *);
01554
01555 public:
01556 CODEMAP(mUINT32 hash_size, CFG *cfg, OPT_STAB *asym,
01557 SSA *ssa, IDX_32 phi_hash_size, OPT_PHASE phase, MEM_POOL *pool);
01558 ~CODEMAP(void);
01559
01560 OPT_PHASE Phase(void) const { return _phase; }
01561
01562 CFG *Cfg(void) const { return _cfg; }
01563
01564 BOOL Tracing(void) const { return _tracing; }
01565
01566
01567 CODEREP *Hash_Lda(CODEREP *cr)
01568 { Is_True(cr->Kind() == CK_LDA,("CODEMAP::Hash_Lda, wrong kind"));
01569 #ifdef TARG_SL
01570 IDX_32 hash_idx = Hash_lda(cr->Lda_base_st(),(IDTYPE)(cr->Offset() + cr->Is_flag_set(CF_INTERNAL_MEM_OFFSET)));
01571 #else
01572 IDX_32 hash_idx = Hash_lda(cr->Lda_base_st(),(IDTYPE)cr->Offset());
01573 #endif
01574 return Find_or_append_CR(hash_idx,cr,0);
01575 }
01576 CODEREP *Hash_Const(CODEREP *cr)
01577 { Is_True(cr->Kind() == CK_CONST,("CODEMAP::Hash_Const, wrong kind"));
01578 IDX_32 hash_idx = Hash_const(cr->Const_val());
01579 return Find_or_append_CR(hash_idx,cr,0);
01580 }
01581 CODEREP *Hash_Rconst(CODEREP *cr)
01582 { Is_True(cr->Kind() == CK_RCONST,("CODEMAP::Hash_Rconst, wrong kind"));
01583 IDX_32 hash_idx = Hash_rconst(cr->Const_id(), (IDTYPE)0);
01584 return Find_or_append_CR(hash_idx,cr,0);
01585 }
01586 CODEREP *Hash_Ivar(CODEREP *cr, INT32 mu_vsym_depth = 0);
01587 CODEREP *Hash_New_ivar(CODEREP *cr)
01588 { Is_True(cr->Kind() == CK_IVAR,("CODEMAP::Hash_Ivar, wrong kind"));
01589 cr->Set_sign_extension_flag();
01590 IDX_32 hash_idx = Hash_ivar(cr, cr->Ilod_base() ?
01591 cr->Ilod_base() : cr->Istr_base());
01592 return Append_CR(hash_idx,cr);
01593 }
01594 CODEREP *Hash_Op(CODEREP *cr, BOOL canonicalize = TRUE)
01595 { Is_True(cr->Kind() == CK_OP,("CODEMAP::Hash_Op, wrong kind"));
01596 IDX_32 hash_idx = Hash_op_and_canon(cr, canonicalize);
01597 return OPCODE_is_volatile(cr->Op()) ?
01598 Append_CR(hash_idx, cr) : Find_or_append_CR(hash_idx,cr,0);
01599 }
01600
01601 CODEREP *Add_lda_node(CODEREP *, INT64 );
01602
01603 CODEREP *Add_unary_node(OPCODE, CODEREP *);
01604
01605 CODEREP *Add_bin_node(OPCODE,
01606 CODEREP *,
01607 CODEREP *);
01608
01609 CODEREP *Add_unary_node_and_fold(OPCODE,
01610 CODEREP *);
01611
01612 CODEREP *Add_bin_node_and_fold(OPCODE,
01613 CODEREP *,
01614 CODEREP *,
01615 BB_NODE *bb=NULL);
01616
01617 CODEREP *Add_expr_and_fold(CODEREP *);
01618
01619 CODEREP *Add_tertiary_node(OPCODE, CODEREP *, CODEREP *, CODEREP *);
01620
01621 CODEREP *Add_nary_node(OPCODE,
01622 CODEREP **,
01623 mUINT32);
01624
01625 CODEREP *Add_const(MTYPE typ,
01626 INT64 val);
01627
01628 CODEREP *Add_expr(WN *wn,
01629 OPT_STAB *,
01630 STMTREP *,
01631 BOOL *,
01632 COPYPROP *,
01633 BOOL no_complex_preg = FALSE);
01634
01635 BOOL Add_expr(WN *wn,
01636 OPT_STAB *,
01637 STMTREP *,
01638 CANON_CR *,
01639
01640
01641
01642 COPYPROP *,
01643 BOOL no_complex_preg = FALSE);
01644
01645 CODEREP *Add_def(IDTYPE,
01646 mINT16,
01647 STMTREP *,
01648 MTYPE,
01649 MTYPE,
01650 mINT32,
01651 TY_IDX,
01652 UINT field_id,
01653 BOOL is_store);
01654
01655 CODEREP *Add_idef(OPCODE,
01656 OCC_TAB_ENTRY *,
01657 STMTREP *,
01658 MU_NODE *,
01659 MTYPE,
01660 MTYPE,
01661 TY_IDX,
01662 UINT field_id,
01663 mINT32,
01664 CODEREP *,
01665 CODEREP *,
01666 CODEREP *,
01667 OPT_STAB* );
01668
01669
01670 CODEREP *Add_optparm( CODEREP * );
01671
01672 CODEREP *Add_tcon(TCON_IDX);
01673
01674 CODEREP *Cur_def(WN *wn, OPT_STAB*);
01675
01676 CODEREP *Iload_folded(WN *wn, CANON_CR *base_ccr);
01677
01678 CODEREP *Rehash(CODEREP *cr,
01679 BOOL canon=TRUE);
01680
01681 void New_temp_id(void) { ++_pre_temp_id; }
01682 IDTYPE Cur_temp_id(void) const{ return _pre_temp_id; }
01683
01684 void Remove(CODEREP *cr);
01685
01686 SSA *Ssa(void) const { return _ssa; }
01687 OPT_STAB *Sym(void) const { return sym; }
01688 OPT_STAB *Opt_stab(void) const { return sym; }
01689 MEM_POOL *Mem_pool(void) const { return mem_pool; }
01690 WN_MAP Prefetch_map(void)const{ return _prefetch_map; }
01691 INT32 Coderep_id_cnt(void)const{ return _coderep_id_cnt; }
01692 INT32 Next_coderep_id(void) { return _coderep_id_cnt++; }
01693
01694 void Update_pref(CODEREP *ivar) const;
01695
01696 void Set_hash_bucket(IDX_32 idx,
01697 CODEREP *l) { hash_vec[idx] = l; }
01698 INT32 Num_iloadfolds(void) const { return _num_iloadfolds; }
01699 INT32 Num_istorefolds(void) const { return _num_istorefolds; }
01700 void Inc_istorefolds(void) { _num_istorefolds++; }
01701 INT32 Num_inputprops(void) const { return _num_inputprops; }
01702 void Inc_inputprops(void) { _num_inputprops++; }
01703 INT32 Num_mainprops(void) const { return _num_mainprops; }
01704 void Inc_mainprops(void) { _num_mainprops++; }
01705 INT32 Num_shrinks(void) const { return _num_shrinks; }
01706 void Inc_shrinks(void) { _num_shrinks++; }
01707
01708
01709 CODEREP *Expand_expr(CODEREP *, const BB_LOOP *, INT32 *limit);
01710
01711 CODEREP *Convert_to_loop_invar(CODEREP *, BB_LOOP *);
01712
01713
01714 CODEREP *Canon_base(CODEREP *, INT64 *);
01715 CODEREP *Canon_rhs(CODEREP *);
01716 BOOL Canonicalize_compare(CODEREP *,
01717 BB_NODE *,
01718 BOOL *);
01719
01720 void Reset_DCE_visited_flags();
01721 void Print(FILE *fp = stderr) const;
01722 void Print_CR(CODEREP *cr, FILE *fp = stderr) const;
01723 void Print_SR(STMTREP *cr, FILE *fp = stderr) const;
01724
01725
01726 void Init_var_phi_hash(void);
01727 void Verify_var_phi_hash(void);
01728 void Enter_var_phi_hash(PHI_NODE *phi);
01729 void Remove_var_phi_hash(PHI_NODE *phi);
01730 PHI_NODE *Lookup_var_phi(const BB_NODE *bb, const AUX_ID id) const;
01731
01732 void Set_phi_hash_valid(void) { _phi_hash_valid = TRUE; }
01733 void Reset_phi_hash_valid(void) { _phi_hash_valid = FALSE; }
01734 BOOL Phi_hash_valid(void)const { return _phi_hash_valid; }
01735
01736
01737 CODEREP *Rehash_tree(CODEREP *,
01738 BOOL,
01739 BOOL *,
01740 BB_NODE *
01741 );
01742
01743
01744 void Fix_zero_version(PHI_NODE *, INT, bool allow_real_def = false);
01745 void Fix_zero_version(CHI_NODE *, STMTREP *);
01746
01747
01748 void Convert_iload_to_loop_invariant(BB_LOOP *, CODEREP *);
01749
01750
01751 void Insert_var_phi(CODEREP *, BB_NODE *);
01752
01753
01754 void Verify_hashing(void);
01755 };
01756
01757
01758
01759
01760
01761 class CODEMAP_ITER {
01762 private:
01763 INT32 cr_bucket;
01764 const CODEMAP *codemap;
01765
01766 CODEMAP_ITER(const CODEMAP_ITER&);
01767 CODEMAP_ITER& operator = (const CODEMAP_ITER&);
01768
01769 public:
01770 CODEMAP_ITER(CODEMAP *htable) { cr_bucket = 0; codemap = htable; }
01771 CODEMAP_ITER(void) {}
01772 ~CODEMAP_ITER(void) {}
01773 void Init(const CODEMAP *htable) { codemap = htable; }
01774 INT32 First(void) { return (cr_bucket = 0); }
01775 BOOL Is_Empty(void) const { return cr_bucket >= codemap->size; }
01776 INT32 Next(void) { return ++cr_bucket; }
01777 INT32 Cur(void) const { return cr_bucket; }
01778 CODEREP *First_elem(void) { return codemap->Hash_bucket(First()); }
01779 CODEREP *Next_elem(void) { return codemap->Hash_bucket(Next()); }
01780 };
01781
01782
01783 class STMTREP : public CHAIN_NODE {
01784 private:
01785
01786
01787
01788
01789 enum STMTREP_FLAGS {
01790 SRF_NONE = 0x00,
01791 SRF_USELIST = 0x01,
01792 SRF_LIVE_STMT = 0x02,
01793 SRF_BLACK_BOX = 0x04,
01794 SRF_ANTLOC = 0x08,
01795 SRF_DEFINE_ZVER = 0x10,
01796 SRF_HAS_VOLATILE = 0x20,
01797 SRF_IDENTITY_ASGN = 0x40,
01798 SRF_HAS_CTRL_FLOW = 0x80,
01799 SRF_IVR_INTRODUCED = 0x100,
01800 SRF_DCE_RETVSYM = 0x200,
01801 SRF_IV_UPDATE = 0x400,
01802 SRF_NOT_IV_UPDATE = 0x800,
01803 SRF_REPAIRED = 0x1000,
01804 SRF_RHS_SAVED = 0x2000,
01805 SRF_SAVED_RHS = 0x4000,
01806 SRF_DIFF_SSU_VERSION = 0x8000,
01807
01808 SRF_SIZE_VISITED = 0x10000,
01809 SRF_IPHI_INSERTED = 0x20000,
01810
01811
01812
01813
01814 };
01815
01816 OPERATOR _opr:8;
01817 MTYPE _rtype:8;
01818 MTYPE _desc:8;
01819 CODEREP *_lhs;
01820
01821 CODEREP *_rhs;
01822
01823
01824
01825
01826 union {
01827 INT32 _label_number;
01828 INT32 _call_flags;
01829 EXC_SCOPE *_exc_scope;
01830 POINTS_TO_LIST *_pt_list;
01831 ST_IDX _asm_string_idx;
01832 } _u1;
01833
01834
01835
01836
01837
01838
01839 union {
01840 ST *_st;
01841 TY_IDX _ty;
01842 WN *_black_box_wn;
01843 WN *_orig_wn;
01844 WN *_prefetch_wn;
01845 WN *_barrier;
01846 IND_EXPR *_ind_expr;
01847 ASM_PRAGMA_INFO *_asm_pragma;
01848
01849 } _u2;
01850
01851
01852
01853
01854 union {
01855 WN *_wn;
01856 USE_LIST *_use_list;
01857 } _u3;
01858
01859 BB_NODE *bb;
01860 SRCPOS _linenum;
01861
01862 union {
01863 UINT32 _label_flags;
01864 #ifndef KEY
01865 UINT32 _asm_stmt_flags;
01866 #endif
01867 MU_LIST *_mu_list;
01868
01869 } _u4;
01870 CHI_LIST *_chi_list;
01871 union {
01872 IDX_32 _bitpos;
01873 IDX_32 _stmt_id;
01874 } _u5;
01875 UINT _flags : 18;
01876 UINT _proj_op_uses : 2;
01877
01878
01879 #ifdef KEY
01880 UINT32 _str_red_num: 4;
01881
01882 UINT32 _asm_stmt_flags:3;
01883 #ifdef TARG_SL //fork_joint
01884 BOOL _sl2_compgoto_para : 1;
01885 BOOL _sl2_compgoto_for_minor : 1;
01886 BOOL _sl2_internal_mem_ofst : 1;
01887 UINT _unused : 2;
01888 #else
01889 UINT _unused : 5;
01890 #endif
01891 #else
01892 UINT _unused : 12;
01893 #endif
01894
01895
01896 void Init(void) { _lhs = _rhs = NULL;
01897 _opr = OPERATOR_UNKNOWN;
01898 _rtype = _desc = MTYPE_UNKNOWN;
01899 bb = NULL;
01900 #ifndef KEY
01901 _flags = SRF_NONE;
01902 #else // need this if all optimization phases are disabled
01903 _flags = SRF_LIVE_STMT;
01904 #endif
01905 _linenum = (SRCPOS)0;
01906 _u4._mu_list = NULL;
01907 _chi_list = NULL;
01908
01909 _u1._label_number = 0;
01910
01911 _u2._st = NULL;
01912
01913 _u3._wn = NULL;
01914 _u5._bitpos = ILLEGAL_BP;
01915
01916
01917
01918 _proj_op_uses = 2;
01919 #if defined(TARG_SL)
01920 _sl2_internal_mem_ofst = 0;
01921 #endif
01922 }
01923
01924 STMTREP (const STMTREP&);
01925 STMTREP& operator = (const STMTREP&);
01926
01927 DECLARE_CHAIN_NODE_CLASS( STMTREP )
01928
01929 public:
01930 STMTREP (OPCODE opc) { Init();
01931 _opr = OPCODE_operator(opc);
01932 _rtype = OPCODE_rtype(opc);
01933 _desc = OPCODE_desc(opc); }
01934 STMTREP (void) { Init(); }
01935 ~STMTREP(void) { Init(); }
01936
01937 void Init(CODEREP *l,
01938 CODEREP *r,
01939 OPCODE opc) { _lhs=l; _rhs=r;
01940 _opr = OPCODE_operator(opc);
01941 _rtype = OPCODE_rtype(opc);
01942 _desc = OPCODE_desc(opc); }
01943 void Enter_rhs(CODEMAP*, OPT_STAB*, COPYPROP*, EXC*);
01944 void Enter_lhs(CODEMAP*, OPT_STAB*, COPYPROP*);
01945 void Print(FILE *fp = stderr) const;
01946
01947 void Print_node(FILE *fp = stderr) const;
01948 char *Print_str(BOOL);
01949 BOOL Verify_IR(CFG *, CODEMAP *, INT);
01950 WN *Gen_wn(STMT_CONTAINER *, EMITTER *);
01951 BOOL Gen_wn(MAIN_EMITTER *);
01952
01953
01954 void Check_unsaved_exprs(MAIN_EMITTER*);
01955
01956 WN *Insert_stmt_wn(MAIN_EMITTER *, BB_NODE *);
01957 BOOL Antloc_and_deletions(MAIN_EMITTER *, BB_NODE *);
01958 OPCODE Op(void) const { return OPCODE_make_op(_opr, _rtype, _desc); }
01959 OPERATOR Opr(void) const { return _opr; }
01960 MTYPE Rtype(void) const { return _rtype; }
01961 MTYPE Desc(void) const { return _desc; }
01962
01963 WN *Wn(void) const { return _u3._wn; }
01964 void Set_wn( WN *wn ) { _u3._wn = wn; }
01965
01966 USE_LIST *Use_list(void) const
01967 { Is_True( Is_use_list(), ("Not Is_use_list") );
01968 return _u3._use_list; }
01969 void Set_use_list( USE_LIST *uses )
01970 { _u3._use_list = uses;
01971 Set_is_use_list(); }
01972
01973 CODEREP *Lhs(void) const { return _lhs; }
01974 CODEREP *Rhs(void) const { return _rhs; }
01975 BB_NODE *Bb(void) const { return bb; }
01976 void Set_op(OPCODE opc) { _opr = OPCODE_operator(opc);
01977 _rtype = OPCODE_rtype(opc);
01978 _desc = OPCODE_desc(opc); }
01979 void Set_opr(OPERATOR opr) { _opr = opr; }
01980 void Set_rtype(MTYPE rtype) { _rtype = rtype; }
01981 void Set_desc(MTYPE desc) { _desc = desc; }
01982 void Set_bb(BB_NODE *b) { bb = b; }
01983 void Set_lhs(CODEREP *l) { _lhs = l; }
01984 void Set_rhs(CODEREP *r) { _rhs = r; }
01985
01986 STMTREP *Duplicate(MEM_POOL *p);
01987
01988
01989 POINTS_TO *Points_to(OPT_STAB *opt_stab) const;
01990
01991
01992 void Reset_flag(CR_FLAG f) { _flags = _flags&~f; }
01993 void Set_flag(CR_FLAG f) { _flags = _flags | f; }
01994 BOOL Is_flag_set(CR_FLAG f)const{ return _flags & f; }
01995
01996 BOOL Live_stmt(void) const { return _flags & SRF_LIVE_STMT; }
01997 void Set_live_stmt(void) { _flags |= SRF_LIVE_STMT; }
01998 void Reset_live_stmt(void) { _flags &= ~SRF_LIVE_STMT; }
01999
02000 BOOL Volatile_stmt(void) const { return _flags & SRF_HAS_VOLATILE; }
02001 void Set_volatile_stmt(void) { _flags |= SRF_HAS_VOLATILE; }
02002 void Reset_volatile_stmt(void) { _flags &= ~SRF_HAS_VOLATILE; }
02003
02004 EXC_SCOPE *Exc_scope(void) const { return _u1._exc_scope; }
02005 void Set_exc_scope(EXC_SCOPE *ex){ _u1._exc_scope = ex; }
02006
02007 BOOL Black_box(void) const { return _flags & SRF_BLACK_BOX; }
02008 void Set_black_box(void) { _flags |= SRF_BLACK_BOX; }
02009 void Reset_black_box(void) { _flags &= ~SRF_BLACK_BOX; }
02010 WN *Black_box_wn(void) const { return _u2._black_box_wn; }
02011 void Set_black_box_wn(WN *box_wn){ _u2._black_box_wn = box_wn; }
02012
02013 WN *Orig_wn(void) const { return _u2._orig_wn; }
02014 void Set_orig_wn(WN *orig_wn) { _u2._orig_wn = orig_wn; }
02015
02016 WN *Prefetch_wn(void) const { return _u2._prefetch_wn; }
02017 void Set_prefetch_wn(WN *pf_wn) { _u2._prefetch_wn = pf_wn; }
02018
02019 BOOL Has_zver(void) const { return _flags & SRF_DEFINE_ZVER; }
02020 void Set_has_zver(void) { _flags |= SRF_DEFINE_ZVER; }
02021 void Reset_has_zver(void) { _flags &= ~SRF_DEFINE_ZVER; }
02022 void Recompute_has_zver(void);
02023
02024 BOOL Is_identity_asgn(void) const { return _flags & SRF_IDENTITY_ASGN; }
02025 void Set_identity_asgn(void) { _flags |= SRF_IDENTITY_ASGN; }
02026 void Reset_identity_asgn(void) { _flags &= ~SRF_IDENTITY_ASGN; }
02027
02028
02029 BOOL Antloc(void) const { return _flags & SRF_ANTLOC; }
02030 void Set_antloc(void) { _flags |= SRF_ANTLOC; }
02031 void Reset_antloc(void) { _flags &= ~SRF_ANTLOC; }
02032
02033
02034 BOOL Is_use_list(void) const { return _flags & SRF_USELIST; }
02035 void Set_is_use_list(void) { _flags |= SRF_USELIST; }
02036 void Reset_is_use_list(void) { _flags &= ~SRF_USELIST; }
02037
02038
02039 BOOL Has_ctrl_flow(void) const{ return _flags & SRF_HAS_CTRL_FLOW; }
02040 void Set_has_ctrl_flow(void) { _flags |= SRF_HAS_CTRL_FLOW; }
02041
02042
02043 BOOL Ivr_introduced(void) const { return _flags & SRF_IVR_INTRODUCED; }
02044 void Set_ivr_introduced(void) { _flags |= SRF_IVR_INTRODUCED; }
02045 void Reset_ivr_introduced(void) { _flags &= ~SRF_IVR_INTRODUCED; }
02046
02047
02048 BOOL Dce_retvsym(void) const { return _flags & SRF_DCE_RETVSYM; }
02049 void Set_dce_retvsym(void) { _flags |= SRF_DCE_RETVSYM; }
02050 void Reset_dce_retvsym(void) { _flags &= ~SRF_DCE_RETVSYM; }
02051
02052
02053
02054 BOOL Stmt_order_less_or_equal(const STMTREP *) const;
02055
02056
02057
02058
02059 BOOL Iv_update(void) const { return _flags & SRF_IV_UPDATE; }
02060 void Reset_iv_update(void) { _flags &= ~SRF_IV_UPDATE; }
02061 void Set_iv_update(void)
02062 {
02063 Is_True(!Not_iv_update(),
02064 ("STMTREP::Set_iv_update: Contradictory flags"));
02065 if (!(_flags & SRF_IV_UPDATE))
02066 _str_red_num = 0;
02067 _flags |= SRF_IV_UPDATE;
02068 }
02069 BOOL Not_iv_update(void) const { return _flags & SRF_NOT_IV_UPDATE; }
02070 void Set_not_iv_update(void)
02071 {
02072 Is_True(!Iv_update(),
02073 ("STMTREP::Set_not_iv_update: Contradictory flags"));
02074 _flags |= SRF_NOT_IV_UPDATE;
02075 }
02076
02077
02078
02079
02080
02081
02082
02083 void Reset_repaired(void) { _flags &= ~SRF_REPAIRED; }
02084 void Set_repaired(void) { _flags |= SRF_REPAIRED; }
02085 BOOL Repaired(void) const { return _flags & SRF_REPAIRED; }
02086
02087
02088
02089 void Set_RHS_saved(void) { _flags |= SRF_RHS_SAVED; }
02090 void Reset_RHS_saved(void) { _flags &= ~SRF_RHS_SAVED; }
02091 BOOL Is_RHS_saved(void) const { return _flags & SRF_RHS_SAVED; }
02092
02093 void Set_saved_RHS(void) { _flags |= SRF_SAVED_RHS; }
02094 void Reset_saved_RHS(void) { _flags &= ~SRF_SAVED_RHS; }
02095 BOOL Is_saved_RHS(void) const { return _flags & SRF_SAVED_RHS; }
02096
02097 void Reset_RHS_saved_saved_RHS(void) { _flags &= ~(SRF_SAVED_RHS|SRF_RHS_SAVED); }
02098
02099 void Set_diff_ssu_version(void) { _flags |= SRF_DIFF_SSU_VERSION; }
02100 BOOL Is_diff_ssu_version(void) const { return _flags & SRF_DIFF_SSU_VERSION; }
02101
02102 void Set_size_visited(void) { _flags |= SRF_SIZE_VISITED; }
02103 BOOL Is_size_visited(void) const { return _flags & SRF_SIZE_VISITED; }
02104 void Reset_size_visited(void) { _flags &= ~SRF_SIZE_VISITED; }
02105
02106 void Set_iphi_inserted(void) { _flags |= SRF_IPHI_INSERTED; }
02107 BOOL Is_iphi_inserted(void) const { return _flags & SRF_IPHI_INSERTED; }
02108
02109
02110 UINT Proj_op_uses(void) const { return _proj_op_uses; }
02111 void Set_proj_op_uses(UINT proj_op_uses)
02112 { _proj_op_uses = MIN(proj_op_uses, 2); }
02113 void Inc_proj_op_uses(UINT inc = 1)
02114 {
02115 if (_proj_op_uses + inc < 3) {
02116 _proj_op_uses += inc;
02117 }
02118 else {
02119 _proj_op_uses = 2;
02120 }
02121 }
02122
02123 SRCPOS Linenum(void) const { return _linenum; }
02124 void Set_linenum(SRCPOS ln) { _linenum = ln; }
02125
02126 BOOL Has_mu(void) const;
02127 BOOL Has_chi(void) const;
02128 MU_LIST *Mu_list(void) const { return _u4._mu_list; }
02129 void Set_mu_list( MU_LIST *mu ) { _u4._mu_list = mu; }
02130
02131
02132
02133
02134 CHI_LIST *Chi_list(void) const { return _chi_list; }
02135 void Set_chi_list(CHI_LIST *chi) { _chi_list = chi; }
02136
02137
02138
02139 INT32 Label_number(void) const { return _u1._label_number; }
02140 void Set_label_number(INT32 lab) { _u1._label_number = lab; }
02141
02142 INT32 Call_flags(void) const { return _u1._call_flags; }
02143 void Set_call_flags(INT32 flags) { _u1._call_flags = flags; }
02144
02145 POINTS_TO_LIST *Pt_list(void) const { return _u1._pt_list; }
02146 void Set_pt_list(POINTS_TO_LIST *pt_list) { _u1._pt_list = pt_list; }
02147
02148 ST_IDX Asm_string_idx(void) const { return _u1._asm_string_idx; }
02149 void Set_asm_string_idx(ST_IDX i) { _u1._asm_string_idx = i; }
02150
02151 TY_IDX Ty(void) const { return _u2._ty; }
02152 void Set_ty(TY_IDX ty) { _u2._ty = ty; }
02153
02154 WN *Barrier(void) const { return _u2._barrier; }
02155 void Set_barrier(WN *wn) { _u2._barrier = wn; }
02156
02157
02158
02159 ST *St(void) const { return _u2._st; }
02160 void Set_st(ST *sym) { _u2._st = sym; }
02161
02162
02163 IND_EXPR *Ind_expr(void) const { return _u2._ind_expr; }
02164 void Set_ind_expr(IND_EXPR *ie) { _u2._ind_expr = ie; }
02165
02166
02167
02168 ASM_PRAGMA_INFO *Asm_pragma(void) const { return _u2._asm_pragma; }
02169 void Set_asm_pragma(ASM_PRAGMA_INFO *a) { _u2._asm_pragma = a; }
02170
02171
02172 UINT32 Label_flags(void) const { return _u4._label_flags; }
02173 void Set_label_flags(UINT32 f) { _u4._label_flags = f; }
02174
02175 UINT32 Str_red_num(void) const { return _str_red_num; }
02176 void Inc_str_red_num(void) { _str_red_num++; }
02177
02178 #ifdef TARG_SL //fork_joint
02179
02180 BOOL Fork_stmt_flags(void) const { return _sl2_compgoto_para; }
02181 void Set_fork_stmt_flags(BOOL f) { _sl2_compgoto_para = f; }
02182 BOOL Minor_fork_stmt_flags(void) const { return _sl2_compgoto_for_minor; }
02183 void Set_minor_fork_stmt_flags(BOOL f) { _sl2_compgoto_for_minor = f; }
02184 BOOL SL2_internal_mem_ofst(void) const { return _sl2_internal_mem_ofst; }
02185 void Set_SL2_internal_mem_ofst(BOOL f) { _sl2_internal_mem_ofst = f; }
02186 #endif
02187
02188
02189 #ifdef KEY
02190 UINT32 Asm_stmt_flags(void) const { return _asm_stmt_flags; }
02191 void Set_asm_stmt_flags(UINT32 f) { _asm_stmt_flags = f; }
02192 #else
02193 UINT32 Asm_stmt_flags(void) const { return _u4._asm_stmt_flags; }
02194 void Set_asm_stmt_flags(UINT32 f) { _u4._asm_stmt_flags = f; }
02195 #endif
02196
02197 IDX_32 Bitpos(void) const { return _u5._bitpos; }
02198 void Set_Bitpos(IDX_32 bp) { _u5._bitpos = bp; }
02199 char *Print_bit(void) const;
02200
02201
02202 IDX_32 Stmt_id(void) const { return _u5._stmt_id; }
02203 void Set_stmt_id(IDX_32 sid) { _u5._stmt_id = sid; }
02204
02205
02206
02207
02208
02209
02210
02211
02212
02213
02214
02215
02216 void Init_Goto(ST *sym, INT32 label_number, SRCPOS ln)
02217 { Set_st(sym); Set_label_number(label_number);
02218 Set_linenum(ln); }
02219
02220
02221
02222
02223 void Init_Label(ST *sym, INT32 label_number, SRCPOS ln)
02224 { Set_st(sym); Set_label_number(label_number);
02225 Set_linenum(ln); }
02226
02227 BOOL Assign_same_var(STMTREP *b);
02228
02229 BOOL Redefines_var( AUX_ID var );
02230 BOOL References_var( AUX_ID var );
02231 BOOL Is_incr(void) const;
02232
02233 void Find_ind_incr(CFG *,
02234 ITABLE *);
02235
02236
02237
02238
02239 BOOL Const_prop_cand(const CODEREP *) const;
02240
02241
02242 BOOL Same_lhs(const STMTREP *) const;
02243
02244 void Replace_CR(CODEMAP *htable, CODEREP *, CODEREP *);
02245
02246 void Verify_CODEMAP(CODEMAP *htable, OPT_STAB *opt_stab);
02247
02248 BOOL Is_identity_assignment_removable(void) const;
02249
02250 BOOL Contains_volatile_ref(const BVECTOR &cr_vol_map) const;
02251
02252 BOOL Has_zero_version_chi(void) const;
02253
02254 void Clone(STMTREP *, CODEMAP *, MEM_POOL *pool);
02255
02256 };
02257
02258
02259
02260
02261
02262 class CANON_CR {
02263 private:
02264 CODEREP *_tree;
02265 INT64 _scale;
02266
02267
02268 CANON_CR(const CANON_CR&);
02269 CANON_CR& operator = (const CANON_CR&);
02270
02271 public:
02272 CANON_CR(void) {}
02273 ~CANON_CR(void) {}
02274
02275 CODEREP *Convert2cr(WN *wn,
02276 CODEMAP *htable,
02277 BOOL foldit) const;
02278 void Trim_to_16bits(WN *wn,
02279 CODEMAP *htable);
02280
02281
02282 CODEREP *Tree(void) const { return _tree; }
02283 void Set_tree(CODEREP *t) { _tree = t; }
02284 INT64 Scale(void) const { return _scale; }
02285 void Set_scale(INT64 s) { _scale = s; }
02286
02287 void Print(FILE *fp = stderr) const;
02288 };
02289
02290
02291
02292
02293 extern MTYPE Operand_type(OPCODE, INT, INT);
02294
02295
02296 template <class traverseCR>
02297 void traverseSR(STMTREP *stmt, traverseCR &traverse_cr)
02298 {
02299
02300
02301
02302 CODEREP * const rhs = stmt->Rhs();
02303 CODEREP * const lhs = stmt->Lhs();
02304
02305 if (OPCODE_is_fake(stmt->Op()))
02306 for (INT32 i = 0; i < rhs->Kid_count(); i++)
02307 traverse_cr(rhs->Opnd(i), stmt, i);
02308 else if (rhs != NULL)
02309 traverse_cr(rhs, stmt, 0);
02310 if (lhs != NULL)
02311 traverse_cr(lhs, stmt, 1);
02312 }
02313
02315
02316
02317
02318
02320
02321 struct cr_cmp {
02322 bool operator () (const CODEREP* cr1, const CODEREP* cr2) const {
02323 Is_True (cr1->Coderep_id() != 0 && cr2->Coderep_id() != 0, ("CODEREP does not has ID"));
02324 return cr1->Coderep_id() < cr2->Coderep_id();
02325 }
02326 };
02327
02328 typedef std::pair<const CODEREP*, MEMOP_ANNOT*> CR_MEMANNOT_PAIR;
02329 typedef mempool_allocator<CR_MEMANNOT_PAIR> CR_ANNOT_MAP_ALLOC;
02330 typedef std::map<const CODEREP*, MEMOP_ANNOT*, cr_cmp, CR_ANNOT_MAP_ALLOC> CR_2_MEM_ANNOT_MAP;
02331
02332 struct sr_cmp {
02333 bool operator () (const STMTREP* sr1, const STMTREP* sr2) const {
02334 return sr1 < sr2;
02335 }
02336 };
02337
02338 typedef std::pair<const STMTREP*, MEMOP_ANNOT*> SR_MEMANNOT_PAIR;
02339 typedef mempool_allocator<SR_MEMANNOT_PAIR> SR_ANNOT_MAP_ALLOC;
02340 typedef std::map<const STMTREP*, MEMOP_ANNOT*, sr_cmp, SR_ANNOT_MAP_ALLOC>
02341 SR_2_MEM_ANNOT_MAP;
02342
02343 class MEMOP_ANNOT_CR_SR_MGR : public MEMOP_ANNOT_MGR {
02344 private:
02345 CR_2_MEM_ANNOT_MAP _cr_map;
02346 SR_2_MEM_ANNOT_MAP _sr_map;
02347 BOOL _trace;
02348 BS* _imported;
02349 BS* _exported;
02350
02351 void Set_imported (MEMOP_ANNOT* a)
02352 { _imported = BS_Union1D (_imported, a->Id(), _mp); }
02353 BOOL Is_imported (MEMOP_ANNOT* a) const
02354 { return BS_MemberP (_imported, a->Id());}
02355
02356 void Set_exported (MEMOP_ANNOT* a)
02357 { _exported = BS_Union1D (_exported, a->Id(), _mp); }
02358 BOOL Is_exported (MEMOP_ANNOT* a)
02359 { return BS_MemberP (_exported, a->Id()); }
02360
02361 public:
02362 MEMOP_ANNOT_CR_SR_MGR (MEM_POOL* mp, BOOL trace);
02363
02364
02365 MEMOP_ANNOT* Get_annot (CODEREP* cr);
02366 MEMOP_ANNOT_ITEM* Get_annot (CODEREP* cr, MEM_ANNOT_KIND kind) ;
02367 MEMOP_ANNOT* Get_annot (STMTREP* sr) ;
02368 MEMOP_ANNOT_ITEM* Get_annot (STMTREP* sr, MEM_ANNOT_KIND kind);
02369
02370
02371 void Add_annot (CODEREP* cr, const MEMOP_ANNOT_ITEM& annot_item);
02372 void Add_annot (STMTREP* stmt, const MEMOP_ANNOT_ITEM& annot_item);
02373 void Set_annot (CODEREP* cr, MEMOP_ANNOT* annot);
02374 void Set_annot (STMTREP* sr, MEMOP_ANNOT* annot);
02375
02376
02377 MEMOP_ANNOT* Import_annot (CODEREP* cr, MEMOP_ANNOT* annot) ;
02378 MEMOP_ANNOT* Import_annot (STMTREP* sr, MEMOP_ANNOT* annot) ;
02379 MEMOP_ANNOT* Import_annot (MEMOP_ANNOT* annot) ;
02380
02381
02382
02383
02384
02385
02386
02387
02388
02389
02390
02391
02392
02393
02394
02395 void Export_annot (WN* tree, const ALIAS_MANAGER*,
02396 BOOL inline_annot, BOOL trace);
02397
02398
02399
02400
02401
02402 void Discard_offline_annot (WN*, const ALIAS_MANAGER*, BOOL trace);
02403
02404 void Print (FILE* f, BOOL verbose=FALSE) const;
02405 };
02406
02407 #endif