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 #ifndef scheduler_INCLUDED
00045 #define scheduler_INCLUDED
00046
00047
00048
00049 #include <ext/slist>
00050 #include <list>
00051 #include <vector>
00052 #include <map>
00053
00054
00055
00056 #include "mempool.h"
00057 #include "mempool_allocator.h"
00058
00059
00060
00061 #include "ipfec_defs.h"
00062
00063
00064
00065
00066 #include "tracing.h"
00067 #include "bb.h"
00068 #include "bb_set.h"
00069 #include "op.h"
00070 #include "prdb.h"
00071 #include "tn.h"
00072
00073
00074
00075 #include "dag.h"
00076
00077
00078
00079 #include "targ_issue_port.h"
00080 #include "cggrp_microsched.h"
00081 #include "region.h"
00082 #include "region_verify.h"
00083
00084
00085 #include "sched_util.h"
00086 #include "sched_cflow.h"
00087 #include "sched_dflow.h"
00088 #include "sched_heur.h"
00089 #include "sched_cand.h"
00090 #include "sched_res_aware.h"
00091
00092
00093
00094 extern void Global_Insn_Sched (REGION_TREE& region_tree);
00095 extern void Local_Insn_Sched (BOOL);
00096 extern void Global_Insn_Merge_Splitted_BBs () ;
00097 extern void Clean_Up (BB* bb);
00098
00099
00100 class SCHED_MEM {
00101 protected:
00102 MEM_POOL _mem_pool;
00103
00104 SCHED_MEM () {
00105 MEM_POOL_Initialize (&_mem_pool, "SCHED_MEM", FALSE);
00106 MEM_POOL_Push (&_mem_pool);
00107 }
00108
00109 ~SCHED_MEM () {
00110 MEM_POOL_Pop (&_mem_pool);
00111 MEM_POOL_Delete (&_mem_pool);
00112 }
00113
00114 public:
00115
00116 };
00117
00118
00119 class SCHEDULER : public SCHED_MEM {
00120
00121 friend void Global_Insn_Sched (REGION_TREE* rgn_tree, BOOL prepass) ;
00122 friend class SCHED_SPEC_HANDSHAKE;
00123
00124 private:
00125
00126
00127
00128 DAG_BUILDER _dag_constructor;
00129 void Gen_Bookeeping_OP_DAG
00130 (CANDIDATE& cand, OP* compensate, BOOKEEPING* bk);
00131 void Gen_Inverted_Arc (CANDIDATE* cand,ARC* ref_arc,
00132 OP* pred, OP* succ);
00133 void Maintain_Dep_Arcs_After_Sched (CANDIDATE* cand);
00134 void Maintain_Dep_Arcs_After_Cntl_Spec_If_Converted_Code
00135 (OP* sched_op, TN* sched_qp, OP* cmp_op);
00136
00137
00138
00139 CAND_MGR _cand_mgr;
00140 DATA_SPEC_RES_CONSTRAIT_MGR _dsrmgr;
00141
00142
00143
00144 void Find_All_Candidates (void) ;
00145
00146
00147
00148
00149
00150 BOOL OP_Cannot_be_Candidate_Since_Obvious_Reason (OP* op) ;
00151 BOOL Succ_Pred_Transposed_If_Sched (ARC* arc, BB_VECTOR* cs);
00152 BOOL Collect_And_Analyse_Unresolved_Dep
00153 (CANDIDATE* cand, SRC_BB_INFO* bb_info);
00154 BOOL Collect_And_Analyse_Other_Than_Dep_Constraints
00155 (CANDIDATE* cand, SRC_BB_INFO* bb_info);
00156 void Determine_Non_P_Ready_Bookeeping_Places
00157 (CANDIDATE* cand, SRC_BB_INFO* bb_info) ;
00158 BOOL Try_Add_OP_to_Candidate_List (OP* op);
00159
00160
00161
00162
00163
00164 void Update_Cand_Lst_During_Sched_Cyc (CANDIDATE& cand);
00165 void Update_Cand_Lst_After_Cycle_Advancing (void) ;
00166 void Update_Cand_Lst_After_Cntl_Spec_If_Converted_Code
00167 (OP* sched_op, TN* sched_qp);
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 BOOL OP_Cannot_Be_Moved_Outof_HomeBB (OP * op) ;
00178
00179
00180 BOOL OP_QP_Cannot_Be_Removed_By_Cntl_Spec (OP* op);
00181 BOOL Can_Cntl_Spec_If_Converted_Code(CANDIDATE *cand);
00182
00183
00184
00185 SPEC_TYPE Get_OP_Prohibited_Spec_Type (OP * op) ;
00186
00187
00188
00189 void Identify_Cannot_Spec_OPs (BB * bb ) ;
00190 void Identify_Cannot_Spec_OPs (REGION *rgn) ;
00191
00192
00193
00194
00195 void Determine_P_Ready_is_Profitable_or_not (void) {}
00196 void Disable_P_Pready_Cand (void) { } ;
00197 BOOL P_READY_Cand_Disabled (void) { return TRUE; }
00198
00199
00200
00201 void Renaming(CANDIDATE* cand);
00202 void Maintain_Dep_Arcs_After_Renaming (OP* renamed_op, OP* copy_op);
00203
00204
00205
00206
00207 void BB_Move_Op_Before (BB* to_bb, OP* point, BB* from_bb, OP* op) ;
00208 OP* Insert_Check (OP* ld, BB* home_bb, OP* pos);
00209 OP* Gen_Compensation_Code
00210 (CANDIDATE& model_cand, BB* org_home,
00211 BOOKEEPING* bk, BOOL append=TRUE);
00212
00213 void Cycle_Advance (void);
00214 BOOL Commit_Schedule (CANDIDATE& cand);
00215
00216
00217
00218
00219 void Preprocess_GP_def_op (void) ;
00220 void Postprocess_GP_def_op (void) ;
00221
00222 OP* _gp_def_op ;
00223 ARC_LIST* _dep_upon_this_op ;
00224
00225 BOOL OP_def_GP (OP* op) ;
00226
00227
00228
00229 void Identify_Actual_Argument_Defs (BB* bb);
00230
00231
00232
00233
00234 const BOOL _prepass;
00235 const BOOL _global;
00236
00237 REGION* _region;
00238 BB* _bb;
00239
00240
00241 BB* _target_bb;
00242
00243 CYCLE _cur_cyc;
00244
00245
00246
00247 mINT16 _upward_motion_num, _downward_motion_num;
00248 mINT16 _sched_times;
00249 enum { MAX_SCHED_TIMES = 2, };
00250
00251 OP* _frontier_op;
00252
00253 OP_Vector _ops_in_cur_cyc;
00254
00255
00256 SRC_BB_MGR _src_bb_mgr ;
00257
00258
00259
00260
00261
00262 BB_VECTOR _multiway_br_span_bbs;
00263
00264
00265
00266 BB_SET* _multiway_br_candidates;
00267
00268 void Init_Sched_Status (void) ;
00269 void Adjust_Status_For_Resched (void);
00270
00271
00272 RGN_CFLOW_MGR _cflow_mgr ;
00273 SCHED_DFLOW_MGR _dflow_mgr ;
00274 FAVOR_DELAY_HEUR _heur_mgr;
00275
00276
00277
00278 inline void Bug_Workaround_After_Schedule_BB (void) ;
00279 inline void Bug_Workaround_Before_Schedule_BB (void) ;
00280
00281
00282
00283
00284 void Schedule_Cycle (void);
00285 BOOL No_New_Cycle (void);
00286
00287
00288
00289 BOOL Sched_Rgn_Preproc (void);
00290 void Sched_Rgn_Postproc (void);
00291
00292 void Glos_Sched_BB_Postproc (void) ;
00293 void Glos_Sched_BB_Preproc (void) ;
00294 BOOL Glos_Should_Sched_This_BB (BB *b);
00295 BOOL Need_Resched_To_Obtain_Better_Performance (void);
00296
00297 SCHEDULER (struct tagRGN_INFO * rgn_info, BOOL before_regalloc ,
00298 PRDB_GEN * prdb=NULL);
00299 void Schedule_Region (void);
00300
00301
00302
00303
00304 void Verify (void) ;
00305 void Dump_OP_Verbose_Info (OP* op, FILE * f=stderr);
00306
00307
00308
00309
00310 public:
00311
00312 SCHEDULER (BB* bb, BOOL before_regalloc,PRDB_GEN *prdb=NULL) ;
00313 ~SCHEDULER (void) ;
00314
00315 void Schedule_BB (void);
00316
00317
00318
00319 void Dump (FILE* file = stderr);
00320 void Dump_DAG (FILE *f=stderr );
00321 void Dump_IR (FILE *f=stderr );
00322 };
00323
00324 #endif