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 # ifdef DELTA_COMPILER
00028 
00029 class NodeVisitor;
00030 
00031 class BB: public PrintableResourceObj {
00032  protected:
00033   bool _visited;
00034 
00035  public:                        
00036   Node  *first, *last;
00037   int16 nnodes;                 
00038  protected:
00039   int16 _id;                    
00040   int16 _loopDepth;             
00041   int16 _genCount;              
00042 
00043  public:        
00044   BBDUTable  duInfo;            
00045   static int genCounter;        
00046 
00047  public:
00048   BB(Node* f, Node* l, int n) { init(f, l, n); _visited = false; }
00049 
00050   BB*  after_visit()                    { _visited = true;  return this; }
00051   BB*  before_visit()                   { _visited = false; return this; }
00052   bool visited() const                  { return _visited; }
00053 
00054   
00055   bool hasSingleSuccessor() const;
00056   bool hasSinglePredecessor() const;
00057   int nPredecessors() const;
00058   int nSuccessors() const;
00059   bool isPredecessor(const BB* n) const;
00060   bool isSuccessor(const BB* n) const;
00061   BB* next() const;
00062   BB* next1() const;
00063   BB* next(int i) const;
00064   BB* firstPrev() const;
00065   BB* prev(int i) const;
00066    
00067   int  id() const               { return this == NULL ? -1 : _id; }
00068   int  loopDepth() const        { return _loopDepth; }
00069   void setGenCount()            { _genCount = genCounter++; }
00070   int  genCount() const         { return _genCount; }
00071 
00072   void localCopyPropagate();
00073   void bruteForceCopyPropagate();
00074 
00075   void makeUses();
00076   Use* addUse(NonTrivialNode* n, PReg* r, bool soft = false);
00077   Def* addDef(NonTrivialNode* n, PReg* r);
00078   void remove(Node* n);                         
00079   void addAfter(Node* prev, Node* newNode);     
00080   void localAlloc(GrowableArray<BitVector*>* hardwired, 
00081                   GrowableArray<PReg*>* localRegs,
00082                   GrowableArray<BitVector*>* lives);
00083  protected:
00084   void init(Node* f, Node* l, int n);
00085   void slowLocalAlloc(GrowableArray<BitVector*>* hardwired, 
00086                       GrowableArray<PReg*>* localRegs,
00087                       GrowableArray<BitVector*>* lives);
00088   void doAlloc(PReg* r, Location l);
00089  public:
00090   void computeEscapingBlocks(GrowableArray<BlockPReg*>* l);
00091 
00092   void apply(NodeVisitor* v);
00093   bool verifyLabels();
00094 
00095   bool contains(const Node* n) const;
00096   void verify();
00097   void dfs(GrowableArray<BB*>* list, int depth);
00098   void print_short();
00099   void print_code(bool suppressTrivial);
00100   void print();
00101 
00102  protected:
00103   int addUDHelper(PReg* r);
00104   void renumber();
00105   friend class BBIterator;
00106 };
00107 
00108 
00109 typedef void (*BBDoFn)(BB* b);
00110 
00111   
00112 class BBIterator: public PrintableResourceObj {
00113   Node* _first;                                         
00114  public:                                                
00115   GrowableArray<BB*>* bbTable;                          
00116   int bbCount;                                          
00117   GrowableArray<PReg*>* pregTable;                      
00118   GrowableArray<PReg*>* globals;                        
00119                                                         
00120   bool usesBuilt;                                       
00121   bool blocksBuilt;                                     
00122   GrowableArray<BlockPReg*>* exposedBlks;               
00123 
00124  public:
00125   BBIterator() {
00126     bbTable = NULL; bbCount = 0; usesBuilt = blocksBuilt = false;
00127   }
00128 
00129   void build(Node* first);                              
00130 
00131  protected:
00132   void buildBBs();
00133   void buildTable();
00134 
00135   static BB* bb_for(Node* n);
00136   void add_BBs_to_list(GrowableArray<BB*>& list, GrowableArray<BB*>& work);
00137 
00138  public:
00139   bool isSequential(int curr, int next) const;          
00140   bool isSequentialCode(BB* curr, BB* next) const;      
00141   GrowableArray<BB*>* code_generation_order();          
00142 
00143   void clear();                                         
00144   void apply(BBDoFn f);
00145     
00146   void makeUses();
00147   void eliminateUnneededResults();
00148   void computeEscapingBlocks();
00149   void computeUplevelAccesses();
00150   void localAlloc();
00151   void localCopyPropagate();
00152   void globalCopyPropagate();
00153   void bruteForceCopyPropagate();
00154   void gen(Node* first);
00155   void apply(NodeVisitor* v);
00156   bool verifyLabels();
00157 
00158   void print();
00159   void print_code(bool suppressTrivial);
00160   void verify();
00161 };
00162 
00163 extern BBIterator* bbIterator;
00164 
00165 
00166 
00167 
00168 class Node;
00169 class PrologueNode;
00170 class LoadIntNode;
00171 class LoadOffsetNode;
00172 class LoadUplevelNode;
00173 class AssignNode;
00174 class StoreOffsetNode;
00175 class StoreUplevelNode;
00176 class ArithRRNode;
00177 class ArithRCNode;
00178 class FloatArithRRNode;
00179 class FloatUnaryArithNode;
00180 class TArithRRNode;
00181 class ContextCreateNode;
00182 class ContextInitNode;
00183 class ContextZapNode;
00184 class BlockCreateNode;
00185 class BlockMaterializeNode;
00186 class SendNode;
00187 class PrimNode;
00188 class DLLNode;
00189 class LoopHeaderNode;
00190 class ReturnNode;
00191 class NLRSetupNode;
00192 class InlinedReturnNode;
00193 class NLRContinuationNode;
00194 class BranchNode;
00195 class TypeTestNode;
00196 class NLRTestNode;
00197 class MergeNode;
00198 class ArrayAtNode;
00199 class ArrayAtPutNode;
00200 class InlinedPrimitiveNode;
00201 class UncommonNode;
00202 class FixedCodeNode;
00203 class NopNode;
00204 class CommentNode;
00205 
00206 
00207 class NodeVisitor: public ResourceObj {
00208  public:
00209   
00210   virtual void beginOfBasicBlock(Node* node) = 0;       
00211   virtual void endOfBasicBlock(Node* node) = 0;         
00212   
00213  public:
00214   
00215   virtual void beginOfNode(Node* node) = 0;             
00216   virtual void endOfNode(Node* node) = 0;               
00217 
00218  public:
00219   
00220   virtual void aPrologueNode(PrologueNode* node) = 0;
00221 
00222   virtual void aLoadIntNode(LoadIntNode* node) = 0;
00223   virtual void aLoadOffsetNode(LoadOffsetNode* node) = 0;
00224   virtual void aLoadUplevelNode(LoadUplevelNode* node) = 0;
00225 
00226   virtual void anAssignNode(AssignNode* node) = 0;
00227   virtual void aStoreOffsetNode(StoreOffsetNode* node) = 0;
00228   virtual void aStoreUplevelNode(StoreUplevelNode* node) = 0;
00229   
00230   virtual void anArithRRNode(ArithRRNode* node) = 0;
00231   virtual void aFloatArithRRNode(FloatArithRRNode* node) = 0;
00232   virtual void aFloatUnaryArithNode(FloatUnaryArithNode* node) = 0;
00233   virtual void anArithRCNode(ArithRCNode* node) = 0;
00234   virtual void aTArithRRNode(TArithRRNode* node) = 0;
00235   
00236   virtual void aContextCreateNode(ContextCreateNode* node) = 0;
00237   virtual void aContextInitNode(ContextInitNode* node) = 0;
00238   virtual void aContextZapNode(ContextZapNode* node) = 0;
00239 
00240   virtual void aBlockCreateNode(BlockCreateNode* node) = 0;
00241   virtual void aBlockMaterializeNode(BlockMaterializeNode* node) = 0;
00242   
00243   virtual void aSendNode(SendNode* node) = 0;
00244   virtual void aPrimNode(PrimNode* node) = 0;
00245   virtual void aDLLNode(DLLNode* node) = 0;
00246 
00247   virtual void aLoopHeaderNode(LoopHeaderNode* node) = 0;
00248 
00249   virtual void aReturnNode(ReturnNode* node) = 0;
00250   virtual void aNLRSetupNode(NLRSetupNode* node) = 0;
00251   virtual void anInlinedReturnNode(InlinedReturnNode* node) = 0;
00252   virtual void aNLRContinuationNode(NLRContinuationNode* node) = 0;
00253   
00254   virtual void aBranchNode(BranchNode* node) = 0;
00255   virtual void aTypeTestNode(TypeTestNode* node) = 0;
00256   virtual void aNLRTestNode(NLRTestNode* node) = 0;
00257   virtual void aMergeNode(MergeNode* node) = 0;
00258   
00259   virtual void anArrayAtNode(ArrayAtNode* node) = 0;
00260   virtual void anArrayAtPutNode(ArrayAtPutNode* node) = 0;
00261 
00262   virtual void anInlinedPrimitiveNode(InlinedPrimitiveNode* node) = 0;
00263   virtual void anUncommonNode(UncommonNode* node) = 0;
00264   virtual void aFixedCodeNode(FixedCodeNode* node) = 0;
00265 
00266   virtual void aNopNode(NopNode* node) = 0;
00267   virtual void aCommentNode(CommentNode* node) = 0;
00268 };
00269 
00270 
00271 # endif