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 #ifdef USE_PCH
00043 #include "cg_pch.h"
00044 #endif // USE_PCH
00045 #pragma hdrstop
00046
00047 #include "defs.h"
00048 #include "errors.h"
00049 #include "cg.h"
00050 #include "cg_region.h"
00051 #include "bb.h"
00052 #include "findloops.h"
00053 #include "cg_flags.h"
00054 #include "gra_bb.h"
00055 #include "gra_loop.h"
00056 #include "gra_trace.h"
00057
00058 GRA_LOOP_MGR gra_loop_mgr;
00059
00061
00062 void
00063 GRA_LOOP::Make_Register_Used( ISA_REGISTER_CLASS rc, REGISTER reg,
00064 BOOL reclaim )
00065 {
00066 #ifdef KEY
00067
00068 if (reclaim)
00069 return;
00070 #endif
00071
00072 if (this == NULL) return;
00073
00074 registers_used[rc] = REGISTER_SET_Union1(registers_used[rc],reg);
00075 GRA_LOOP *li;
00076 for (li = parent; li != NULL; li = li->parent) {
00077 li->registers_used[rc] = REGISTER_SET_Union1(li->registers_used[rc],reg);
00078 }
00079 }
00080
00081
00082 #ifdef KEY
00084 // Return the set of registers referenced in the loop.
00085 REGISTER_SET
00086 GRA_LOOP::Registers_Referenced (ISA_REGISTER_CLASS rc)
00087 {
00088 BB *bb;
00089 BB_SET *loop_bbs = LOOP_DESCR_bbset(Loop_Descr());
00090 REGISTER_SET referenced = REGISTER_SET_EMPTY_SET;
00091
00092 for (bb = BB_SET_Choose(loop_bbs);
00093 bb != BB_SET_CHOOSE_FAILURE;
00094 bb = BB_SET_Choose_Next(loop_bbs, bb)) {
00095 GRA_BB* gbb = gbb_mgr.Get(bb);
00096 Is_True(gbb != NULL, ("GRA_LOOP::Registers_Referenced: cannot find gbb"));
00097 referenced = REGISTER_SET_Union(referenced, gbb->Registers_Referenced(rc));
00098 }
00099 return referenced;
00100 }
00101
00102 #endif
00103
00105
00106
00107
00108 GRA_LOOP*
00109 GRA_LOOP_MGR::Create(LOOP_DESCR *ld)
00110 {
00111 ISA_REGISTER_CLASS rc;
00112
00113 GRA_LOOP* gloop = TYPE_MEM_POOL_ALLOC(GRA_LOOP, GRA_pool);
00114 #ifdef KEY
00115 BZERO( gloop, sizeof(gloop[0]) );
00116 gloop->Loop_Descr_Set(ld);
00117 #endif
00118 gloop->Nest_Level_Set(LOOP_DESCR_nestlevel(ld));
00119 gloop->Loop_Head_Set(LOOP_DESCR_loophead(ld));
00120 BB_MAP_Set(_map, LOOP_DESCR_loophead(ld), (void *) gloop);
00121
00122 FOR_ALL_ISA_REGISTER_CLASS( rc ) {
00123 gloop->Registers_Used_Init(rc);
00124 }
00125 return gloop;
00126 }
00127
00128
00130
00131
00132
00133 GRA_LOOP*
00134 GRA_LOOP::Make_Loop_Nest(GRA_LOOP *outermost, GRA_LOOP *parent)
00135 {
00136 GRA_LOOP *loop, *next;
00137
00138 for (loop = this; loop != NULL; loop = next) {
00139 next = loop->Next_Loop();
00140 loop->Parent_Set(parent);
00141 loop->Outermost_Set(outermost);
00142
00143 if (next != NULL) {
00144 INT next_level = next->Nest_Level();
00145 INT cur_level = loop->Nest_Level();
00146
00147
00148 if ( next_level > cur_level ) {
00149 next = next->Make_Loop_Nest(outermost, loop);
00150 } else if (next_level < cur_level) {
00151
00152
00153
00154
00155 break;
00156 }
00157 }
00158 }
00159 return(next);
00160 }
00161
00163
00164
00165
00166
00167 void
00168 GRA_LOOP_MGR::Find_Loops(void)
00169 {
00170 LOOP_DESCR *cgl;
00171 GRA_LOOP *graloop, *prev;
00172
00173
00174
00175
00176 cg_loops = LOOP_DESCR_Detect_Loops(GRA_pool);
00177 if (cg_loops == NULL) return;
00178 if (GRA_Trace_Loops()) {
00179 LOOP_DESCR_Print_List();
00180 }
00181
00182 _map = BB_MAP_Create();
00183
00184
00185
00186
00187
00188
00189 for (prev = NULL, cgl = cg_loops;
00190 cgl != NULL;
00191 cgl = LOOP_DESCR_next(cgl), prev = graloop) {
00192 graloop = Create(cgl);
00193 graloop->Next_Loop_Set(prev);
00194 if (LOOP_DESCR_nestlevel(cgl) == 1) {
00195 (void) graloop->Make_Loop_Nest(graloop, NULL);
00196 }
00197 }
00198 }
00199
00201
00202
00203 void
00204 GRA_LOOP_MGR::Set_GBB_Loop(GRA_BB *gbb)
00205 {
00206 LOOP_DESCR *bb_loop;
00207
00208 if (!GRA_loop_splitting) {
00209 gbb->Loop_Set(NULL);
00210 } else {
00211 bb_loop = LOOP_DESCR_Find_Loop(gbb->Bb());
00212 if (bb_loop != NULL) {
00213 gbb->Loop_Set( (GRA_LOOP *) BB_MAP_Get(_map,
00214 LOOP_DESCR_loophead(bb_loop)));
00215 } else {
00216 gbb->Loop_Set(NULL);
00217 }
00218 }
00219 }
00220