GSAControlRangeDict.ccGo to the documentation of this file.00001
00002
00003
00004
00005 #ifdef POLARIS_GNU_PRAGMAS
00006 #pragma implementation "GSAControlRangeData.h"
00007 #pragma implementation "GSAControlRangeDict.h"
00008 #endif
00009
00010 #include "../Program.h"
00011 #include "../Statement/Statement.h"
00012 #include "../Symbol/Symbol.h"
00013 #include "../Symtab.h"
00014 #include "../DominatorWorkSpace.h"
00015 #include "../Expression/Expression.h"
00016 #include "../Directive/Assertion.h"
00017 #include "../utilities/switches_util.h"
00018 #include "../utilities/expression_util.h"
00019 #include "../utilities/dominator_util.h"
00020 #include "../Array.h"
00021 #include "../IntSet.h"
00022 #include "../Timer.h"
00023 #include "../p-assert.h"
00024
00025 #include "GSAControlRangeDict.h"
00026 #include "GSAControlRangeData.h"
00027 #include "RangeExpr.h"
00028 #include "range_util.h"
00029 #include "range_dict_util.h"
00030
00031
00032
00033 static int _debug_level = 0;
00034
00035
00036
00037
00038
00039 void
00040 GSAControlRangeDict::_init_stmt_ranges(ProgramUnit &pgm)
00041 {
00042 Iterator<Statement> iter = pgm.stmts().iterator();
00043
00044 for ( ; iter.valid(); ++iter) {
00045 GSAControlRangeData *data = new GSAControlRangeData(iter.current(),
00046 *this,
00047 _range_set);
00048
00049 _stmt_ranges.ins(iter.current(), data);
00050 }
00051 }
00052
00053
00054
00055
00056
00057
00058 void
00059 GSAControlRangeDict::_init_idom(ProgramUnit &pgm)
00060 {
00061 Array<Statement *> pgm_stmt_array(pgm.stmts().entries());
00062 unsigned int dominator_pass = create_pass_tag();
00063 Dominator(pgm, pgm_stmt_array,
00064 new DominatorWorkSpace(dominator_pass));
00065 KeyIterator<Statement,GSAControlRangeData> data_iter = _stmt_ranges;
00066 for ( ; data_iter.valid(); ++data_iter) {
00067 const Statement &stmt = data_iter.current_key();
00068 GSAControlRangeData &data = data_iter.current_data();
00069 data._idom_ref = 0;
00070 const DominatorWorkSpace * stmt_ws =
00071 (const DominatorWorkSpace *)
00072 stmt.work_stack().top_ref(dominator_pass);
00073 if (stmt_ws) {
00074 const Statement *idom = stmt_ws->idom;
00075 if (idom)
00076 data._idom_ref = &_stmt_ranges[*idom];
00077 }
00078 }
00079 pgm.clean_workspace(dominator_pass);
00080 }
00081
00082
00083
00084
00085 GSAControlRangeDict::GSAControlRangeDict(ProgramUnit &pgm, int debug GIV(0))
00086 : RangeDict(pgm.symtab())
00087 {
00088 p_assert(pgm.gsa_valid(),
00089 "Non-GSA ProgramUnit passed to GSAControlRangeDict constructor");
00090
00091 _pgm_ref = &pgm;
00092
00093 if (pgm.stmts().entries() == 0)
00094 return;
00095
00096 _debug_level = debug;
00097 Timer tot_timer;
00098 Timer timer;
00099
00100 _init_stmt_ranges(pgm);
00101
00102 if (_debug_level > 0) {
00103 cout << "! Data structure creation: " << timer << endl;
00104 timer.reset();
00105 }
00106
00107 _init_idom(pgm);
00108
00109 if (_debug_level > 0) {
00110 cout << "! Computing immediate dominators: " << timer << endl;
00111 timer.reset();
00112 }
00113
00114 if (_debug_level >= 10)
00115 print(cout);
00116
00117 if (_debug_level > 0) {
00118 cout << "! Total time: " << tot_timer << endl;
00119 cout << "! Number of statements: " << pgm.stmts().entries() << endl;
00120 }
00121 }
00122
00123
00124
00125
00126 GSAControlRangeDict::~GSAControlRangeDict()
00127 {
00128 }
00129
00130
00131
00132
00133 void
00134 GSAControlRangeDict::icdom_touch()
00135 {
00136 KeyIterator<Statement, GSAControlRangeData> iter = _stmt_ranges;
00137
00138 for ( ; iter.valid(); ++iter)
00139 iter.current_data().icdom_ref();
00140 }
00141
00142
00143
00144
00145 void
00146 GSAControlRangeDict::touch()
00147 {
00148 KeyIterator<Statement, GSAControlRangeData> data_iter = _stmt_ranges;
00149
00150 for ( ; data_iter.valid(); ++data_iter) {
00151 Statement &stmt = data_iter.current_key();
00152
00153 if (&stmt == &representative_stmt(stmt)) {
00154 GSAControlRangeData &data = data_iter.current_data();
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 for (KeyIterator<Symbol,DefLoc> var_iter =
00165 _pgm_ref->gsa_deflocs_guarded().iterator();
00166 var_iter.valid(); ++var_iter) {
00167 const DefLoc & curr_def = var_iter.current_data();
00168 if (curr_def.stmt_valid()) {
00169 const Symbol & var = var_iter.current_key();
00170 if (var.type().data_type() == INTEGER_TYPE && ! var.is_array())
00171 data.get_range_ref(var);
00172 }
00173 }
00174 }
00175 }
00176 }
00177
00178
00179
00180
00181 void
00182 GSAControlRangeDict::stats(float &avg_num_icdoms, int &max_num_icdoms,
00183 int &tot_num_icdoms,
00184 float &avg_num_ranges, int &max_num_ranges,
00185 int &tot_num_ranges)
00186 {
00187 touch();
00188
00189 max_num_icdoms = 0;
00190 tot_num_icdoms = 0;
00191 max_num_ranges = 0;
00192 tot_num_ranges = num_computed_ranges();
00193 clear_ranges();
00194
00195 int sum_num_icdoms = 0;
00196 int sum_num_ranges = 0;
00197
00198 KeyIterator<Statement, GSAControlRangeData> data_iter = _stmt_ranges;
00199
00200 for ( ; data_iter.valid(); ++data_iter) {
00201 Statement &stmt = data_iter.current_key();
00202
00203 if (&stmt == &representative_stmt(stmt)) {
00204 GSAControlRangeData &data = data_iter.current_data();
00205
00206 for (KeyIterator<Symbol,DefLoc> var_iter =
00207 _pgm_ref->gsa_deflocs_guarded().iterator();
00208 var_iter.valid(); ++var_iter) {
00209 const DefLoc & curr_def = var_iter.current_data();
00210 if (curr_def.stmt_valid()) {
00211 const Symbol &var = var_iter.current_key();
00212
00213 if (var.type().data_type() == INTEGER_TYPE
00214 && ! var.is_array()) {
00215
00216 int num_ranges = 0;
00217 int num_icdoms = 0;
00218 data.get_range_ref(var);
00219 GSAControlRangeData *cdom = data.icdom_ref();
00220
00221 if (cdom)
00222 ++tot_num_icdoms;
00223
00224 while (cdom) {
00225 ++num_icdoms;
00226 num_ranges += cdom->num_computed_ranges();
00227 cdom = cdom->icdom_ref();
00228 }
00229
00230 sum_num_icdoms += num_icdoms;
00231 max_num_icdoms = max(max_num_icdoms, num_icdoms);
00232
00233 sum_num_ranges += num_ranges;
00234 max_num_ranges = max(max_num_ranges, num_ranges);
00235
00236
00237
00238
00239 cdom = &data;
00240
00241 while (cdom) {
00242 GSAControlRangeData *next = cdom->icdom_ref();
00243 cdom->clear_ranges();
00244 cdom = next;
00245 }
00246
00247 _range_set.clear();
00248 }
00249 }
00250 }
00251 }
00252 }
00253
00254 if (tot_num_ranges > 0) {
00255 avg_num_icdoms = (float) sum_num_icdoms / (float) tot_num_ranges;
00256 avg_num_ranges = (float) sum_num_ranges / (float) tot_num_ranges;
00257 }
00258 else {
00259 avg_num_icdoms = 0;
00260 tot_num_ranges = 0;
00261 }
00262 }
00263
00264
00265
00266
00267 int
00268 GSAControlRangeDict::num_computed_ranges() const
00269 {
00270 int num_ranges = 0;
00271 KeyIterator<Statement, GSAControlRangeData> iter = _stmt_ranges;
00272
00273 for ( ; iter.valid(); ++iter)
00274 num_ranges += iter.current_data().num_computed_ranges();
00275
00276 return num_ranges;
00277 }
00278
00279
00280
00281
00282 const Statement &
00283 GSAControlRangeDict::representative_stmt(const Statement &stmt) const
00284 {
00285 const Statement *rep = 0;
00286
00287 GSAControlRangeData *data = CASTAWAY(GSAControlRangeData *)(_stmt_ranges.find_ref(stmt));
00288
00289 if (data) {
00290 rep = data->icdom_succ_ref();
00291
00292 if (! rep)
00293 rep = _pgm_ref->stmts().first_ref();
00294 }
00295
00296 p_assert(rep, "Couldn't determine a representative for the given stmt.");
00297
00298 return *rep;
00299 }
00300
00301
00302
00303
00304 RefSet<Symbol> *
00305 GSAControlRangeDict::range_vars(const Statement &stmt) const
00306 {
00307 const GSAControlRangeData *data = _stmt_ranges.find_ref(stmt);
00308
00309 if (data)
00310 return (CASTAWAY(GSAControlRangeData *)data)->range_vars();
00311
00312 return new RefSet<Symbol>;
00313 }
00314
00315
00316
00317
00318 void
00319 GSAControlRangeDict::_set_range(const Symbol & ,
00320 const Statement & , Expression * )
00321 {
00322 p_abort("Ranges cannot be modified in a GSAControlRangeDict object.");
00323 }
00324
00325
00326
00327
00328
00329 void
00330 GSAControlRangeDict::_del_range(const Symbol & ,
00331 const Statement & )
00332 {
00333 p_abort("Ranges cannot be modified in a GSAControlRangeDict object.");
00334 }
00335
00336
00337
00338
00339
00340 const Expression *
00341 GSAControlRangeDict::_get_range_ref(const Symbol &var, const Statement &stmt)
00342 {
00343 GSAControlRangeData *data = CASTAWAY(GSAControlRangeData *)(_stmt_ranges.find_ref(stmt));
00344
00345 if (data)
00346 return data->get_range_ref(var);
00347
00348 return 0;
00349 }
00350
00351
00352
00353
00354 void
00355 GSAControlRangeDict::clear()
00356 {
00357 KeyIterator<Statement, GSAControlRangeData> iter = _stmt_ranges;
00358
00359 for ( ; iter.valid(); ++iter)
00360 iter.current_data().clear();
00361
00362 _range_set.clear();
00363 }
00364
00365
00366
00367
00368 void
00369 GSAControlRangeDict::clear_ranges()
00370 {
00371 KeyIterator<Statement, GSAControlRangeData> iter = _stmt_ranges;
00372
00373 for ( ; iter.valid(); ++iter)
00374 iter.current_data().clear_ranges();
00375
00376 _range_set.clear();
00377 }
00378
00379
00380
00381
00382 void
00383 GSAControlRangeDict::print(ostream & o) const
00384 {
00385 KeyIterator<Statement, GSAControlRangeData> iter = _stmt_ranges;
00386
00387 for ( ; iter.valid(); ++iter) {
00388 o << iter.current_key().tag() << ": ";
00389 iter.current_key().print_debug(o, 0);
00390 o << endl;
00391 o << " " << iter.current_data() << endl;
00392 }
00393 }
00394
00395
00396
00397
00398 void
00399 GSAControlRangeDict::pretty_print(ostream & o, const Statement &stmt) const
00400 {
00401 GSAControlRangeData *data = CASTAWAY(GSAControlRangeData *)(_stmt_ranges.find_ref(stmt));
00402
00403 if (! data)
00404 o << "{}";
00405 else {
00406 RefSet<Symbol> *vars = data->range_vars();
00407 RefList<Symbol> sorted_keys;
00408 Iterator<Symbol> c_iter = *vars;
00409
00410 for ( ; c_iter.valid(); ++c_iter)
00411 sorted_keys.ins_last(c_iter.current());
00412
00413 delete vars;
00414 sort_sym_list(sorted_keys);
00415 Iterator<Symbol> key_iter = sorted_keys;
00416 bool first = true;
00417
00418 o << "{";
00419
00420 for ( ; key_iter.valid(); ++key_iter) {
00421 if (! first)
00422 o << ", ";
00423 else
00424 first = false;
00425
00426 const Symbol &var = key_iter.current();
00427 const Expression &value = *data->get_range_ref(var);
00428 pretty_print_range(o, value, var);
00429 }
00430
00431 o << "}";
00432 }
00433 }
00434
00435
00436
00437
00438 Listable *
00439 GSAControlRangeDict::listable_clone(void) const
00440 {
00441 p_abort("GSAControlRangeDicts cannot be duplicated.");
00442 return 0;
00443 }
00444
00445
00446
00447
00448
00449 int
00450 GSAControlRangeDict::structures_OK() const
00451 {
00452 return (_stmt_ranges.structures_OK());
00453 }
|