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 #ifndef opt_rvilr_INCLUDED
00054 #define opt_rvilr_INCLUDED "opt_rvilr.h"
00055 #ifdef _KEEP_RCS_ID
00056 static char *opt_rvilrrcs_id = opt_rvilr_INCLUDED"$ $Revision$";
00057 #endif
00058
00059
00060 class BB_NODE;
00061 class BB_NODE_SET;
00062 class CFG;
00063 class RVI;
00064 class RVI_LR_INFO;
00065
00066
00067
00068 class RVI_LRBB : public SLIST_NODE {
00069 DECLARE_SLIST_NODE_CLASS(RVI_LRBB);
00070 private:
00071 enum { MAX_RVI_REFS = 255 };
00072 enum RVI_LRBB_FLAG {
00073 LRBBF_NONE = 0x00,
00074 LRBBF_STR = 0x01,
00075 LRBBF_ND_STR_BOT = 0x02,
00076 LRBBF_ND_STR_SUCC = 0x04,
00077 LRBBF_ND_STR_IREF = 0x08,
00078 LRBBF_ND_STR = (LRBBF_ND_STR_BOT|
00079 LRBBF_ND_STR_SUCC|
00080 LRBBF_ND_STR_IREF),
00081 LRBBF_ND_LOD_HERE = 0x10,
00082 LRBBF_ND_LOD_PRED = 0x20,
00083 LRBBF_ND_LOD_CHI = 0x40,
00084 LRBBF_ND_LOD = (LRBBF_ND_LOD_HERE|
00085 LRBBF_ND_LOD_PRED|
00086 LRBBF_ND_LOD_CHI),
00087
00088 };
00089
00090 BB_NODE *_bb;
00091 mUINT8 _flags;
00092 mUINT8 _load_cnt;
00093 mUINT8 _store_cnt;
00094
00095 RVI_LRBB( void );
00096 RVI_LRBB(const RVI_LRBB&);
00097 RVI_LRBB& operator = (const RVI_LRBB&);
00098 public:
00099 RVI_LRBB( BB_NODE *bb ) :
00100 _bb(bb)
00101 { _flags = LRBBF_NONE;
00102 _load_cnt = 0;
00103 _store_cnt = 0;
00104 }
00105 ~RVI_LRBB( void ) {}
00106
00107
00108 BB_NODE *Bb( void ) const
00109 { return _bb; }
00110
00111
00112
00113 BOOL First_is_store( void ) const
00114 { return (_flags & LRBBF_STR) != 0; }
00115 void Set_first_is_store( void )
00116 { _flags |= LRBBF_STR; }
00117 void Reset_first_is_store( void )
00118 { _flags &= ~LRBBF_STR; }
00119 BOOL Need_store( void ) const
00120 { return (_flags & LRBBF_ND_STR) != 0; }
00121 BOOL Need_store_bot( void ) const
00122 { return (_flags & LRBBF_ND_STR_BOT) != 0; }
00123 void Set_need_store_bot( void )
00124 { _flags |= LRBBF_ND_STR_BOT; }
00125 void Reset_need_store_bot( void )
00126 { _flags &= ~LRBBF_ND_STR_BOT; }
00127 BOOL Need_store_succ( void ) const
00128 { return (_flags & LRBBF_ND_STR_SUCC) != 0; }
00129 void Set_need_store_succ( void )
00130 { _flags |= LRBBF_ND_STR_SUCC; }
00131 void Reset_need_store_succ( void )
00132 { _flags &= ~LRBBF_ND_STR_SUCC; }
00133 BOOL Need_store_iref( void ) const
00134 { return (_flags & LRBBF_ND_STR_IREF) != 0; }
00135 void Set_need_store_iref( void )
00136 { _flags |= LRBBF_ND_STR_IREF; }
00137 void Reset_need_store_iref( void )
00138 { _flags &= ~LRBBF_ND_STR_IREF; }
00139 BOOL Need_load( void ) const
00140 { return (_flags & LRBBF_ND_LOD) != 0; }
00141 BOOL Need_load_here( void ) const
00142 { return (_flags & LRBBF_ND_LOD_HERE) != 0; }
00143 void Set_need_load_here( void )
00144 { _flags |= LRBBF_ND_LOD_HERE; }
00145 void Reset_need_load_here( void )
00146 { _flags &= ~LRBBF_ND_LOD_HERE; }
00147 BOOL Need_load_pred( void ) const
00148 { return (_flags & LRBBF_ND_LOD_PRED) != 0; }
00149 void Set_need_load_pred( void )
00150 { _flags |= LRBBF_ND_LOD_PRED; }
00151 void Reset_need_load_pred( void )
00152 { _flags &= ~LRBBF_ND_LOD_PRED; }
00153 BOOL Need_load_chi( void ) const
00154 { return (_flags & LRBBF_ND_LOD_CHI) != 0; }
00155 void Set_need_load_chi( void )
00156 { _flags |= LRBBF_ND_LOD_CHI; }
00157 void Reset_need_load_chi( void )
00158 { _flags &= ~LRBBF_ND_LOD_CHI; }
00159
00160
00161
00162 UINT8 Load_cnt( void ) const
00163 { return _load_cnt; }
00164 void Set_load_cnt( UINT load_cnt )
00165 { _load_cnt = MIN(load_cnt,MAX_RVI_REFS); }
00166 UINT8 Store_cnt( void ) const
00167 { return _store_cnt; }
00168 void Set_store_cnt( UINT store_cnt )
00169 { _store_cnt = MIN(store_cnt,MAX_RVI_REFS); }
00170
00171
00172 void Print( FILE *fp = stderr ) const;
00173 };
00174
00175
00176
00177
00178 class RVI_LRBB_LIST : public SLIST {
00179 DECLARE_SLIST_CLASS(RVI_LRBB_LIST,RVI_LRBB)
00180 private:
00181 RVI_LRBB_LIST(const RVI_LRBB_LIST&);
00182 RVI_LRBB_LIST& operator = (const RVI_LRBB_LIST&);
00183 public:
00184 ~RVI_LRBB_LIST(void) {}
00185
00186
00187 RVI_LRBB *Find( const BB_NODE *bb );
00188
00189 };
00190
00191
00192
00193
00194 class RVI_LRBB_ITER : public SLIST_ITER {
00195 DECLARE_SLIST_ITER_CLASS(RVI_LRBB_ITER, RVI_LRBB, RVI_LRBB_LIST)
00196 public:
00197 ~RVI_LRBB_ITER(void) {}
00198 };
00199
00200
00201
00202
00203
00204 class RVI_LR : public SLIST_NODE {
00205 private:
00206 enum { MAX_RVI_REFS = 255 };
00207 enum RVI_LR_FLAG {
00208 LRF_NONE = 0x00,
00209 LRF_REPLACE = 0x01,
00210 LRF_NEED_HOME = 0x02,
00211 LRF_PREDOUT_NOST= 0x04,
00212
00213 };
00214 IDX_32 _bitpos;
00215 RVI_LRBB_LIST _blocks;
00216 BB_NODE_SET *_block_set;
00217 mINT32 _preg;
00218 mUINT8 _load_cnt;
00219 mUINT8 _store_cnt;
00220 mUINT8 _flags;
00221
00222 RVI_LR( void );
00223 RVI_LR(const RVI_LR&);
00224 RVI_LR& operator = (const RVI_LR&);
00225 public:
00226 RVI_LR( IDX_32 bitpos, const CFG *cfg, MEM_POOL *pool );
00227 ~RVI_LR( void ) {}
00228
00229 IDX_32 Bitpos( void ) const
00230 { return _bitpos; }
00231
00232 RVI_LRBB_LIST *Blocks( void )
00233 { return &_blocks; }
00234 const RVI_LRBB_LIST *Blocks( void ) const
00235 { return (const RVI_LRBB_LIST *)&_blocks; }
00236
00237 const BB_NODE_SET *Block_set( void ) const
00238 { return _block_set; }
00239 BB_NODE_SET *Block_set( void )
00240 { return _block_set; }
00241 void Set_block_set( BB_NODE_SET *block_set )
00242 { _block_set = block_set; }
00243
00244 INT32 Preg( void ) const
00245 { return _preg; }
00246 void Set_preg( INT32 preg )
00247 { _preg = preg; }
00248 UINT8 Load_cnt( void ) const
00249 { return _load_cnt; }
00250 void Set_load_cnt( UINT load_cnt )
00251 { _load_cnt = MIN(load_cnt,MAX_RVI_REFS); }
00252 UINT8 Store_cnt( void ) const
00253 { return _store_cnt; }
00254 void Set_store_cnt( UINT store_cnt )
00255 { _store_cnt = MIN(store_cnt,MAX_RVI_REFS); }
00256
00257
00258 BOOL Replace_anything( void ) const
00259 { return (_flags & LRF_REPLACE) != 0; }
00260 void Set_replace_anything( void )
00261 { _flags |= LRF_REPLACE; }
00262 BOOL Need_home( void ) const
00263 { return (_flags & LRF_NEED_HOME) != 0; }
00264 void Set_need_home( void )
00265 { _flags |= LRF_NEED_HOME; }
00266 BOOL Predout_nostore( void ) const
00267 { return (_flags & LRF_PREDOUT_NOST) != 0; }
00268 void Set_predout_nostore( void )
00269 { _flags |= LRF_PREDOUT_NOST; }
00270
00271
00272 void Analyze_preds( const BB_NODE *bb, const RVI *rvi,
00273 RVI_LR_INFO *lr_info );
00274 void Analyze_succs( const BB_NODE *bb, const RVI *rvi,
00275 RVI_LR_INFO *lr_info );
00276
00277
00278 BOOL Do_anything( void );
00279
00280
00281 void Print( FILE *fp = stderr );
00282 };
00283
00284
00285
00286
00287 class RVI_LR_LIST : public SLIST {
00288 private:
00289 RVI_LR_LIST(const RVI_LR_LIST&);
00290 RVI_LR_LIST& operator = (const RVI_LR_LIST&);
00291
00292 DECLARE_SLIST_CLASS(RVI_LR_LIST,RVI_LR)
00293
00294 public:
00295 ~RVI_LR_LIST(void) {}
00296 };
00297
00298
00299
00300
00301 class RVI_LR_ITER : public SLIST_ITER {
00302 DECLARE_SLIST_ITER_CLASS(RVI_LR_ITER, RVI_LR, RVI_LR_LIST)
00303 public:
00304 void Init( void ) const {}
00305 };
00306
00307
00308 #endif // opt_rvilr_INCLUDED