Main Page | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

region.H

Go to the documentation of this file.
00001 /*--------------------------------------------------------------------
00002  *   Name:        region.H
00003  *
00004  *   Designer:    Willie Glover
00005  *
00006  *   Created:     5/15/96
00007  *
00008  *   Description: This file contains the LEGO header file which
00009  *                defines the region base class used for the LEGO IR.
00010  *
00011  *   Location:    /ncsu/tinker/LEGO/src/derived/region.H
00012  *
00013  *   Methods:     /ncsu/tinker/LEGO/src/derived/region.C
00014  ---------------------------------------------------------------------
00015  *
00016  * 5/15/96 WTG: Created this file.
00017  * 11/7/96 SSW: added the region type TREE
00018  * 11/16/96 WAH:  Added legoRegionRef class.
00019  * 12/5/96 WAH: Added copy constructor.
00020  * 12/9/96 WAH: Added tail duplication method.
00021  * 12/11/96 WAH:  Added allListPtr.
00022  * 12/13/96 WAH:  Added detect method to legoRegionRef.
00023  * 2/13/97 WAH: Made name change from legoRegionRef to regionList et al.
00024  * 2/17/97 WAH: Added FindMaxRegionId method.
00025  * 2/26/97 WAH: Made regionList::Detect nonrecursive.
00026  * 3/20/97 WAH: Added markfield to legoRegion.
00027  * 3/22/97 WAH: Added RefreshOps method et al, IsContainedIn, Contains.
00028  * 4/9/97 WAH: Added IsOwner, OpKiller and RegionKiller methods.
00029  * 4/11/97 WAH: Added kissofdeath mark.
00030  * 4/18/97 WAH: Added sb mark.
00031  * 4/25/97 WAH: Added nestingLevel field and associated methods.
00032  * 4/29/97 WAH: Added dominators field and associated methods; added
00033  *              regionList::Intersect.
00034  * 5/14/97 WAH: Added RefreshAll method.
00035  * 6/3/97 WAH:  Changed TailDuplicate to take in an edge, not an op.
00036  * 6/11/97 WAH: Added GetOpCount method.
00037  * 8/1/97 WAH:  Added loopheader mark.
00038  * 9/9/97 WAH:  Added inner and outer marks.
00039  * 11/8/97 WAH: Added valid field to regionList.
00040  * 1/16/98 WAH: Changed SetParents and SetChildren to delete old lists;
00041  *              added hammock mark.
00042  * 5/14/98 WAH: Removed TailDuplicate (moved to LEGO Util).
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 // The following #defines are used to mark a region as visited or
00076 // whatever. To mark a region, call Mark with one of the following
00077 // parameters. To unmark it, call Unmark. To clear all marks,
00078 // call UnmarkAll. To check a mark, call IsMarked.
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;                         // unigue sequence number for this region
00096   enum regionTypes regionType;          // identifies this region type.  used to
00097                                         //    determine whether legoSet points to
00098                                         //    a set of ops or regions
00099 
00100   edgeList      *inEdgesPtr;            // ptr to list of (edge ID, edge pointer)
00101   edgeList      *outEdgesPtr;           // ptr to list of (edge ID, edge pointer)
00102   flags         *flagPtr;               // ptr to list of region flags
00103   opList        *entryOpsPtr;           // ptr to list of entry ops
00104   opList        *exitOpsPtr;            // ptr to list of exit ops
00105   attrList      *regionAttrListPtr;     // ptr to attribute list
00106 
00107   double        weight;                 // weight assigned to region
00108   legoRegion    *parentPtr;             // ptr to parent region
00109 
00110   regionList    *parents;               // parents in control flow
00111   regionList    *children;              // children in control flow
00112   regionList    *dominators;            // dominators in control flow
00113   legoOp        *allListPtr;            // pointer to list of all ops
00114 
00115   long long     markfield;              // array of 64 mark bits
00116   int           nestingLevel;           // level of loop nesting
00117 
00118   void          *DAG;                   // ptr to DAG (arbitrary structure)
00119 
00120 public:
00121 
00122   legoRegion ();
00123   legoRegion (const legoRegion &orig);
00124   legoRegion (enum regionTypes rType, unsigned rId);
00125   virtual ~legoRegion (void);
00126 
00127 //  Get functions for legoRegion
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 //  Set functions for legoRegion
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 //  other region methods
00175 
00176   legoOp *FindOpId(int);
00177   legoRegion *FindMaxRegionId(void);  // see region.taildup.C
00178   virtual int GetOpCount (void)
00179   {
00180     LegoNonFatal ("legoRegion::GetOpCount",
00181                   "Cannot get op count of legoRegion.");
00182     return 0;
00183   };
00184   //  legoRegion *TailDuplicate (opEdges *);
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   } // end RefreshOpsAndEdges
00204   virtual void RefreshOps (void)
00205     {
00206       LegoNonFatal ("legoRegion::RefreshOps",
00207                     "Cannot refresh ops of legoRegion.");
00208     } // end RefreshOps
00209   virtual void RefreshEdges (void)
00210     {
00211       LegoNonFatal ("legoRegion::RefreshEdges",
00212                     "Cannot refresh edges of legoRegion.");
00213     } // end RefreshEdges
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     //    fprintf(stderr,"Creating REGIONLIST %p\n",this);
00233     regionPtr = NULL; valid = 1; nextListPtr = NULL;
00234   }
00235   regionList(const regionList &orig)
00236   {
00237     //    fprintf(stderr,"Creating REGIONLIST %p\n",this);
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   } // end copy constructor
00245   regionList (legoRegion *it, class regionList *n = NULL)
00246   {
00247     //    fprintf(stderr,"Creating REGIONLIST %p\n",this);
00248     regionPtr = it;
00249     valid = 1;
00250     nextListPtr = n;
00251   } // end constructor (legoRegion *, regionList *)
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       } // end while
00263     //    fprintf(stderr,"Deleting REGIONLIST %p\n",this);
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   } // end Prepend
00278   void Append (class regionList *n)
00279   {
00280     nextListPtr = n;
00281   } // end Append
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       } // end for
00292     return NULL;
00293   } // end Detect
00294   void Concatenate (class regionList *);
00295   regionList *Intersect (class regionList *);
00296 }; // end class regionList
00297 
00298 #endif // LEGOREGION_H

Generated on Mon Jul 21 20:28:51 2003 for TINKER LEGO DOC by doxygen 1.3.2