scale.score.chords
Class LoopTailChord

java.lang.Object
  extended by scale.common.Root
      extended by scale.score.Note
          extended by scale.score.chords.Chord
              extended by scale.score.chords.SequentialChord
                  extended by scale.score.chords.LoopTailChord
All Implemented Interfaces:
AnnotationInterface, DisplayNode

public class LoopTailChord
extends SequentialChord

This class is used to collect the loop edges so that the loop header has two and only two in-coming CFG edges.

$Id: LoopTailChord.java,v 1.33 2007-10-04 19:58:23 burrill Exp $

Copyright 2007 by the Scale Compiler Group,
Department of Computer Science
University of Massachusetts,
Amherst MA. 01003, USA
All Rights Reserved.

This class represents a non-action. No code is generated for this node.

We need to mark the end of a loop so that there are only two in-coming CFG edges to a LoopHeaderChord instance. For example, consider the following C code:

 void tail(int k)
 {
   int i;
   i = 0;
   while (i++ < k) {
     if (i == 2)
       continue;
     ftn(i);
   }
 }
 
We want to represent this as

LoopTailChord Example

See Also:
LoopHeaderChord, LoopPreHeaderChord, LoopExitChord, LoopInitChord

Field Summary
 
Fields inherited from class scale.score.chords.Chord
lineNumber
 
Constructor Summary
LoopTailChord()
           
LoopTailChord(Chord next)
           
 
Method Summary
 Chord copy()
          Make a copy of this CFG node with the same out-going CFG edges.
 DColor getDisplayColorHint()
          Return a String specifying the color to use for coloring this node in a graphical display.
 LoopHeaderChord getLoopHeader()
          Return the LoopHeaderChord associated with this loop tail.
 boolean isLastInBasicBlock()
          Return true if this is the last Chord in this Basic Block.
 boolean isLoopTail()
          Return true if this CFG node is a LoopTailChord instance.
 boolean isSpecial()
          Return true if this is chord was added for the convenience of the compiler and does not correspond to actual source code in the user program.
 void unlinkChord()
          Break any un-needed links from a Chord that is being deleted.
 void visit(Predicate p)
          Process a node by calling its associated routine.
 
Methods inherited from class scale.score.chords.SequentialChord
changeOutCfgEdge, clearEdge, clearEdgeMarkers, deleteInDataEdges, deleteOutCfgEdges, edgeMarked, executionCostEstimate, getDeclList, getExprList, getLoadExprList, getNextChord, getOutCfgEdge, getOutCfgEdgeArray, getTarget, indexOfOutCfgEdge, isSequential, linkSubgraph, linkTo, markEdge, numOutCfgEdges, pushAllOutCfgEdges, pushOutCfgEdges, pushOutCfgEdges, pushSortedOutCfgEdges, pushSortedOutCfgEdges, removeUseDef, replaceDecl, replaceOutCfgEdge, setTarget, setTargetUnsafe
 
Methods inherited from class scale.score.chords.Chord
addInCfgEdge, changeInDataEdge, changeParentOutCfgEdge, copySourceLine, deadCFGNodes, deletedCFGNodes, deleteInCfgEdge, executionOrder, expungeFromCfg, extractFromCfg, findLoopExit, findPhiChords, firstInBasicBlock, getCall, getDefExpr, getDisplayLabel, getDisplayShapeHint, getFirstInCfgEdge, getInCfgEdge, getInCfgEdge, getInCfgEdgeArray, getInDataEdge, getInDataEdgeArray, getLabel, getLoopHeader, getLoopNumber, getSourceLineNumber, gotoCFGNodes, inBasicBlock, indexOfInCfgEdge, insertAfterOutCfg, insertBeforeInCfg, isAssignChord, isBranch, isExprChord, isFirstInBasicBlock, isLoopExit, isLoopHeader, isLoopPreHeader, isMarker, isPhiExpr, lastInBasicBlock, loopClean, nextVisit, nthIndexOfInCfgEdge, nullCFGNodes, numInCfgEdges, numInDataEdges, numOfInCfgEdge, parentsFinished, parentsVisited, pushAllInCfgEdges, pushChordWhenReady, pushChordWhenReady, pushInCfgEdges, pushInCfgEdges, pushInDataEdges, recordRefs, removeDeadCode, removeDualExprs, removeFromCfg, removeRefs, reorderInCfgEdgesOfCopy, replaceInCfgEdge, setLabel, setSourceLineNumber, setVisited, toStringSpecial, visited
 
Methods inherited from class scale.score.Note
getChord, getEssentialUse, setAnnotationLevel, setReportLevel, toString, validate
 
Methods inherited from class scale.common.Root
addAnnotation, allAnnotations, allMatchingAnnotations, getAnnotation, getDisplayName, getDisplayString, getNodeCount, getNodeID, hasAnnotation, hasEqualAnnotation, hashCode, removeAnnotation, removeAnnotations, toStringAnnotations, toStringClass, trace, trace, trace
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Constructor Detail

LoopTailChord

public LoopTailChord(Chord next)

LoopTailChord

public LoopTailChord()
Method Detail

copy

public Chord copy()
Description copied from class: Chord
Make a copy of this CFG node with the same out-going CFG edges. The validity of the CFG graph is maintained.

Specified by:
copy in class Chord
Returns:
a copy of this node

getLoopHeader

public LoopHeaderChord getLoopHeader()
Return the LoopHeaderChord associated with this loop tail.

Overrides:
getLoopHeader in class Chord

isLastInBasicBlock

public boolean isLastInBasicBlock()
Return true if this is the last Chord in this Basic Block.

Overrides:
isLastInBasicBlock in class SequentialChord
See Also:
Chord.lastInBasicBlock(), Chord.isFirstInBasicBlock(), Chord.firstInBasicBlock()

isSpecial

public boolean isSpecial()
Return true if this is chord was added for the convenience of the compiler and does not correspond to actual source code in the user program.

Overrides:
isSpecial in class Chord

isLoopTail

public boolean isLoopTail()
Return true if this CFG node is a LoopTailChord instance.

Overrides:
isLoopTail in class Chord

unlinkChord

public void unlinkChord()
Break any un-needed links from a Chord that is being deleted.

Overrides:
unlinkChord in class Chord

visit

public void visit(Predicate p)
Description copied from class: Note
Process a node by calling its associated routine. See the "visitor" design pattern in Design Patterns: Elements of Reusable Object-Oriented Software by E. Gamma, et al, Addison Wesley, ISBN 0-201-63361-2.

Each class has a visit(Predicate p) method. For example, in class ABC:

   public void visit(Predicate p)
   {
     p.visitABC(this);
   }
 
and the class that implements Predicate has a method
   public void visitABC(Note n)
   {
     ABC a = (ABC) n;
     ...
   }
 
Thus, the class that implements Predicate can call
   n.visit(this);
 
where n is a Note sub-class without determining which specific sub-class n is. The visit pattern basically avoids implementing a large switch statement or defining different methods in each class for some purpose.

Specified by:
visit in class Note
See Also:
Predicate

getDisplayColorHint

public DColor getDisplayColorHint()
Return a String specifying the color to use for coloring this node in a graphical display.

Specified by:
getDisplayColorHint in interface DisplayNode
Overrides:
getDisplayColorHint in class Chord
See Also:
DColor