scale.score.expr
Class DualExpr

java.lang.Object
  extended by scale.common.Root
      extended by scale.score.Note
          extended by scale.score.expr.Expr
              extended by scale.score.expr.DualExpr
All Implemented Interfaces:
AnnotationInterface, DisplayNode

public class DualExpr
extends Expr

A dual expression is used when there is both a "high-level" and a "low-level" representation of an expression.

$Id: DualExpr.java,v 1.67 2007-10-17 13:39:59 burrill Exp $

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

Both the high-level and the low-level expressions are in-coming data edges. For example, for the subscript operation A[i], the DualExpr expression would have a SubscriptExpr in-coming data edge representing A[I]. It would also have a LoadDeclValueExpr in-coming data edge representing the load of the address of the temporary in which the address A+I*sizeof(A[i]) was placed by the low-level expression.


Field Summary
 
Fields inherited from class scale.score.expr.Expr
fpReorder, SE_DOMAIN, SE_NONE, SE_OVERFLOW, SE_STATE
 
Constructor Summary
DualExpr(Expr high, Expr low)
          Create a dual expression that has both a high- and low-level representation.
 
Method Summary
 long canonical()
          Return a unique value representing this particular expression.
 boolean containsDeclaration(Declaration decl)
          Return true if this expression contains a reference to the variable.
 Expr copy()
          Perform a deep copy of the expression tree.
 boolean dependsOnDeclaration(Declaration decl)
          Return true if this expression's value depends on the variable.
 boolean equivalent(Expr exp)
          Return true if the expressions are equivalent.
 int executionCostEstimate()
          Return a relative cost estimate for executing the expression.
 SubscriptExpr findSubscriptExpr()
          Return the SubscriptExpr that this load uses or null if none is found.
 AliasAnnote getAliasAnnote()
          Get the alias annotation associated with a Scribble operator.
 Literal getConstantValue()
          Return the constant value of the expression.
 Literal getConstantValue(HashMap<Expr,Literal> cvMap)
          Return the constant value of the expression.
 void getDeclList(java.util.AbstractCollection<Declaration> varList)
          Add all declarations referenced in this expression to the Vector.
 DColor getDisplayColorHint()
          Return an integer specifying the color to use for coloring this node in a graphical display.
 java.lang.String getDisplayLabel()
          Return a String suitable for labeling this node in a graphical display.
 DShape getDisplayShapeHint()
          Return a integer specifying a shape to use when drawing this node in a graphical display.
 Note getEssentialUse()
          Return this Note unless it is a non-essential expression.
 void getExprList(Vector<Expr> expList)
          Add all Expr instances in this expression to the Vector.
 Expr getHigh()
          Return the high-level representation.
 void getLoadExprList(Vector<LoadExpr> expList)
          Add all LoadExpr instances in this expression to the Vector.
 Expr getLow()
          Return the low-level representation.
 Expr getOperand(int position)
          Return the nth operand.
 Expr[] getOperandArray()
          Return an array of the operands to the expression.
 Expr getReference()
          Return the array associated with the subscript expression.
 boolean isDefined(Expr lv)
          The given expression is defined if the dual expression is defined and the given expression is either the low or high level expression.
 void loopClean()
          Clean up any loop related information.
 void lowerPermanently()
          Replace this DualExpr with its lowered form.
 int numOperands()
          Return the number of operands to this expression.
 boolean optimizationCandidate()
          Return true if the expression can be moved without problems.
 void pushOperands(Stack<Expr> wl)
          Push all of the operands of this expression on the Stack.
 void recordRefs(Chord stmt, References refs)
          Record any variable references in this expression in the table of reference.
 void removeRefs(Chord stmt, References refs)
          Remove any variable references in this expression from the table of references.
 void removeUseDef()
          Remove any use - def links, may - use links, etc.
 boolean replaceDecl(Declaration oldDecl, Declaration newDecl)
          Replace all occurrances of a Declaration with another Declaration.
protected  Expr setOperand(Expr operand, int position)
          Set the nth operand of an expression.
 int sideEffects()
          Return an indication of the side effects execution of this expression may cause.
 void unlinkExpression()
          If the node is no longer needed, sever its use-def link, etc.
 void validate()
          Check this node for validity.
 void visit(Predicate p)
          Process a node by calling its associated routine.
 
