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
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 #ifndef opt_du_INCLUDED
00207 #define opt_du_INCLUDED "opt_du.h"
00208 #ifdef _KEEP_RCS_ID
00209 static char *opt_durcs_id = opt_du_INCLUDED"$Revision$";
00210 #endif
00211
00212 #ifndef defs_INCLUDED
00213 #include "defs.h"
00214 #endif
00215
00216 #include "opt_defs.h"
00217
00218 #ifndef mempool_INCLUDED
00219 #include "mempool.h"
00220 #endif
00221 #ifndef optimizer_INCLUDED
00222 #include "optimizer.h"
00223 #endif
00224 #ifndef wn_INCLUDED
00225 #include "wn.h"
00226 #endif
00227 #ifndef wn_map_INCLUDED
00228 #include "wn_map.h"
00229 #endif
00230 #ifndef cxx_base_INCLUDED
00231 #include "cxx_base.h"
00232 #endif
00233
00234
00235 class ALIAS_MANAGER;
00236 class BB_LOOP;
00237 class OPT_STAB;
00238 class CFG;
00239 class BB_SUMMARY_INFO;
00240
00241 class DU_NODE : public SLIST_NODE {
00242 private:
00243 WN *_wn;
00244
00245 DU_NODE(const DU_NODE&);
00246 DU_NODE& operator = (const DU_NODE&);
00247 void Init(WN *wn) { _wn = wn; }
00248 void Clear(void) { _wn = NULL;}
00249
00250 public:
00251 DU_NODE(void);
00252 DU_NODE(WN *wn) { Init(wn); }
00253 ~DU_NODE(void) { Clear(); }
00254
00255 DECLARE_SLIST_NODE_CLASS( DU_NODE )
00256
00257 void Print (FILE *fp=stderr)
00258 const;
00259
00260 WN *Wn(void) const { return _wn; }
00261 };
00262
00263 class DEF_LIST : public SLIST {
00264 union {
00265 WN *_loop_stmt;
00266 BB_LOOP *_loop_info;
00267 } _u1;
00268
00269 enum dl_flags {
00270 DL_NONE = 0x00,
00271 DL_INCOMPLETE = 0x01
00272
00273 };
00274 mUINT8 _flags;
00275
00276 DECLARE_SLIST_CLASS( DEF_LIST, DU_NODE )
00277
00278 private:
00279 DEF_LIST(const DEF_LIST&);
00280 DEF_LIST& operator = (const DEF_LIST&);
00281
00282 public:
00283 DEF_LIST( DU_NODE *du, UINT flags )
00284 { _flags = flags;
00285 _u1._loop_stmt = NULL;
00286 SLIST::Init(du);
00287 }
00288 ~DEF_LIST(void)
00289 { _u1._loop_stmt = NULL;
00290 _flags = DL_NONE;
00291 }
00292 void Print (FILE *fp=stderr);
00293
00294
00295
00296
00297
00298 WN *Loop_stmt(void) const { return _u1._loop_stmt; }
00299 void Set_loop_stmt(WN *l) { _u1._loop_stmt = l; }
00300
00301 BB_LOOP *Loop_info(void) const { return _u1._loop_info; }
00302 void Set_loop_info(BB_LOOP *l) { _u1._loop_info = l; }
00303
00304
00305 BOOL Contains( const WN *wn );
00306
00307
00308 BOOL Incomplete( void ) const
00309 { return (_flags&DL_INCOMPLETE) != 0; }
00310 void Set_Incomplete( void )
00311 { if (this) _flags |= DL_INCOMPLETE; }
00312 void Reset_Incomplete( void )
00313 { _flags &= ~DL_INCOMPLETE; }
00314 };
00315
00316 class DEF_LIST_CONST_ITER : public SLIST_ITER {
00317 private:
00318 DEF_LIST_CONST_ITER(const DEF_LIST_CONST_ITER&);
00319 DEF_LIST_CONST_ITER& operator = (const DEF_LIST_CONST_ITER&);
00320
00321 DECLARE_SLIST_CONST_ITER_CLASS( DEF_LIST_CONST_ITER, DU_NODE, DEF_LIST )
00322 };
00323
00324 class DEF_LIST_ITER : public SLIST_ITER {
00325 private:
00326 DEF_LIST_ITER(const DEF_LIST_ITER&);
00327 DEF_LIST_ITER& operator = (const DEF_LIST_ITER&);
00328
00329 DECLARE_SLIST_ITER_CLASS( DEF_LIST_ITER, DU_NODE, DEF_LIST )
00330 };
00331
00332 class USE_LIST : public SLIST {
00333 enum ul_flags {
00334 UL_NONE = 0x00,
00335 UL_INCOMPLETE = 0x01
00336
00337 };
00338 mUINT8 _flags;
00339
00340 DECLARE_SLIST_CLASS( USE_LIST, DU_NODE )
00341
00342 private:
00343 USE_LIST(const USE_LIST&);
00344 USE_LIST& operator = (const USE_LIST&);
00345
00346 public:
00347 USE_LIST( DU_NODE *du, UINT flags )
00348 { _flags = flags;
00349 SLIST::Init(du);
00350 }
00351 ~USE_LIST(void)
00352 { _flags = UL_NONE; }
00353
00354 void Init( void )
00355 { _flags = UL_NONE; }
00356
00357
00358 BOOL Contains( const WN *wn );
00359
00360
00361 BOOL Incomplete( void ) const
00362 { return (_flags&UL_INCOMPLETE) != 0; }
00363 void Set_Incomplete( void )
00364 { _flags |= UL_INCOMPLETE; }
00365 void Reset_Incomplete( void )
00366 { _flags &= ~UL_INCOMPLETE; }
00367
00368 void Print (FILE *fp=stderr);
00369 };
00370
00371 class USE_LIST_ITER : public SLIST_ITER {
00372 private:
00373 USE_LIST_ITER(const USE_LIST_ITER&);
00374 USE_LIST_ITER& operator = (const USE_LIST_ITER&);
00375
00376 DECLARE_SLIST_ITER_CLASS( USE_LIST_ITER, DU_NODE, USE_LIST )
00377 };
00378
00379 class USE_LIST_CONST_ITER : public SLIST_ITER {
00380 private:
00381 USE_LIST_CONST_ITER(const USE_LIST_CONST_ITER&);
00382 USE_LIST_CONST_ITER& operator = (const USE_LIST_CONST_ITER&);
00383
00384 DECLARE_SLIST_CONST_ITER_CLASS( USE_LIST_CONST_ITER, DU_NODE, USE_LIST )
00385 };
00386
00387 class DU_MANAGER {
00388 private:
00389 MEM_POOL _mem_pool;
00390 WN_MAP _du_map;
00391 WN_MAP _ud_map;
00392 WN_MAP _val_restored_map;
00393 WN_MAP _bb_map;
00394 WN *_entry_wn;
00395 OPT_STAB *_opt_stab;
00396 ALIAS_MANAGER *_alias_mgr;
00397 OPT_PHASE _opt_phase;
00398 BOOL _du_built;
00399 BOOL _tracing;
00400
00401
00402 BB_SUMMARY_INFO *_bb_summary;
00403 IDTYPE _entry_bb;
00404 IDTYPE _exit_bb;
00405 INT _bb_cnt;
00406
00407
00408 BOOL Verify_add_wn_to_map( WN *wn, WN_MAP *wn_in_tree_map ) const;
00409 BOOL Verify_du_chains_in_tree( WN *wn, WN_MAP *wn_in_tree_map ) const;
00410 BOOL Verify_wn_in_tree(void) const;
00411 BOOL Verify_scalar_usage( WN *wn ) const;
00412
00413 DU_MANAGER(const DU_MANAGER&);
00414 DU_MANAGER& operator = (const DU_MANAGER&);
00415
00416 public:
00417 DU_MANAGER(void);
00418 ~DU_MANAGER(void) { WN_MAP_Delete(_du_map);
00419 WN_MAP_Delete(_ud_map);
00420 if (_val_restored_map != WN_MAP_UNDEFINED)
00421 WN_MAP_Delete(_val_restored_map);
00422 WN_MAP_Delete(_bb_map);
00423 OPT_POOL_Pop(&_mem_pool, DU_DUMP_FLAG);
00424 OPT_POOL_Delete(&_mem_pool, DU_DUMP_FLAG);
00425 _opt_stab = NULL;
00426 _entry_wn = NULL;
00427 }
00428
00429 void Set_alias_mgr(ALIAS_MANAGER *);
00430 void Set_Opt_Stab(OPT_STAB
00431 *os) { _opt_stab = os; }
00432 OPT_STAB *Opt_Stab(void)const { return _opt_stab; }
00433 void Set_Entry_Wn(WN *wn) { _entry_wn = wn; }
00434 WN *Entry_Wn(void) const { return _entry_wn; }
00435 void Set_opt_phase(
00436 OPT_PHASE p){ _opt_phase = p; }
00437 OPT_PHASE Opt_phase(void) const{ return _opt_phase; }
00438
00439
00440 void Set_du_built(void) { _du_built = TRUE; }
00441 BOOL Du_built(void) const { return _du_built; }
00442
00443 void Set_Tracing(BOOL trc){ _tracing = trc; }
00444 BOOL Tracing(void) const { return _tracing; }
00445
00446 void Print_Ud(WN *use,
00447 FILE *fp=stderr);
00448 void Print_Du(WN *def,
00449 FILE *fp=stderr);
00450
00451 #ifdef Is_True_On
00452 void Print_Du_Info(FILE *fp=stderr);
00453 #endif
00454
00455 void Add_Def_Use( WN *def, WN *use );
00456 void Delete_Def_Use( WN *def, WN *use );
00457
00458
00459
00460 void Ud_Add_Def(WN *use, WN *def);
00461 void Du_Add_Use(WN *def, WN *use);
00462 void Ud_Delete_Def(WN *use, WN *def);
00463 void Du_Delete_Use(WN *def, WN *use);
00464
00465 void Ud_Put_Def(WN *use,
00466 DEF_LIST *deflst) const { WN_MAP_Set(_ud_map, use,
00467 deflst); }
00468 void Du_Put_Use(WN *def,
00469 USE_LIST *uselst) const { WN_MAP_Set(_du_map, def,
00470 uselst); }
00471 DEF_LIST *Ud_Get_Def(WN *use) const { return (DEF_LIST *)
00472 WN_MAP_Get(_ud_map,use); }
00473 USE_LIST *Du_Get_Use(WN *def) const { return (USE_LIST *)
00474 WN_MAP_Get(_du_map,def); }
00475 void Remove_Use_From_System(WN *use);
00476 void Remove_Def_From_System(WN *def);
00477
00478 void Create_Def_List(WN *use);
00479 void Create_Use_List(WN *def);
00480
00481 void Du_Set_Incomplete( WN *def );
00482
00483 void Set_value_restored(WN *def);
00484
00485 BOOL Is_value_restored(WN *def) { return (_val_restored_map != WN_MAP_UNDEFINED) &&
00486 WN_MAP32_Get(_val_restored_map, def); }
00487
00488 BOOL Verify(void);
00489
00490
00491
00492
00493
00494 void Alloc_IPA_summary(CFG *cfg);
00495 void Set_bb_id(WN *wn, INT bbid) { WN_MAP32_Set(_bb_map, wn, bbid); }
00496 void Collect_BB_id(WN_MAP, WN *);
00497 void Collect_CFG(CFG *);
00498
00499 #ifdef Is_True_On
00500 void Check_bb_id(IDTYPE bb_id) { FmtAssert( bb_id < _bb_cnt,
00501 ("DU_MANAGER: invalid BB id")); }
00502 #else
00503 void Check_bb_id(IDTYPE) {}
00504 #endif
00505
00506
00507 IDTYPE Get_bb_id(WN *wn) { return WN_MAP32_Get(_bb_map, wn); }
00508 IDTYPE Get_entry_bb() { return _entry_bb; }
00509 IDTYPE Get_exit_bb() { return _exit_bb; }
00510 IDTYPE *Get_succ_vec(IDTYPE);
00511 IDTYPE Get_cd(IDTYPE);
00512 WN *Get_first_stmt(IDTYPE);
00513 WN *Get_last_stmt(IDTYPE);
00514 BOOL CD_is_fall_thru(IDTYPE);
00515 BOOL CD_is_br_taken(IDTYPE);
00516 BOOL Dominate(IDTYPE, IDTYPE);
00517 };
00518
00519 extern "C" DU_MANAGER* Create_Du_Manager(MEM_POOL *);
00520 extern "C" void Delete_Du_Manager(DU_MANAGER *, MEM_POOL *);
00521 extern "C" BOOL Du_Built(DU_MANAGER *);
00522
00523 #endif // opt_emit_INCLUDED