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 #ifndef opt_lmv_INCLUDED
00030 #define opt_lmv_INCLUDED
00031
00032 #include "defs.h"
00033 #include "opt_defs.h"
00034 #include "cxx_base.h"
00035 #include "id_map.h"
00036 #include "bb_node_set.h"
00037 #include "opt_htable.h"
00038 #include "opt_lmv_helper.h"
00039
00040 class LMV_HEURISTIC;
00041 class LMV_CANDIDATE;
00042
00043 typedef mempool_allocator<LMV_CANDIDATE*> LMV_CAND_ALLOC;
00044 typedef std::vector<LMV_CANDIDATE*, LMV_CAND_ALLOC> LMV_CAND_VECT;
00045 typedef LMV_CAND_VECT::iterator LMV_CAND_VECT_ITER;
00046
00047 class LOOP_MULTIVER : public MEM_POOL_Constructor {
00048 friend class LMV_HEURISTIC;
00049 friend class CFG;
00050
00051 private:
00052 MEM_POOL _mp;
00053 MEM_POOL* _local_mp;
00054
00055 BS* _visited_cr;
00056
00057 INT _blk_num;
00058 INT _stmt_num;
00059 INT _expr_num;
00060 INT _ld_num, _st_num;
00061 BOOL _tracing;
00062
00063 COMP_UNIT* _comp_unit;
00064 OPT_STAB* _opt_stab;
00065 CODEMAP* _htable;
00066 CFG* _cfg;
00067 const ALIAS_RULE* _alias_rule;
00068
00069 LMV_CAND_VECT _candidates;
00070
00071
00072
00073 BOOL _agg_mode;
00074
00075
00076
00077 static const float _dup_loop_freq_ratio;
00078
00079 INT Estimate_latency (const CODEREP*, BOOL lhs);
00080 void Estimate_stmt_weight (const STMTREP* stmt);
00081
00082
00083
00084 inline BOOL Not_applicable (BB_LOOP* loop);
00085
00086
00087 BOOL Pass_initial_screen (const BB_LOOP* loop);
00088
00089 void Idenitfy_candidate (BB_LOOP* loop);
00090 void Identify_candidates (void);
00091
00092
00093 void Sort_candidates (void);
00094 void Identify_candidate (BB_LOOP* loop);
00095 void Dup_init (const BB_LOOP* loop);
00096 BB_NODE* Dup_block (const BB_NODE* src);
00097 void Duplicate_loop_blocks (void);
00098 void Connect_pred_succ (BB_NODE*, BB_NODE*);
00099 void Connect_pred_succ_via_goto (BB_NODE*, BB_NODE*);
00100 void Prev_next_lnk_Insert_before (BB_NODE*, BB_NODE*);
00101 void Update_label (void);
00102 inline void Connect_prev_next(BB_NODE* p, BB_NODE* n);
00103 void Layout (void);
00104 void Gen_precondioning_br (CODEREP* cond, BOOL falsebr);
00105 void Connect_dup_blocks (void);
00106 void Clone_BB_LOOP (void);
00107 CODEREP* Gen_add_expr (CODEREP* ptr, INT ofst);
00108 CODEREP* Gen_test_cond (LMV_CANDIDATE*);
00109 void Gen_precondioning_stuff (CODEREP*);
00110 void Annotate_alias_group (LMV_CANDIDATE*);
00111 void Annotate_alias_group_helper (const MEM_ACCESS_VECT&, LMV_ALIAS_GROUP);
00112 void Perform_transformation (LMV_CANDIDATE*);
00113
00114
00115
00116
00117 BOOL Exceed_threshold (void);
00118 BOOL Evaluate_stmt (const STMTREP* stmt);
00119 void Evaluate_cr_rec (const CODEREP* cr, BOOL is_read);
00120
00121 public:
00122 LOOP_MULTIVER (COMP_UNIT*);
00123 ~LOOP_MULTIVER (void) {};
00124
00125 void Set_aggressive_mode (void) { _agg_mode = TRUE; }
00126 void Reset_aggressive_mode (void) { _agg_mode = FALSE; }
00127 BOOL Is_aggressive_mode (void) { return _agg_mode; }
00128
00129 void Perform_loop_multiversioning (void);
00130 };
00131
00132
00133
00134
00135
00136
00137 class LMV_CFG_ADAPTOR {
00138 private:
00139
00140 MEM_POOL* _mp;
00141 CFG* _cfg;
00142 BB_LOOP* _src_loop;
00143 BB_LOOP* _cloned_loop;
00144
00145 std::map<IDTYPE, IDTYPE> _old_to_new_blk;
00146 std::map<INT, INT> _old_to_new_lab;
00147 BB_NODE* _new_header;
00148 BB_NODE* _new_preheader;
00149 BB_NODE* _new_merge;
00150
00151
00152
00153
00154
00155
00156 BB_NODE* _head, *_tail;
00157
00158 BB_NODE_SET* _dup_loop_body;
00159
00160
00161 CODEREP* _predicate;
00162
00163 BOOL _trace;
00164
00165 public:
00166 LMV_CFG_ADAPTOR (MEM_POOL* mp, CFG* cfg, BOOL trace,
00167 BB_LOOP* src, CODEREP* predicate)
00168 :_mp(mp), _src_loop(src), _cfg(cfg) {
00169
00170 _cloned_loop = NULL;
00171 _new_header = _new_preheader = _new_merge = NULL;
00172 _dup_loop_body =
00173 CXX_NEW (BB_NODE_SET((INT)(_cfg->Last_bb()->Id()*1.5),
00174 _cfg, _mp, BBNS_EMPTY), _mp);
00175 _trace = trace;
00176 _predicate = predicate;
00177 _head = _tail = NULL;
00178 }
00179
00180 BB_LOOP* Src_loop (void) const { return _src_loop; }
00181 BB_LOOP* Cloned_loop (void) const { return _cloned_loop; }
00182 void Set_cloned_loop (BB_LOOP* l) { _cloned_loop = l;}
00183
00184 BB_NODE* Cloned_loop_preheader (void) const
00185 { return _new_preheader; }
00186 void Set_cloned_loop_preheader (BB_NODE* phdr)
00187 { _new_preheader = phdr; }
00188
00189 BB_NODE* Cloned_loop_merge (void) const
00190 { return _new_merge; }
00191 void Set_cloned_loop_merge (BB_NODE* merge)
00192 { _new_merge = merge; }
00193
00194 void Map_cloned_bb (const BB_NODE* src, const BB_NODE* clone)
00195 { _old_to_new_blk[src->Id()] = clone->Id(); }
00196
00197 BB_NODE* Get_cloned_bb (const BB_NODE* src) const {
00198 std::map<IDTYPE, IDTYPE>::const_iterator iter;
00199 iter = _old_to_new_blk.find (src->Id());
00200 return iter != _old_to_new_blk.end() ?
00201 _cfg->Get_bb ((*iter).second) : NULL;
00202 }
00203
00204 void Map_cloned_label (INT src, INT clone)
00205 { _old_to_new_lab[src] = clone; }
00206
00207 INT Get_cloned_label (INT src) const {
00208 std::map<INT,INT>::const_iterator iter;
00209 iter = _old_to_new_lab.find (src);
00210 return iter != _old_to_new_lab.end() ? (*iter).second : 0;
00211 }
00212
00213 BB_NODE* Cloned_loop_header (void) {
00214 return _new_header ? _new_header :
00215 _new_header = Get_cloned_bb (_src_loop->Header());
00216 }
00217
00218 BB_NODE* Pred_next_lst_header (void) const { return _head; }
00219 BB_NODE* Pred_next_lst_tail (void) const { return _tail; }
00220 void Set_pred_next_lst_header (BB_NODE* h) { _head = h; }
00221 void Set_pred_next_lst_tail (BB_NODE* t) { _tail = t; }
00222
00223 CODEREP* Predicate (void) const { return _predicate; }
00224
00225 BOOL Trace (void) const { return _trace; }
00226
00227 void Print (FILE* f) const;
00228 };
00229
00230 #endif