Methods inherited from class scale.score.expr.Expr
addCast, addCast, changeInDataEdge, conditionalCopy, conditionalUnlinkExpression, deleteOutDataEdge, executionOrder, executionOrdinal, findCriticalChord, findLinearCoefficient, getAffineExpr, getAffineRepresentation, getCall, getCoreType, getCriticalChord, getDefExpr, getDualExpr, getInDataEdge, getInDataEdgeArray, getLoopHeader, getLValue, getOutDataEdge, getPointedToCore, getReuseLevel, getRValue, getType, getUseDef, hasTrueFalseResult, isCast, isDefined, isLiteralExpr, isLoopInvariant, isMatchExpr, isMemoryDef, isMemRefExpr, isScalar, isSimpleExpr, mayGenerateCall, numInDataEdges, reduce, removeDualExprs, setCrossloopReuse, setOutDataEdge, setSpatialReuse, setStep, setTemporalReuse, setType, setUseDef, toStringSpecial, validLValue
 
Methods inherited from class scale.score.Note
getChord, setAnnotationLevel, setReportLevel, toString
 
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

DualExpr

public DualExpr(Expr high,
                Expr low)
Create a dual expression that has both a high- and low-level representation.

Parameters:
high - the high-level representation
low - the low-level representation
Method Detail

equivalent

public boolean equivalent(Expr exp)
Return true if the expressions are equivalent.

Overrides:
equivalent in class Expr
Returns:
true if classes are identical and the core types are equivalent

setOperand

protected Expr setOperand(Expr operand,
                          int position)
Description copied from class: Expr
Set the nth operand of an expression. This method eliminates the data edge between the previous operand expression and this expression. The new operand must not be null.

Overrides:
setOperand in class Expr
Parameters:
operand - - the new operand
position - - indicates which operand
Returns:
the previous operand

getOperand

public final Expr getOperand(int position)
Return the nth operand.

Overrides:
getOperand in class Expr
Parameters:
position - the index of the operand

getOperandArray

public final Expr[] getOperandArray()
Return an array of the operands to the expression.

Specified by:
getOperandArray in class Expr

numOperands

public int numOperands()
Return the number of operands to this expression.

Specified by:
numOperands in class Expr

copy

public Expr copy()
Description copied from class: Expr
Perform a deep copy of the expression tree. By deep copy, we mean that copies are made of the expression tree.

Specified by:
copy in class Expr
Returns:
a copy of this expression

getHigh

public final Expr getHigh()
Return the high-level representation.


getLow

public final Expr getLow()
Return the low-level representation.

Overrides:
getLow in class Expr

getReference

public Expr getReference()
Return the array associated with the subscript expression. We use the array name to represent the access of the array - instead of the array index value.

Overrides:
getReference in class Expr
Returns:
null since a general expression doesn't have a variable

getDisplayLabel

public java.lang.String getDisplayLabel()
Description copied from class: Expr
Return a String suitable for labeling this node in a graphical display. This method should be over-ridden as it simplay returns the class name.

Specified by:
getDisplayLabel in interface DisplayNode
Overrides:
getDisplayLabel in class Expr

getDisplayColorHint

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

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

getDisplayShapeHint

public DShape getDisplayShapeHint()
Return a integer specifying a shape to use when drawing this node in a graphical display.

Specified by:
getDisplayShapeHint in interface DisplayNode
Overrides:
getDisplayShapeHint in class Expr
See Also:
DShape

isDefined

public boolean isDefined(Expr lv)
The given expression is defined if the dual expression is defined and the given expression is either the low or high level expression.

Overrides:
isDefined in class Expr
Parameters:
lv - the low or high level expression
Returns:
true if the low expression is defined

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

getConstantValue

public Literal getConstantValue(HashMap<Expr,Literal> cvMap)
Return the constant value of the expression. Follow use-def links.

Overrides:
getConstantValue in class Expr
See Also:
Lattice

getConstantValue

