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 #ifndef GRA_PARA_REGION_INCLUDED
00043 #define GRA_PARA_REGION_INCLUDED
00044
00045 #include "defs.h"
00046 #include "register.h"
00047 #include "mempool.h"
00048 #include "region_util.h"
00049 #include "bb.h"
00050
00051 enum PARA_REGION_FLAG {
00052 PARA_REGION_FLAGS_is_minor = 0x1,
00053 PARA_REGION_FLAGS_is_major = 0x2,
00054 };
00055
00056 class GRA_PARA_REGION {
00057 friend class GRA_PARA_REGION_MGR;
00058 RID* rid;
00059 RID* pair_rid;
00060
00061 REGISTER_SET registers_def[ISA_REGISTER_CLASS_MAX+1];
00062
00063 REGISTER_SET registers_use[ISA_REGISTER_CLASS_MAX+1];
00064
00065
00066
00067
00068
00069 REGISTER_SET exclude_set[ISA_REGISTER_CLASS_MAX + 1];
00070
00071 REGISTER_SET lra_reg_budget;
00072
00073
00074 BBLIST* internal_bbs;
00075
00076 BBLIST* boundary_bbs;
00077
00078 GRA_PARA_REGION* next;
00079
00080 PARA_REGION_FLAG flags;
00081 public:
00082 GRA_PARA_REGION(void) {}
00083 ~GRA_PARA_REGION(void) {}
00084
00085
00086 RID *Rid(void) { return rid; }
00087
00088 REGISTER_SET Registers_Used(ISA_REGISTER_CLASS rc){return registers_use[rc];}
00089
00090 void Make_Register_Used(ISA_REGISTER_CLASS rc, REGISTER reg) {
00091 registers_use[rc] = REGISTER_SET_Union1(registers_use[rc], reg); }
00092
00093 REGISTER_SET Registers_Defined(ISA_REGISTER_CLASS rc){return registers_def[rc];}
00094
00095 void Make_Register_Defined(ISA_REGISTER_CLASS rc, REGISTER reg) {
00096 registers_def[rc] = REGISTER_SET_Union1(registers_def[rc], reg);
00097 }
00098
00099 REGISTER_SET Registers_Exclude(ISA_REGISTER_CLASS rc){return exclude_set[rc];}
00100
00101 void Add_One_Exclude_Register(ISA_REGISTER_CLASS rc, REGISTER reg) {
00102 exclude_set[rc] = REGISTER_SET_Union1(exclude_set[rc], reg);
00103 }
00104
00105 void Set_Registers_Exclude(ISA_REGISTER_CLASS rc, REGISTER_SET set) { exclude_set[rc] = set; }
00106
00107
00108 void Add_Reg_To_LRA_Budget(REGISTER reg) { lra_reg_budget = REGISTER_SET_Union1(lra_reg_budget, reg); }
00109
00110 REGISTER_SET Get_LRA_Reg_Budget() {return lra_reg_budget;}
00111
00112 GRA_PARA_REGION *Next(void) { return next; }
00113
00114 void Add_BB( BB* bb );
00115
00116 BOOL Is_Minor(void) { return flags & PARA_REGION_FLAGS_is_minor;}
00117
00118 void Set_Region_Minor(void) { flags = (PARA_REGION_FLAG) (flags |PARA_REGION_FLAGS_is_minor); }
00119
00120 BOOL Is_Major(void) { return flags & PARA_REGION_FLAGS_is_major;}
00121
00122 void Set_Region_Major(void) { flags = (PARA_REGION_FLAG) (flags | PARA_REGION_FLAGS_is_major); }
00123
00124 BBLIST* Internal_BBs(void) { return internal_bbs;}
00125
00126 void Collect_Reg_Used_And_Def_For_BBs();
00127
00128 };
00129
00130
00131
00132 class GRA_PARA_REGION_MGR {
00133 INT32 _alloc_count;
00134
00135 GRA_PARA_REGION* _first_para_region;
00136
00137 GRA_PARA_REGION **_map;
00138
00139 RID** _rid_pair_map;
00140
00141 REGISTER_SET share_unused;
00142
00143 VECTOR minor_rids;
00144
00145 public:
00146 GRA_PARA_REGION_MGR(void) {}
00147 ~GRA_PARA_REGION_MGR(void) {}
00148
00149 void Initialize(void);
00150
00151 void Finalize(void) { MEM_POOL_Pop(&MEM_local_pool);}
00152
00153 GRA_PARA_REGION *Create(RID *rid);
00154
00155 GRA_PARA_REGION *Create_Region(RID *rid);
00156
00157 GRA_PARA_REGION* Get( RID* rid );
00158
00159 REGISTER_SET Get_Unused_Share() {return share_unused; }
00160
00161 void Set_Unused_Share(REGISTER_SET set) { share_unused = set; }
00162
00163 INT32 Alloc_Count(void) { return _alloc_count; }
00164
00165 GRA_PARA_REGION* First_Para_Region(void){ return _first_para_region; }
00166
00167 RID* Get_Pair_Rid(RID* rid) { return _rid_pair_map[RID_id(rid)]; }
00168
00169 GRA_PARA_REGION * Get_Pair_Region(GRA_PARA_REGION* region) ;
00170
00171
00172 void Build_Map_For_Pair_Region();
00173
00174 void Add_Rid_Into_Minor_Vector(RID* rid);
00175
00176 void Check_Register_Allocation(void) ;
00177
00178 void Set_Region_LRA_Budget();
00179
00180 void Grant_Register_For_Region(GRA_PARA_REGION * region);
00181
00182 void Pre_Reserve_Registers_For_Minor(void);
00183
00184 void Collect_Share_Registers_For_Pair_Regions(GRA_PARA_REGION * r1, GRA_PARA_REGION * r2);
00185
00186 };
00187
00188 extern GRA_PARA_REGION_MGR gra_para_region_mgr;
00189
00190 #endif
00191