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 #ifdef USE_PCH
00061 #include "opt_pch.h"
00062 #endif // USE_PCH
00063 #pragma hdrstop
00064
00065
00066 #include "opt_etable.h"
00067 #include "opt_dfs.h"
00068 #include "tracing.h"
00069 #include "opt_config.h"
00070
00071
00072 #if Is_True_On
00073 #include "opt_htable.h"
00074 #endif
00075
00076
00077 template <class PRE_DIRECTION> class CANT_BE_AVAIL_SEARCH;
00078
00079 class USER_AVAIL_SEARCH {
00080 private:
00081 static BOOL _tracing;
00082 static EXP_WORKLST *_worklst;
00083
00084 EXP_WORKLST *Worklst(void) const { return _worklst; }
00085
00086 EXP_PHI *const _cur_node;
00087
00088 public:
00089 static void Set_tracing(const BOOL tracing) { _tracing = tracing; }
00090 static void Set_worklst(EXP_WORKLST *const worklst)
00091 { _worklst = worklst; }
00092
00093 BOOL Tracing(void) const { return _tracing; }
00094
00095 typedef EXP_PHI node_type;
00096 typedef USE_LIST_ENTRY adj_list_type;
00097 typedef USE_LIST_ITER adj_list_iter_type;
00098 typedef EXP_PHI_OCC_ITER node_iterator;
00099
00100 USER_AVAIL_SEARCH(node_type *const cur_node) : _cur_node(cur_node)
00101 {
00102 Is_True(Worklst() != NULL,
00103 ("USER_AVAIL_SEARCH: must not construct with NULL worklist"));
00104 }
00105
00106 void Set_seen(node_type *phi) const
00107 { phi->Set_not_user_avail(); }
00108
00109 BOOL Seen(const node_type *const phi) const
00110 { return phi->Not_user_avail(); }
00111
00112
00113 void Reach_from_to(const node_type *const def_phi,
00114 const INT opnd_idx,
00115 const node_type *const use_phi) const
00116 { }
00117
00118 BOOL Start_from(const node_type *const phi) const
00119 {
00120 for (INT i = 0; i < phi->Opnd_count(); i++) {
00121 if (phi->Opnd(i) == NULL) {
00122 return TRUE;
00123 }
00124 }
00125 return FALSE;
00126 }
00127
00128
00129 BOOL Continue_from_to(const node_type *const def_phi,
00130 const INT opnd_idx,
00131 const node_type *const use_phi) const
00132 { return !use_phi->Has_real_occ(opnd_idx); }
00133
00134
00135 void Postorder_processing(node_type *const phi) const
00136 { }
00137
00138 node_type *Current_node(void) const { return _cur_node; }
00139
00140 adj_list_type *Neighbors(const node_type *const def_phi) const
00141 { return def_phi->Uses(); }
00142
00143 EXP_OCCURS_CONTAINER &Nodes(void) const
00144 { return Worklst()->Phi_occurs(); }
00145
00146 const char *Search_name(void) const
00147 { return "USER_AVAIL_SEARCH";}
00148 };
00149
00150 BOOL USER_AVAIL_SEARCH::_tracing = FALSE;
00151 EXP_WORKLST *USER_AVAIL_SEARCH::_worklst = NULL;
00152
00153 struct FORWARD_PRE {
00154 BB_LIST *Upward_neighbors(const BB_NODE *bb) const
00155 { return bb->Pred(); }
00156
00157 BB_LIST *Downward_neighbors(const BB_NODE *bb) const
00158 { return bb->Succ(); }
00159 };
00160
00161 struct BACKWARD_PRE {
00162 BB_LIST *Upward_neighbors(const BB_NODE *bb) const
00163 { return bb->Succ(); }
00164
00165 BB_LIST *Downward_neighbors(const BB_NODE *bb) const
00166 { return bb->Pred(); }
00167 };
00168
00169 template <class PRE_DIRECTION>
00170 class DEFEAT_INSERT_SEARCH {
00171 private:
00172 static BOOL _tracing;
00173
00174 EXP_PHI *const _cur_node;
00175
00176 public:
00177 static void Set_tracing(const BOOL tracing)
00178 { _tracing = tracing; }
00179
00180 BOOL Tracing(void) const { return _tracing; }
00181
00182 typedef EXP_PHI node_type;
00183 typedef EXP_PHI_OPND_USE_ITER adj_list_type;
00184 typedef EXP_PHI_OPND_USE_ITER adj_list_iter_type;
00185
00186 DEFEAT_INSERT_SEARCH(node_type *const cur_node) :
00187 _cur_node(cur_node)
00188 { }
00189
00190 void Set_seen(node_type *const phi) const
00191 { phi->Set_cant_be_avail(); }
00192
00193 BOOL Seen(const node_type *const phi) const
00194 { return phi->Cant_be_avail(); }
00195
00196
00197 void Reach_from_to(const node_type *const use_phi,
00198 const INT opnd_idx,
00199 const node_type *const def_phi) const
00200 { }
00201
00202 BOOL Start_from(const node_type *const use_phi) const
00203 { return use_phi->Not_user_avail(); }
00204
00205
00206 BOOL Continue_from_to(const node_type *const use_phi,
00207 const INT opnd_idx,
00208 const node_type *const def_phi) const
00209 { return def_phi->Not_user_avail(); }
00210
00211
00212 void Postorder_processing(node_type *const phi) const
00213 {
00214 CANT_BE_AVAIL_SEARCH<PRE_DIRECTION> cba_search(phi);
00215
00216 Df_search(cba_search);
00217 }
00218
00219 node_type *Current_node(void) const
00220 { return _cur_node; }
00221
00222 adj_list_type *Neighbors(node_type *use_phi) const
00223 {
00224 static EXP_PHI_OPND_USE_ITER adj_list;
00225
00226 adj_list.Init(use_phi);
00227 return &adj_list;
00228 }
00229
00230 const char *Search_name(void) const;
00231 };
00232
00233 template <> BOOL DEFEAT_INSERT_SEARCH<FORWARD_PRE>::_tracing = FALSE;
00234 template <> BOOL DEFEAT_INSERT_SEARCH<BACKWARD_PRE>::_tracing = FALSE;
00235
00236 template <> const char *
00237 DEFEAT_INSERT_SEARCH<FORWARD_PRE>::Search_name(void) const
00238 {
00239 return "DEFEAT_INSERT_SEARCH<FORWARD_PRE>";
00240 }
00241
00242 template <> const char *
00243 DEFEAT_INSERT_SEARCH<BACKWARD_PRE>::Search_name(void) const
00244 {
00245 return "DEFEAT_INSERT_SEARCH<BACKWARD_PRE>";
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 template <class PRE_DIRECTION>
00257 BOOL
00258 Requires_edge_placement(const EXP_PHI *phi,
00259 const BOOL tracing,
00260 const PRE_DIRECTION &direction)
00261 {
00262 INT i = 0;
00263 BB_LIST_ITER neighbor_iter;
00264 BB_NODE *upward_neighbor;
00265 FOR_ALL_ELEM(upward_neighbor,
00266 neighbor_iter,
00267 Init(direction.Upward_neighbors(phi->Bb()))) {
00268 if (phi->Opnd(i) == NULL &&
00269 direction.Downward_neighbors(upward_neighbor)->Multiple_bbs()) {
00270 if (WOPT_Enable_Edge_Placement &&
00271 WOPT_Enable_Backedge_Placement) {
00272 DevWarn("EXP_PHI::Requires_edge_placement: Critical edge found "
00273 "under full edge placement");
00274 }
00275 Is_Trace(tracing,
00276 (TFile, "Defeating early insertion in BB%d of\n",
00277 upward_neighbor->Id()));
00278 Is_Trace_cmd(tracing,
00279 phi->Result()->Occurrence()->Print(4, TFile));
00280 return TRUE;
00281 }
00282 i++;
00283 }
00284 return FALSE;
00285 }
00286
00287 template <class PRE_DIRECTION>
00288 class CANT_BE_AVAIL_SEARCH {
00289 private:
00290 static BOOL _tracing;
00291 static EXP_WORKLST *_worklst;
00292
00293 EXP_PHI *const _cur_node;
00294
00295 EXP_WORKLST *Worklst(void) const { return _worklst; }
00296
00297 public:
00298 static void Set_tracing(const BOOL tracing)
00299 { _tracing = tracing; }
00300
00301 static void Set_worklst(EXP_WORKLST *const worklst)
00302 { _worklst = worklst; }
00303
00304 BOOL Tracing(void) const { return _tracing; }
00305
00306 typedef EXP_PHI node_type;
00307 typedef USE_LIST_ENTRY adj_list_type;
00308 typedef USE_LIST_ITER adj_list_iter_type;
00309 typedef EXP_PHI_OCC_ITER node_iterator;
00310
00311 CANT_BE_AVAIL_SEARCH(node_type *const cur_node) :
00312 _cur_node(cur_node)
00313 {
00314 Is_True(Worklst() != NULL,
00315 ("CANT_BE_AVAIL_SEARCH: must not construct "
00316 "with NULL worklist"));
00317 }
00318
00319 void Set_seen(node_type *const phi) const
00320 { phi->Set_cant_be_avail(); }
00321
00322 BOOL Seen(const node_type *const phi) const
00323 { return phi->Cant_be_avail(); }
00324
00325
00326 void Reach_from_to(const node_type *const def_phi,
00327 const INT opnd_idx,
00328 const node_type *const use_phi) const
00329 {
00330
00331 }
00332
00333 BOOL Start_from(node_type *const phi) const
00334 {
00335 if (phi->Not_down_safe()) {
00336 for (INT i = 0; i < phi->Opnd_count(); i++) {
00337 if (phi->Opnd(i) == NULL) {
00338 return TRUE;
00339 }
00340 }
00341 }
00342 PRE_DIRECTION dir;
00343 if (Requires_edge_placement(phi, Tracing(), dir)) {
00344
00345
00346
00347
00348
00349
00350
00351
00352 DEFEAT_INSERT_SEARCH<PRE_DIRECTION>::Set_tracing(Tracing());
00353 DEFEAT_INSERT_SEARCH<PRE_DIRECTION> srch(phi);
00354
00355 Df_search(srch);
00356
00357 return TRUE;
00358 }
00359 else {
00360 return FALSE;
00361 }
00362 }
00363
00364
00365 BOOL Continue_from_to(const node_type *const def_phi,
00366 const INT opnd_idx,
00367 node_type *const use_phi) const;
00368
00369
00370 void Postorder_processing(node_type *const phi) const
00371 { }
00372
00373 node_type *Current_node(void) const
00374 { return _cur_node; }
00375
00376 adj_list_type *Neighbors(node_type *def_phi) const
00377 { return def_phi->Uses(); }
00378
00379 EXP_OCCURS_CONTAINER &Nodes(void) const
00380 { return Worklst()->Phi_occurs(); }
00381
00382 const char *Search_name(void) const;
00383 };
00384
00385 template <> BOOL CANT_BE_AVAIL_SEARCH<FORWARD_PRE>::_tracing = FALSE;
00386 template <> EXP_WORKLST *CANT_BE_AVAIL_SEARCH<FORWARD_PRE>::_worklst = NULL;
00387
00388
00389 template <> const char *
00390 CANT_BE_AVAIL_SEARCH<FORWARD_PRE>::Search_name(void) const
00391 { return "CANT_BE_AVAIL_SEARCH<FORWARD_PRE>"; }
00392
00393 template <> BOOL
00394 CANT_BE_AVAIL_SEARCH<FORWARD_PRE>::
00395 Continue_from_to(const node_type *const def_phi,
00396 const INT opnd_idx,
00397 node_type *const use_phi) const
00398 {
00399 if (use_phi->Has_real_occ(opnd_idx)) {
00400 return FALSE;
00401 }
00402 if (use_phi->Not_down_safe()) {
00403 return TRUE;
00404 }
00405 if (use_phi->Bb()->Nth_pred(opnd_idx)->Succ()->Multiple_bbs()) {
00406 FmtAssert(!WOPT_Enable_Edge_Placement ||
00407 !WOPT_Enable_Backedge_Placement,
00408 ("CANT_BE_AVAIL_SEARCH<FORWARD_PRE>::Continue_from_to: "
00409 "Critical edge found under full edge placement"));
00410 Is_Trace(Tracing(),
00411 (TFile, "Defeating insertion in BB%d of\n",
00412 use_phi->Bb()->Nth_pred(opnd_idx)->Id()));
00413 Is_Trace_cmd(Tracing(),
00414 use_phi->Result()->Occurrence()->Print(4, TFile));
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424 DEFEAT_INSERT_SEARCH<FORWARD_PRE>::Set_tracing(_tracing);
00425
00426 DEFEAT_INSERT_SEARCH<FORWARD_PRE> srch(use_phi);
00427
00428 Df_search(srch);
00429 return TRUE;
00430 }
00431 return FALSE;
00432 }
00433
00434 template <> BOOL CANT_BE_AVAIL_SEARCH<BACKWARD_PRE>::_tracing = FALSE;
00435 template <> EXP_WORKLST *CANT_BE_AVAIL_SEARCH<BACKWARD_PRE>::_worklst = NULL;
00436
00437
00438 template <> const char *
00439 CANT_BE_AVAIL_SEARCH<BACKWARD_PRE>::Search_name(void) const
00440 { return "CANT_BE_AVAIL_SEARCH<BACKWARD_PRE>"; }
00441
00442 template <> BOOL
00443 CANT_BE_AVAIL_SEARCH<BACKWARD_PRE>::
00444 Continue_from_to(const node_type *const def_phi,
00445 const INT opnd_idx,
00446 node_type *const use_phi) const
00447 {
00448
00449
00450
00451
00452
00453 if (use_phi->Has_real_occ(opnd_idx)) {
00454 return FALSE;
00455 }
00456 if (use_phi->Not_down_safe()) {
00457 return TRUE;
00458 }
00459 if (use_phi->Bb()->Nth_succ(opnd_idx)->Pred()->Multiple_bbs()) {
00460 FmtAssert(!WOPT_Enable_Edge_Placement ||
00461 !WOPT_Enable_Backedge_Placement,
00462 ("CANT_BE_AVAIL_SEARCH<BACKWARD_PRE>::Continue_from_to: "
00463 "Critical edge found under full edge placement"));
00464 Is_Trace(Tracing(),
00465 (TFile, "Defeating insertion in BB%d of\n",
00466 use_phi->Bb()->Nth_pred(opnd_idx)->Id()));
00467 Is_Trace_cmd(Tracing(),
00468 use_phi->Result()->Occurrence()->Print(4, TFile));
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478 DEFEAT_INSERT_SEARCH<BACKWARD_PRE>::Set_tracing(_tracing);
00479
00480 DEFEAT_INSERT_SEARCH<BACKWARD_PRE> srch(use_phi);
00481
00482 Df_search(srch);
00483 return TRUE;
00484 }
00485 return FALSE;
00486 }
00487
00488 class STOPS_SEARCH {
00489 private:
00490 static BOOL _tracing;
00491 static EXP_WORKLST *_worklst;
00492
00493 EXP_PHI *const _cur_node;
00494
00495 EXP_WORKLST *Worklst(void) const { return _worklst; }
00496
00497 public:
00498 static void Set_tracing(const BOOL tracing) { _tracing = tracing; }
00499
00500 static void Set_worklst(EXP_WORKLST *const worklst)
00501 { _worklst = worklst; }
00502
00503 BOOL Tracing(void) const { return _tracing; }
00504
00505 typedef EXP_PHI node_type;
00506 typedef USE_LIST_ENTRY adj_list_type;
00507 typedef USE_LIST_ITER adj_list_iter_type;
00508 typedef EXP_PHI_OCC_ITER node_iterator;
00509
00510 STOPS_SEARCH(node_type *const cur_node) : _cur_node(cur_node)
00511 {
00512 Is_True(Worklst() != NULL,
00513 ("STOPS_SEARCH: must not construct with NULL worklist"));
00514 }
00515
00516 void Set_seen(node_type *const phi) const
00517 { phi->Set_stops(); }
00518
00519 BOOL Seen(const node_type *const phi) const
00520 { return phi->Stops(); }
00521
00522
00523 void Reach_from_to(const node_type *const def_phi,
00524 const INT opnd_idx,
00525 node_type *const use_phi) const
00526 {
00527
00528
00529
00530
00531 #if 0
00532 if (def_phi->Will_b_avail() ||
00533 !use_phi->Will_b_avail()) {
00534 #endif
00535 use_phi->Set_opnd_stops(opnd_idx);
00536 #if 0
00537 }
00538 #endif
00539 }
00540
00541 BOOL Start_from(const node_type *const phi) const
00542 {
00543 for (INT i = 0; i < phi->Opnd_count(); i++) {
00544 if (phi->Opnd_stops(i)) {
00545 return TRUE;
00546 }
00547 }
00548 return FALSE;
00549 }
00550
00551
00552 BOOL Continue_from_to(const node_type *const def_phi,
00553 const INT opnd_idx,
00554 const node_type *const use_phi) const
00555 { return Start_from(use_phi); }
00556
00557
00558 void Postorder_processing(node_type *const phi) const
00559 { }
00560
00561 node_type *Current_node(void) const
00562 { return _cur_node; }
00563
00564 adj_list_type *Neighbors(node_type *def_phi) const
00565 { return def_phi->Uses(); }
00566
00567 EXP_OCCURS_CONTAINER &Nodes(void) const
00568 { return Worklst()->Phi_occurs(); }
00569
00570 const char *Search_name(void) const
00571 { return "STOPS_SEARCH"; }
00572 };
00573
00574 BOOL STOPS_SEARCH::_tracing = FALSE;
00575 EXP_WORKLST *STOPS_SEARCH::_worklst = NULL;
00576
00577
00578 class PARTIAL_AVAIL_SEARCH {
00579 private:
00580 static BOOL _tracing;
00581 static EXP_WORKLST *_worklst;
00582
00583 EXP_WORKLST *Worklst(void) const { return _worklst; }
00584
00585 EXP_PHI *const _cur_node;
00586
00587 public:
00588 static void Set_tracing(const BOOL tracing) { _tracing = tracing; }
00589 static void Set_worklst(EXP_WORKLST *const worklst)
00590 { _worklst = worklst; }
00591
00592 BOOL Tracing(void) const { return _tracing; }
00593
00594 typedef EXP_PHI node_type;
00595 typedef USE_LIST_ENTRY adj_list_type;
00596 typedef USE_LIST_ITER adj_list_iter_type;
00597 typedef EXP_PHI_OCC_ITER node_iterator;
00598
00599 PARTIAL_AVAIL_SEARCH(node_type *const cur_node) : _cur_node(cur_node)
00600 {
00601 Is_True(Worklst() != NULL,
00602 ("PARTIAL_AVAIL_SEARCH: must not construct with NULL worklist"));
00603 }
00604
00605 void Set_seen(node_type *phi) const
00606 { phi->Set_partial_avail(); }
00607
00608 BOOL Seen(const node_type *const phi) const
00609 { return phi->Partial_avail(); }
00610
00611
00612 void Reach_from_to(const node_type *const def_phi,
00613 const INT opnd_idx,
00614 const node_type *const use_phi) const
00615 { }
00616
00617 BOOL Start_from(const node_type *const phi) const
00618 {
00619 for (INT i = 0; i < phi->Opnd_count(); i++) {
00620 if (phi->Has_real_occ(i)) {
00621 return TRUE;
00622 }
00623 }
00624 return FALSE;
00625 }
00626
00627
00628 BOOL Continue_from_to(const node_type *const def_phi,
00629 const INT opnd_idx,
00630 const node_type *const use_phi) const
00631 { return TRUE; }
00632
00633
00634 void Postorder_processing(node_type *const phi) const
00635 { }
00636
00637 node_type *Current_node(void) const { return _cur_node; }
00638
00639 adj_list_type *Neighbors(const node_type *const def_phi) const
00640 { return def_phi->Uses(); }
00641
00642 EXP_OCCURS_CONTAINER &Nodes(void) const
00643 { return Worklst()->Phi_occurs(); }
00644
00645 const char *Search_name(void) const
00646 { return "PARTIAL_AVAIL_SEARCH";}
00647 };
00648
00649 BOOL PARTIAL_AVAIL_SEARCH::_tracing = FALSE;
00650 EXP_WORKLST *PARTIAL_AVAIL_SEARCH::_worklst = NULL;
00651
00652 void
00653 EXP_WORKLST::Compute_du_info(MEM_POOL *const def_use_pool)
00654 {
00655 EXP_OCCURS_ITER phi_occ_iter;
00656 EXP_OCCURS *phi_occ;
00657
00658
00659 FOR_ALL_NODE(phi_occ, phi_occ_iter, Init(Phi_occurs().Head())) {
00660
00661 EXP_PHI *phi = phi_occ->Exp_phi();
00662
00663 for (INT i = 0; i < phi->Opnd_count(); ++i) {
00664 EXP_OCCURS *def = phi->Opnd(i);
00665
00666
00667 if (def != NULL) {
00668
00669 if (def->Occ_kind() == EXP_OCCURS::OCC_PHI_OCCUR) {
00670 def->Exp_phi()->Add_use(phi, i, def_use_pool);
00671 }
00672 else {
00673 Is_True(def->Occ_kind() == EXP_OCCURS::OCC_REAL_OCCUR,
00674 ("EXP_WORKLST::Compute_du_info: Phi opnd must be "
00675 "real or phi"));
00676 }
00677 }
00678 }
00679 }
00680 }
00681
00682
00683 void
00684 EXP_WORKLST::Compute_user_avail(const BOOL tracing)
00685 {
00686
00687
00688
00689
00690
00691
00692
00693 USER_AVAIL_SEARCH::Set_worklst(this);
00694 USER_AVAIL_SEARCH::Set_tracing(tracing);
00695
00696 USER_AVAIL_SEARCH ua_srch(NULL);
00697
00698 Perform_dfs(ua_srch);
00699 }
00700
00701
00702 void
00703 EXP_WORKLST::Compute_avail(const BOOL tracing)
00704 {
00705 if (!WOPT_Enable_Edge_Placement ||
00706 !WOPT_Enable_Backedge_Placement) {
00707
00708
00709
00710
00711
00712 Compute_user_avail(tracing);
00713 }
00714
00715 if (Real_occurs().Head()->For_spre()) {
00716 CANT_BE_AVAIL_SEARCH<BACKWARD_PRE>::Set_worklst(this);
00717 CANT_BE_AVAIL_SEARCH<BACKWARD_PRE>::Set_tracing(tracing);
00718
00719 CANT_BE_AVAIL_SEARCH<BACKWARD_PRE> cba_srch(NULL);
00720
00721 Perform_dfs(cba_srch);
00722 }
00723 else {
00724 CANT_BE_AVAIL_SEARCH<FORWARD_PRE>::Set_worklst(this);
00725 CANT_BE_AVAIL_SEARCH<FORWARD_PRE>::Set_tracing(tracing);
00726
00727 CANT_BE_AVAIL_SEARCH<FORWARD_PRE> cba_srch(NULL);
00728
00729 Perform_dfs(cba_srch);
00730 }
00731 }
00732
00733
00734 void
00735 EXP_WORKLST::Compute_partial_avail(const BOOL tracing)
00736 {
00737 PARTIAL_AVAIL_SEARCH::Set_worklst(this);
00738 PARTIAL_AVAIL_SEARCH::Set_tracing(tracing);
00739 PARTIAL_AVAIL_SEARCH pa_srch(NULL);
00740 Perform_dfs(pa_srch);
00741 }
00742
00743 void
00744 EXP_WORKLST::Compute_stops(const BOOL tracing)
00745 {
00746 EXP_OCCURS_ITER phi_occ_iter;
00747 EXP_OCCURS *phi_occ;
00748
00749
00750
00751
00752 FOR_ALL_NODE(phi_occ, phi_occ_iter, Init(Phi_occurs().Head())) {
00753 EXP_PHI *phi = phi_occ->Exp_phi();
00754 if (phi->Cant_be_avail()) {
00755 phi->Set_stops();
00756 }
00757 for (INT i = phi->Opnd_count() - 1; i >= 0; i--) {
00758 if (phi->Has_real_occ(i)) {
00759
00760
00761 phi->Set_opnd_stops(i);
00762 }
00763 }
00764 }
00765
00766 STOPS_SEARCH::Set_worklst(this);
00767 STOPS_SEARCH::Set_tracing(tracing);
00768
00769 STOPS_SEARCH srch(NULL);
00770
00771 Perform_dfs(srch);
00772 }
00773
00774
00775
00776
00777
00778 void
00779 EXP_WORKLST::Compute_forward_attributes(
00780
00781 ETABLE *etable, BOOL compute_partial_avail)
00782 {
00783 Is_Trace(etable->Tracing(),
00784 (TFile,
00785 "==== On entry to EXP_WORKLST::Compute_forward_attributes\n"));
00786 Is_Trace_cmd(etable->Tracing(), Print(TFile));
00787
00788
00789 Compute_du_info(etable->Etable_local_pool());
00790
00791 Compute_avail(etable->Tracing());
00792
00793 if (compute_partial_avail)
00794 Compute_partial_avail(etable->Tracing());
00795
00796 Is_Trace(etable->Tracing(),
00797 (TFile, "==== After EXP_WORKLST::Compute_avail\n"));
00798 Is_Trace_cmd(etable->Tracing(), Print(TFile));
00799
00800 Compute_stops(etable->Tracing());
00801
00802 Is_Trace(etable->Tracing(),
00803 (TFile, "==== After EXP_WORKLST::Compute_stops\n"));
00804 Is_Trace_cmd(etable->Tracing(), Print(TFile));
00805 }
00806
00807
00808
00809
00810
00811
00812 void
00813 EXP_WORKLST::Compute_fully_avail(ETABLE *etable)
00814 {
00815 Is_Trace(etable->Tracing(),
00816 (TFile, "==== On entry to EXP_WORKLST::Compute_fully_avail\n"));
00817 Is_Trace_cmd(etable->Tracing(), Print(TFile));
00818
00819
00820
00821 Compute_du_info(etable->Etable_local_pool());
00822 Compute_user_avail(etable->Tracing());
00823
00824 Is_Trace(etable->Tracing(),
00825 (TFile, "==== After EXP_WORKLST::Compute_fully_avail\n"));
00826 Is_Trace_cmd(etable->Tracing(), Print(TFile));
00827 }