OptLocalVariable cleanup: under optimization GETVAR/SETVAR nodes always has a reference to them

This commit is contained in:
igor%mir2.org 2004-05-08 22:24:02 +00:00
Родитель ff2a77ff29
Коммит c8f630ac9c
4 изменённых файлов: 74 добавлений и 111 удалений

Просмотреть файл

@ -267,13 +267,10 @@ class Block
{
Node child = n.getFirstChild();
if (child.getType() == Token.GETVAR) {
Object theVarProp = child.getProp(Node.VARIABLE_PROP);
if (theVarProp != null) {
int theVarIndex = ((OptLocalVariable)theVarProp).getIndex();
if (!itsNotDefSet.test(theVarIndex))
itsUseBeforeDefSet.set(theVarIndex);
itsNotDefSet.set(theVarIndex);
}
int theVarIndex = OptLocalVariable.get(child).getIndex();
if (!itsNotDefSet.test(theVarIndex))
itsUseBeforeDefSet.set(theVarIndex);
itsNotDefSet.set(theVarIndex);
}
}
break;
@ -282,25 +279,19 @@ class Block
Node lhs = n.getFirstChild();
Node rhs = lhs.getNext();
lookForVariableAccess(rhs, lastUse);
Object theVarProp = n.getProp(Node.VARIABLE_PROP);
if (theVarProp != null) {
int theVarIndex = ((OptLocalVariable)theVarProp).getIndex();
itsNotDefSet.set(theVarIndex);
if (lastUse[theVarIndex] != null)
lastUse[theVarIndex].putProp(Node.LASTUSE_PROP,
theVarProp);
}
OptLocalVariable theVar = OptLocalVariable.get(n);
int theVarIndex = theVar.getIndex();
itsNotDefSet.set(theVarIndex);
if (lastUse[theVarIndex] != null)
lastUse[theVarIndex].putProp(Node.LASTUSE_PROP, theVar);
}
break;
case Token.GETVAR :
{
Object theVarProp = n.getProp(Node.VARIABLE_PROP);
if (theVarProp != null) {
int theVarIndex = ((OptLocalVariable)theVarProp).getIndex();
if (!itsNotDefSet.test(theVarIndex))
itsUseBeforeDefSet.set(theVarIndex);
lastUse[theVarIndex] = n;
}
int theVarIndex = OptLocalVariable.get(n).getIndex();
if (!itsNotDefSet.test(theVarIndex))
itsUseBeforeDefSet.set(theVarIndex);
lastUse[theVarIndex] = n;
}
break;
default :
@ -372,12 +363,8 @@ class Block
case Token.GETELEM :
return Optimizer.AnyType;
case Token.GETVAR : {
OptLocalVariable theVar = (OptLocalVariable)
(n.getProp(Node.VARIABLE_PROP));
if (theVar != null)
return theVar.getTypeUnion();
}
case Token.GETVAR :
return OptLocalVariable.get(n).getTypeUnion();
case Token.INC :
case Token.DEC :
@ -416,7 +403,7 @@ class Block
}
}
boolean findDefPoints(Node n)
private static boolean findDefPoints(Node n)
{
boolean result = false;
switch (n.getType()) {
@ -431,10 +418,9 @@ class Block
case Token.DEC :
case Token.INC : {
Node firstChild = n.getFirstChild();
OptLocalVariable theVar = (OptLocalVariable)
(firstChild.getProp(Node.VARIABLE_PROP));
if (theVar != null) {
if (firstChild.getType() == Token.GETVAR) {
// theVar is a Number now
OptLocalVariable theVar = OptLocalVariable.get(firstChild);
result |= theVar.assignType(Optimizer.NumberType);
}
}
@ -447,10 +433,8 @@ class Block
Node rhs = nameChild.getNext();
if (baseChild != null) {
if (baseChild.getType() == Token.GETVAR) {
OptLocalVariable theVar = (OptLocalVariable)
(baseChild.getProp(Node.VARIABLE_PROP));
if (theVar != null)
theVar.assignType(Optimizer.AnyType);
OptLocalVariable theVar = OptLocalVariable.get(baseChild);
theVar.assignType(Optimizer.AnyType);
}
result |= findDefPoints(baseChild);
}
@ -461,13 +445,10 @@ class Block
case Token.SETVAR : {
Node firstChild = n.getFirstChild();
OptLocalVariable theVar = (OptLocalVariable)
(n.getProp(Node.VARIABLE_PROP));
if (theVar != null) {
Node rValue = firstChild.getNext();
int theType = findExpressionType(rValue);
result |= theVar.assignType(theType);
}
OptLocalVariable theVar = OptLocalVariable.get(n);
Node rValue = firstChild.getNext();
int theType = findExpressionType(rValue);
result |= theVar.assignType(theType);
}
break;
}
@ -476,7 +457,7 @@ class Block
// a total misnomer for now. To start with we're only trying to find
// duplicate getProp calls on 'this' that can be merged
void localCSE(Node parent, Node n, Hashtable theCSETable, OptFunctionNode theFunction)
private void localCSE(Node parent, Node n, Hashtable theCSETable, OptFunctionNode theFunction)
{
switch (n.getType()) {
default : {

Просмотреть файл

@ -1820,8 +1820,7 @@ class BodyCodegen
break;
case Token.GETVAR: {
OptLocalVariable lVar
= (OptLocalVariable)(node.getProp(Node.VARIABLE_PROP));
OptLocalVariable lVar = OptLocalVariable.get(node);
visitGetVar(lVar,
node.getIntProp(Node.ISNUMBER_PROP, -1) != -1,
node.getString());
@ -2217,8 +2216,7 @@ class BodyCodegen
boolean handled = false;
if ((child.getType() == Token.GETVAR)
&& inDirectCallFunction) {
OptLocalVariable lVar
= (OptLocalVariable)(child.getProp(Node.VARIABLE_PROP));
OptLocalVariable lVar = OptLocalVariable.get(child);
if (lVar != null && lVar.isParameter()) {
handled = true;
cfw.addALoad(lVar.getJRegister());
@ -2417,8 +2415,7 @@ class BodyCodegen
boolean handled = false;
if ((child.getType() == Token.GETVAR)
&& inDirectCallFunction) {
OptLocalVariable lVar
= (OptLocalVariable)(child.getProp(Node.VARIABLE_PROP));
OptLocalVariable lVar = OptLocalVariable.get(child);
if (lVar != null && lVar.isParameter()) {
child.removeProp(Node.ISNUMBER_PROP);
generateCodeFromNode(child, node);
@ -2762,8 +2759,7 @@ class BodyCodegen
{
Node child = node.getFirstChild();
if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1) {
OptLocalVariable lVar
= (OptLocalVariable)(child.getProp(Node.VARIABLE_PROP));
OptLocalVariable lVar = OptLocalVariable.get(child);
if (lVar.getJRegister() == -1)
lVar.assignJRegister(getNewWordPairLocal());
cfw.addDLoad(lVar.getJRegister());
@ -2772,10 +2768,9 @@ class BodyCodegen
cfw.add((isInc) ? ByteCode.DADD : ByteCode.DSUB);
cfw.addDStore(lVar.getJRegister());
} else {
OptLocalVariable lVar
= (OptLocalVariable)(child.getProp(Node.VARIABLE_PROP));
int childType = child.getType();
if (hasVarsInRegs && childType == Token.GETVAR) {
OptLocalVariable lVar = OptLocalVariable.get(child);
if (lVar == null)
lVar = fnCurrent.getVar(child.getString());
int reg = lVar.getJRegister();
@ -2916,8 +2911,7 @@ class BodyCodegen
private int nodeIsDirectCallParameter(Node node)
{
if (node.getType() == Token.GETVAR) {
OptLocalVariable lVar
= (OptLocalVariable)(node.getProp(Node.VARIABLE_PROP));
OptLocalVariable lVar = OptLocalVariable.get(node);
if (lVar != null && lVar.isParameter() && inDirectCallFunction &&
!itsForcedObjectParameters)
{
@ -3267,8 +3261,7 @@ class BodyCodegen
private void visitSetVar(Node node, Node child, boolean needValue)
{
OptLocalVariable lVar;
lVar = (OptLocalVariable)(node.getProp(Node.VARIABLE_PROP));
OptLocalVariable lVar = OptLocalVariable.get(node);
// XXX is this right? If so, clean up.
if (hasVarsInRegs && lVar == null)
lVar = fnCurrent.getVar(child.getString());

Просмотреть файл

@ -39,9 +39,11 @@ package org.mozilla.javascript.optimizer;
import org.mozilla.javascript.*;
import org.mozilla.classfile.JavaVariable;
final class OptLocalVariable implements JavaVariable {
final class OptLocalVariable implements JavaVariable
{
public OptLocalVariable(String name, boolean isParameter) {
OptLocalVariable(String name, boolean isParameter)
{
itsName = name;
itsIsParameter = isParameter;
// If the variable is a parameter, it could have any type.
@ -50,6 +52,13 @@ final class OptLocalVariable implements JavaVariable {
itsTypeUnion = isParameter ? Optimizer.AnyType : Optimizer.NoType;
}
static OptLocalVariable get(Node n)
{
int type = n.getType();
if (type != Token.GETVAR && type != Token.SETVAR) Kit.codeBug();
return (OptLocalVariable)n.getProp(Node.VARIABLE_PROP);
}
public String toString() {
return "LocalVariable : '" + getName()
+ "', index = " + getIndex()

Просмотреть файл

@ -328,11 +328,8 @@ class Optimizer
*/
private void markDCPNumberContext(Node n)
{
if (inDirectCallFunction && (n.getType() == Token.GETVAR))
{
OptLocalVariable theVar
= (OptLocalVariable)(n.getProp(Node.VARIABLE_PROP));
if ((theVar != null) && theVar.isParameter()) {
if (inDirectCallFunction && n.getType() == Token.GETVAR) {
if (OptLocalVariable.get(n).isParameter()) {
parameterUsedInNumberContext = true;
}
}
@ -340,11 +337,8 @@ class Optimizer
private boolean convertParameter(Node n)
{
if (inDirectCallFunction && (n.getType() == Token.GETVAR))
{
OptLocalVariable theVar
= (OptLocalVariable)(n.getProp(Node.VARIABLE_PROP));
if ((theVar != null) && theVar.isParameter()) {
if (inDirectCallFunction && n.getType() == Token.GETVAR) {
if (OptLocalVariable.get(n).isParameter()) {
n.removeProp(Node.ISNUMBER_PROP);
return true;
}
@ -367,18 +361,14 @@ class Optimizer
return NumberType;
case Token.GETVAR : {
OptLocalVariable theVar
= (OptLocalVariable)(n.getProp(Node.VARIABLE_PROP));
if (theVar != null) {
if (inDirectCallFunction && theVar.isParameter()) {
n.putIntProp(Node.ISNUMBER_PROP, Node.BOTH);
return NumberType;
}
else
if (theVar.isNumber()) {
n.putIntProp(Node.ISNUMBER_PROP, Node.BOTH);
return NumberType;
}
OptLocalVariable theVar = OptLocalVariable.get(n);
if (inDirectCallFunction && theVar.isParameter()) {
n.putIntProp(Node.ISNUMBER_PROP, Node.BOTH);
return NumberType;
}
else if (theVar.isNumber()) {
n.putIntProp(Node.ISNUMBER_PROP, Node.BOTH);
return NumberType;
}
return NoType;
}
@ -387,9 +377,8 @@ class Optimizer
case Token.DEC : {
Node child = n.getFirstChild(); // will be a GETVAR or GETPROP
if (child.getType() == Token.GETVAR) {
OptLocalVariable theVar
= (OptLocalVariable)(child.getProp(Node.VARIABLE_PROP));
if ((theVar != null) && theVar.isNumber()) {
OptLocalVariable theVar = OptLocalVariable.get(child);
if (theVar.isNumber()) {
n.putIntProp(Node.ISNUMBER_PROP, Node.BOTH);
markDCPNumberContext(child);
return NumberType;
@ -404,8 +393,7 @@ class Optimizer
Node lChild = n.getFirstChild();
Node rChild = lChild.getNext();
int rType = rewriteForNumberVariables(rChild);
OptLocalVariable theVar
= (OptLocalVariable)(n.getProp(Node.VARIABLE_PROP));
OptLocalVariable theVar = OptLocalVariable.get(n);
if (inDirectCallFunction && theVar.isParameter()) {
if (rType == NumberType) {
if (!convertParameter(rChild)) {
@ -418,26 +406,24 @@ class Optimizer
else
return rType;
}
else if (theVar.isNumber()) {
if (rType != NumberType) {
n.removeChild(rChild);
n.addChildToBack(new Node(TO_DOUBLE, rChild));
}
n.putIntProp(Node.ISNUMBER_PROP, Node.BOTH);
markDCPNumberContext(rChild);
return NumberType;
}
else {
if ((theVar != null) && theVar.isNumber()) {
if (rType != NumberType) {
if (rType == NumberType) {
if (!convertParameter(rChild)) {
n.removeChild(rChild);
n.addChildToBack(new Node(TO_DOUBLE, rChild));
n.addChildToBack(new Node(TO_OBJECT,
rChild));
}
n.putIntProp(Node.ISNUMBER_PROP, Node.BOTH);
markDCPNumberContext(rChild);
return NumberType;
}
else {
if (rType == NumberType) {
if (!convertParameter(rChild)) {
n.removeChild(rChild);
n.addChildToBack(new Node(TO_OBJECT,
rChild));
}
}
return NoType;
}
return NoType;
}
}
case Token.LE :
@ -685,16 +671,10 @@ class Optimizer
int type = n.getType();
if (type == Token.SETVAR) {
String name = n.getFirstChild().getString();
OptLocalVariable theVar = fn.getVar(name);
if (theVar != null) {
n.putProp(Node.VARIABLE_PROP, theVar);
}
n.putProp(Node.VARIABLE_PROP, fn.getVar(name));
} else if (type == Token.GETVAR) {
String name = n.getString();
OptLocalVariable theVar = fn.getVar(name);
if (theVar != null) {
n.putProp(Node.VARIABLE_PROP, theVar);
}
n.putProp(Node.VARIABLE_PROP, fn.getVar(name));
}
}
private static void buildStatementList_r(Node node, ObjArray statements)