public Literal getConstantValue()
Return the constant value of the expression. Do not follow use-def links.

Overrides:
getConstantValue in class Expr
See Also:
Lattice

canonical

public long canonical()
Return a unique value representing this particular expression.

Overrides:
canonical in class Expr

loopClean

public void loopClean()
Clean up any loop related information.

Overrides:
loopClean in class Expr

unlinkExpression

public void unlinkExpression()
If the node is no longer needed, sever its use-def link, etc.

Overrides:
unlinkExpression in class Expr

lowerPermanently

public void lowerPermanently()
Replace this DualExpr with its lowered form.


containsDeclaration

public boolean containsDeclaration(Declaration decl)
Return true if this expression contains a reference to the variable. Note - only the low expression is checked.

Overrides:
containsDeclaration in class Expr
See Also:
LoadExpr.setUseOriginal(boolean)

dependsOnDeclaration

public boolean dependsOnDeclaration(Declaration decl)
Return true if this expression's value depends on the variable. The use-def links are followed. Note - only the low expression is checked.

Overrides:
dependsOnDeclaration in class Expr
See Also:
LoadExpr.setUseOriginal(boolean)

optimizationCandidate

public boolean optimizationCandidate()
Return true if the expression can be moved without problems. Expressions that reference global variables, non-atomic variables, etc are not optimization candidates.

Specified by:
optimizationCandidate in class Expr

findSubscriptExpr

public SubscriptExpr findSubscriptExpr()
Return the SubscriptExpr that this load uses or null if none is found. This method uses the use-def link to find an existing SubscriptExpr
Overrides:
findSubscriptExpr in class Expr

getAliasAnnote

public AliasAnnote getAliasAnnote()
Get the alias annotation associated with a Scribble operator. Most Scribble operators do not have alias variables so this routine may return null. Typically, the alias variable information is attached to the declaration node associated with the load operations. However, we sometimes need to create alias variables to hold alias information that is not directly assigned to a user variable (e.g., **x).

Overrides:
getAliasAnnote in class Expr
Returns:
the alias annotation associated with the expression

getDeclList

public void getDeclList(java.util.AbstractCollection<Declaration> varList)
Add all declarations referenced in this expression to the Vector.

Specified by:
getDeclList in class Expr

getLoadExprList

public void getLoadExprList(Vector<LoadExpr> expList)
Add all LoadExpr instances in this expression to the Vector.

Specified by:
getLoadExprList in class Expr

getExprList

public void getExprList(Vector<Expr> expList)
Add all Expr instances in this expression to the Vector.

Specified by:
getExprList in class Expr

pushOperands

public void pushOperands(Stack<Expr> wl)
Push all of the operands of this expression on the Stack.

Specified by:
pushOperands in class Expr

replaceDecl

public boolean replaceDecl(Declaration oldDecl,
                           Declaration newDecl)
Replace all occurrances of a Declaration with another Declaration. Return true if a replace occurred.

Specified by:
replaceDecl in class Expr
Returns:
true if a replace occurred.

removeUseDef

public void removeUseDef()
Remove any use - def links, may - use links, etc.

Specified by:
removeUseDef in class Expr

validate

public void validate()
Check this node for validity. This method throws an exception if the node is not linked properly.

Overrides:
validate in class Expr

recordRefs

public void recordRefs(Chord stmt,
                       References refs)
Record any variable references in this expression in the table of reference.

Specified by:
recordRefs in class Expr

removeRefs

public void removeRefs(Chord stmt,
                       References refs)
Remove any variable references in this expression from the table of references.

Specified by:
removeRefs in class Expr

getEssentialUse

public Note getEssentialUse()
Return this Note unless it is a non-essential expression. For Chord this method returns this. For a DualExpr or an address cast (e.g., ConversionExpr) this method returns the out data edge.

Overrides:
getEssentialUse in class Note

executionCostEstimate

public int executionCostEstimate()
Return a relative cost estimate for executing the expression.

Specified by:
executionCostEstimate in class Note

sideEffects

public int sideEffects()
Return an indication of the side effects execution of this expression may cause.

Specified by:
sideEffects in class Expr
See Also:
Expr.SE_NONE