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 #ifndef LEGOREGION_H
00046 #define LEGOREGION_H
00047
00048 #include <stdio.h>
00049 #include "legoErr.H"
00050 #include "edgeList.H"
00051 #include "legoOp.H"
00052 #include "legoPSet.H"
00053
00054
00055
00056 class regionList;
00057 class legoOp;
00058
00059
00060
00061 enum regionTypes {
00062 RT_PROC=0,
00063 RT_BB,
00064 RT_HB,
00065 RT_SB,
00066 RT_LOOP,
00067 RT_LOOPBODY,
00068 RT_TRACE,
00069 RT_MODULE,
00070 RT_TREE
00071 };
00072
00073 #define IS_BLOCK(t) (((t) == RT_BB) || ((t) == RT_SB) || ((t) == RT_HB))
00074
00075
00076
00077
00078
00079 #define RM_GENERAL ((long long) 0x1)
00080 #define RM_TRACE ((long long) 0x2)
00081 #define RM_TREE ((long long) 0x4)
00082 #define RM_SB ((long long) 0x8)
00083 #define RM_LOOPHEADER ((long long) 0x10)
00084 #define RM_INNER ((long long) 0x20)
00085 #define RM_OUTER ((long long) 0x40)
00086 #define RM_HAMMOCK ((long long) 0x80)
00087 #define RM_KISSOFDEATH (((long long) 1) << 63)
00088
00089
00090
00091 class legoRegion
00092 : public legoPSet<void*>
00093 {
00094
00095 int regionId;
00096 enum regionTypes regionType;
00097
00098
00099
00100 edgeList *inEdgesPtr;
00101 edgeList *outEdgesPtr;
00102 flags *flagPtr;
00103 opList *entryOpsPtr;
00104 opList *exitOpsPtr;
00105 attrList *regionAttrListPtr;
00106
00107 double weight;
00108 legoRegion *parentPtr;
00109
00110 regionList *parents;
00111 regionList *children;
00112 regionList *dominators;
00113 legoOp *allListPtr;
00114
00115 long long markfield;
00116 int nestingLevel;
00117
00118 void *DAG;
00119
00120 public:
00121
00122 legoRegion ();
00123 legoRegion (const legoRegion &orig);
00124 legoRegion (enum regionTypes rType, unsigned rId);
00125 virtual ~legoRegion (void);
00126
00127
00128
00129 int GetRegionId(void) { return regionId; }
00130
00131 enum regionTypes GetRegionType(void) { return regionType; }
00132
00133 edgeList *GetInEdgesPtr(void) { return inEdgesPtr; }
00134
00135 edgeList *GetOutEdgesPtr(void) { return outEdgesPtr; }
00136
00137 flags *GetFlagPtr(void) { return flagPtr; }
00138
00139 opList *GetEntryOpsPtr(void) { return entryOpsPtr; }
00140
00141 opList *GetExitOpsPtr(void) { return exitOpsPtr; }
00142
00143 attrList *GetRegionAttrListPtr(void) { return regionAttrListPtr; }
00144
00145 double GetWeight(void) { return weight; }
00146
00147 legoRegion *GetParentPtr(void) { return parentPtr; }
00148
00149 regionList *GetDominators(void) { return dominators; }
00150
00151 legoOp* GetListOpPtr(void) { return allListPtr; }
00152
00153 int GetNestingLevel(void) { return nestingLevel; }
00154 void *GetDAG(void) { return DAG; }
00155
00156
00157
00158 void SetRegionId(int id) { regionId = id; }
00159 void SetRegionType(enum regionTypes rType){ regionType = rType; }
00160 void SetInEdgesPtr(edgeList* iEdgePtr) { inEdgesPtr = iEdgePtr; }
00161 void SetOutEdgesPtr(edgeList* oEdgePtr) { outEdgesPtr = oEdgePtr; }
00162 void SetFlagPtr(flags* fPtr) { flagPtr = fPtr; }
00163 void SetEntryOpsPtr(opList* entPtr) { entryOpsPtr = entPtr; }
00164 void SetExitOpsPtr(opList* extPtr) { exitOpsPtr = extPtr; }
00165 void SetRegionAttrListPtr(attrList *newAttrListPtr)
00166 { regionAttrListPtr = newAttrListPtr; }
00167 void SetWeight(double regWeight) { weight = regWeight; }
00168 void SetParentPtr(legoRegion *regionPtr) { parentPtr = regionPtr; }
00169 void SetDominators(regionList *doms) { dominators = doms; }
00170 void SetListOpPtr(legoOp *newListPtr) { allListPtr = newListPtr; }
00171 void SetNestingLevel (int nl) { nestingLevel = nl; }
00172 void SetDAG(void* D) { DAG = D; }
00173
00174
00175
00176 legoOp *FindOpId(int);
00177 legoRegion *FindMaxRegionId(void);
00178 virtual int GetOpCount (void)
00179 {
00180 LegoNonFatal ("legoRegion::GetOpCount",
00181 "Cannot get op count of legoRegion.");
00182 return 0;
00183 };
00184
00185 int IsContainedIn (legoRegion *);
00186 int Contains (legoRegion *);
00187
00188 class regionList *GetParents(void);
00189 void SetParents (regionList *);
00190
00191 class regionList *GetChildren(void);
00192 void SetChildren (regionList *);
00193
00194 void Mark (long long m) {markfield |= m; return;}
00195 void Unmark (long long m) {markfield &= (~m); return;}
00196 void UnmarkAll (void) {markfield = (long long) 0; return;}
00197 int IsMarked (long long m) {return ((markfield & m) != (long long) 0);}
00198
00199 void RefreshOpsAndEdges (void)
00200 {
00201 RefreshOps();
00202 RefreshEdges();
00203 }
00204 virtual void RefreshOps (void)
00205 {
00206 LegoNonFatal ("legoRegion::RefreshOps",
00207 "Cannot refresh ops of legoRegion.");
00208 }
00209 virtual void RefreshEdges (void)
00210 {
00211 LegoNonFatal ("legoRegion::RefreshEdges",
00212 "Cannot refresh edges of legoRegion.");
00213 }
00214 void RefreshAll (void);
00215
00216 int IsOwner (void) {return (Data.IsOwner());}
00217 void OpKiller (void);
00218 void RegionKiller (void);
00219 };
00220
00221
00222
00223 class regionList
00224 {
00225 legoRegion *regionPtr;
00226 int valid;
00227 class regionList *nextListPtr;
00228
00229 public:
00230 regionList()
00231 {
00232
00233 regionPtr = NULL; valid = 1; nextListPtr = NULL;
00234 }
00235 regionList(const regionList &orig)
00236 {
00237
00238 regionPtr = orig.regionPtr;
00239 valid = orig.valid;
00240 if (orig.nextListPtr != NULL)
00241 nextListPtr = new regionList (*(orig.nextListPtr));
00242 else
00243 nextListPtr = NULL;
00244 }
00245 regionList (legoRegion *it, class regionList *n = NULL)
00246 {
00247
00248 regionPtr = it;
00249 valid = 1;
00250 nextListPtr = n;
00251 }
00252 ~regionList()
00253 {
00254 regionList *temp;
00255
00256 while (nextListPtr != NULL)
00257 {
00258 temp = nextListPtr;
00259 nextListPtr = temp->nextListPtr;
00260 temp->nextListPtr = NULL;
00261 delete temp;
00262 }
00263
00264 }
00265 void SetRegionPtr (legoRegion *it) {regionPtr = it;}
00266 legoRegion *GetRegionPtr (void) {return regionPtr;}
00267
00268 void SetValid (int v) {valid = v;}
00269 int GetValid (void) {return valid;}
00270
00271 void SetNextListPtr (class regionList *n) {nextListPtr = n;}
00272 class regionList *GetNextListPtr (void) {return nextListPtr;}
00273
00274 void Prepend (class regionList *p)
00275 {
00276 p->Append (this);
00277 }
00278 void Append (class regionList *n)
00279 {
00280 nextListPtr = n;
00281 }
00282 regionList *Detect (legoRegion *r)
00283 {
00284 regionList *candidate;
00285
00286 for (candidate = this; candidate != NULL;
00287 candidate = candidate->nextListPtr)
00288 {
00289 if (candidate->regionPtr == r)
00290 return candidate;
00291 }
00292 return NULL;
00293 }
00294 void Concatenate (class regionList *);
00295 regionList *Intersect (class regionList *);
00296 };
00297
00298 #endif // LEGOREGION_H