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 ipl_summarize_util_INCLUDED
00054 #define ipl_summarize_util_INCLUDED
00055
00056 #include <vector>
00057
00058 #ifndef FB_WHIRL_INCLUDED
00059 #include "fb_whirl.h"
00060 #endif
00061
00062 #if (!defined(_STANDALONE_INLINER) && !defined(_LIGHTWEIGHT_INLINER))
00063
00064 INT32 IPL_get_callsite_id(WN* w);
00065 #endif
00066
00067
00068 INT IPL_deepest_depth(WN* w);
00069
00070
00071
00072
00073 WN*
00074 LNO_Common_Loop(WN* wn1, WN* wn2);
00075
00076
00077 extern
00078 WN* IPL_get_stmt_scf(WN* av);
00079
00080
00081 struct IPL_ST_INFO
00082 {
00083 UINT32 summary_symbol_idx;
00084 mBOOL addr_passed;
00085 mBOOL addr_saved;
00086 mBOOL addr_saved_reset;
00087
00088
00089 IPL_ST_INFO () :
00090 summary_symbol_idx ((UINT32) -1),
00091 addr_passed (FALSE),
00092 addr_saved (FALSE),
00093 addr_saved_reset (FALSE) {}
00094 };
00095
00096 typedef vector<vector<IPL_ST_INFO> > AUX_SYMBOL_INFO;
00097 extern AUX_SYMBOL_INFO Aux_Symbol_Info;
00098
00099 struct AUX_SYMBOL_ACCESS
00100 {
00101 IPL_ST_INFO& operator[] (ST_IDX st_idx) const {
00102 Is_True (ST_IDX_index (st_idx) <
00103 Aux_Symbol_Info[ST_IDX_level (st_idx)].size (),
00104 ("array out of bound for Aux_Symbol"));
00105 return Aux_Symbol_Info[ST_IDX_level (st_idx)][ST_IDX_index (st_idx)];
00106 }
00107
00108 IPL_ST_INFO& operator() (const ST* st) const {
00109 ST_IDX st_idx = ST_st_idx (st);
00110 Is_True (ST_IDX_index (st_idx) <
00111 Aux_Symbol_Info[ST_IDX_level (st_idx)].size (),
00112 ("array out of bound for Aux_Symbol"));
00113 return Aux_Symbol_Info[ST_IDX_level (st_idx)][ST_IDX_index (st_idx)];
00114 }
00115
00116 };
00117 extern AUX_SYMBOL_ACCESS Aux_Symbol;
00118
00119 extern void
00120 Init_Aux_Symbol_Info (SYMTAB_IDX level);
00121
00122 extern void
00123 Set_lang (SUMMARY_PROCEDURE *proc);
00124
00125 extern FLD_HANDLE
00126 get_field_entry_nme (TY_IDX t, STR_IDX nme);
00127
00128 extern BOOL
00129 Fortran_string_compare (char *pragma, char *func);
00130
00131 extern WN *
00132 get_mod_target (WN *wn);
00133
00134 extern void
00135 Inc_modcount (SUMMARY_GLOBAL *global, SUMMARY_SYMBOL *symbol, const WN *rhs);
00136
00137 extern BOOL
00138 Is_Value_Restored (WN *w, WN *orig_w, WN_MAP wn_to_cr_map);
00139
00140 void
00141 Init_cdg (MEM_POOL *m);
00142
00143 extern INT
00144 Get_stmt_id (void);
00145
00146 extern void
00147 Reset_cd_and_stmt (WN_MAP Summary_Map, INT saved_cd_idx, INT saved_stmt_id);
00148
00149 extern SUMMARY_CONTROL_DEPENDENCE *
00150 Get_new_cd (void);
00151
00152 extern SUMMARY_CONTROL_DEPENDENCE *
00153 Get_cd_by_idx (INT idx);
00154
00155 extern INT
00156 Get_cd_idx (SUMMARY_CONTROL_DEPENDENCE *cd);
00157
00158 extern void
00159 Inc_cd_call_count (INT idx, BOOL branch);
00160
00161
00162 extern INT
00163 Get_cd_call_count (INT idx);
00164
00165 extern INT
00166 Get_cd_call_count (INT idx, BOOL branch);
00167
00168 extern void
00169 Set_cd_head_of_chain (INT idx);
00170
00171 extern void
00172 Set_cd_ctrl_index (SUMMARY_CONTROL_DEPENDENCE *cd, INT index);
00173
00174 extern INT
00175 Get_cd_real_idx (SUMMARY_CONTROL_DEPENDENCE *cd);
00176
00177 extern SUMMARY_STMT *
00178 Get_new_stmt (INT idx, BOOL branch, WN *w);
00179
00180 extern SUMMARY_STMT *
00181 Get_last_stmt (INT idx, BOOL branch) ;
00182
00183 extern SUMMARY_CONTROL_DEPENDENCE *
00184 Get_next_cd_chain (void);
00185
00186 extern SUMMARY_CONTROL_DEPENDENCE *
00187 Get_next_cd (void);
00188
00189 extern SUMMARY_STMT *
00190 Get_summary_stmts (SUMMARY_CONTROL_DEPENDENCE *cd, BOOL branch);
00191
00192
00193 extern SUMMARY_CONTROL_DEPENDENCE *
00194 Get_controlling_stmt (WN *stmt_node);
00195
00196
00197
00198
00199 extern SUMMARY_STMT *
00200 Search_for_summary_stmt (WN *stmt_node, BOOL &branch, INT &stmt_idx);
00201
00202
00203
00204
00205 extern SUMMARY_CONTROL_DEPENDENCE *
00206 Search_for_own_cd (WN *cond_stmt);
00207
00208
00209
00210 extern WN *
00211 Get_stmt_node (SUMMARY_CONTROL_DEPENDENCE *cd, BOOL branch, INT stmt_idx);
00212
00213
00214 extern INT
00215 Get_max_cd_idx();
00216
00217 extern void
00218 Fix_phi_node_ctrl_dep_index (SUMMARY_PHI *phi, INT num);
00219
00220
00221
00222 enum SUMMARY_TYPE {
00223 SUM_VALUE = 0,
00224 SUM_EXPR = 1,
00225 SUM_PHI = 2,
00226 SUM_CHI = 3
00227 };
00228
00229 class SUMMARY_ENTRY_CACHE
00230 {
00231 private:
00232 struct hash_node {
00233 struct hash_node *next;
00234 SUMMARY_TYPE _type : 8;
00235 INT _idx : 24;
00236 } *table[0x80];
00237
00238 MEM_POOL *mem;
00239
00240 INT hash (INT64 key) const {
00241 return ((UINT64) key) & ((UINT64) 0x7f);
00242 }
00243
00244 public:
00245
00246 SUMMARY_ENTRY_CACHE (MEM_POOL *m) {
00247 mem = m;
00248 BZERO (table, sizeof(table));
00249 }
00250
00251 void Insert (SUMMARY_TYPE type, INT idx) {
00252 struct hash_node *p = CXX_NEW (struct hash_node, mem);
00253 p->_type = type;
00254 p->_idx = idx;
00255
00256 INT hash_value;
00257
00258 switch (type) {
00259 case SUM_VALUE:
00260 hash_value =
00261 hash (Summary->Get_value (idx)->Get_int_const_value ());
00262 break;
00263
00264 case SUM_EXPR:
00265 hash_value =
00266 hash (Summary->Get_expr (idx)->Get_const_value ());
00267 break;
00268
00269 case SUM_PHI: {
00270 SUMMARY_PHI *phi = Summary->Get_phi (idx);
00271 hash_value =
00272 hash (phi->Get_node_index (0) + phi->Get_node_index (1));
00273 }
00274 break;
00275
00276 case SUM_CHI:
00277 hash_value =
00278 hash (Summary->Get_chi (idx)->Get_node_index ());
00279 break;
00280 }
00281
00282 p->next = table[hash_value];
00283 table[hash_value] = p;
00284 }
00285
00286 INT Lookup (SUMMARY_TYPE type, void *node) const;
00287
00288 };
00289
00290 extern SUMMARY_ENTRY_CACHE *entry_cache;
00291
00292 extern BOOL IsStidToReturnPreg(WN *wn, WN* entry_point);
00293
00294 extern INT GetChildIndex(WN *parent, WN*child);
00295
00296 extern TY *GetArgType(TYLIST*, INT);
00297
00298 extern void
00299 Count_tree_size (FEEDBACK& fb, WN *w, INT32 &bbs, INT32 &stmts, FB_FREQ& cycles, FB_FREQ& freq_count);
00300
00301
00302 extern void
00303 Count_tree_size_tuning (FEEDBACK& fb, WN *wn, INT32 &bbs, INT32 &stmts, FB_FREQ& cycles, FB_FREQ &freq_count, UINT16 &WNs, FB_FREQ &cycle_tuning );
00304
00305
00306
00307 extern BOOL DoPreopt;
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320 template <class X>
00321 struct ptr_hash {
00322 size_t operator() (const X* s) const {
00323 return reinterpret_cast<size_t> (s);
00324 }
00325 };
00326
00327
00328 typedef hash_map<CODEREP*, INT, ptr_hash<CODEREP>, std::equal_to<CODEREP*>,
00329 mempool_allocator<CODEREP*> > CHI_CR_TO_INT_MAP;
00330
00331 extern CHI_CR_TO_INT_MAP* Chi_To_Idx_Map;
00332 typedef vector<CODEREP*, mempool_allocator<CODEREP*> > CHI_CR_ARRAY;
00333 extern CHI_CR_ARRAY* Hashed_Chis;
00334 extern INT Num_Chis_On_PU_Start;
00335
00336 typedef hash_map<PHI_NODE*, INT, ptr_hash<PHI_NODE>, std::equal_to<PHI_NODE*>,
00337 mempool_allocator<PHI_NODE*> > PHI_NODE_TO_INT_MAP;
00338 extern PHI_NODE_TO_INT_MAP* Phi_To_Idx_Map;
00339 typedef vector<PHI_NODE*, mempool_allocator<PHI_NODE*> > PHI_NODE_ARRAY;
00340 extern PHI_NODE_ARRAY* Hashed_Phis;
00341 extern INT Num_Phis_On_PU_Start;
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 class SUMMARY_CHECK_POINT
00352 {
00353 private:
00354
00355 INT _value_idx;
00356 INT _expr_idx;
00357 INT _phi_idx;
00358 INT _hashed_phi_idx;
00359 INT _chi_idx;
00360 INT _hashed_chi_idx;
00361 INT _cd_idx;
00362 INT _stmt_id;
00363
00364 public:
00365
00366 SUMMARY_CHECK_POINT (const void *s) {
00367 const SUMMARIZE<IPL> *sum = (const SUMMARIZE<IPL> *) s;
00368 _value_idx = sum->Get_value_idx ();
00369 _expr_idx = sum->Get_expr_idx ();
00370 if (DoPreopt) {
00371 _phi_idx = sum->Get_phi_idx ();
00372 _hashed_phi_idx = Hashed_Phis->size() - 1;
00373 _chi_idx = sum->Get_chi_idx ();
00374 _hashed_chi_idx = Hashed_Chis->size() - 1;
00375 _cd_idx = Get_max_cd_idx ();
00376 _stmt_id = Get_stmt_id ();
00377 }
00378 }
00379
00380 INT value_idx () const { return _value_idx; }
00381 INT expr_idx () const { return _expr_idx; }
00382 INT phi_idx () const { return _phi_idx; }
00383 INT hashed_phi_idx () const { return _hashed_phi_idx; }
00384 INT chi_idx () const { return _chi_idx; }
00385 INT hashed_chi_idx () const { return _hashed_chi_idx; }
00386 INT cd_idx () const { return _cd_idx; }
00387 INT stmt_id () const { return _stmt_id; }
00388
00389 };
00390
00391
00392 #endif