Skip to content

Commit

Permalink
Report code changes through the NodeTraversal object for the peephole…
Browse files Browse the repository at this point in the history
… passes.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=153887459
  • Loading branch information
concavelenz authored and Tyler Breisacher committed Apr 25, 2017
1 parent 13399a3 commit 538fbf8
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 49 deletions.
Expand Up @@ -27,7 +27,8 @@
*/ */
abstract class AbstractPeepholeOptimization { abstract class AbstractPeepholeOptimization {


protected AbstractCompiler compiler; private NodeTraversal traversal;
private AbstractCompiler compiler;


/** /**
* Given a node to optimize and a traversal, optimize the node. Subclasses * Given a node to optimize and a traversal, optimize the node. Subclasses
Expand Down Expand Up @@ -57,8 +58,7 @@ protected void report(DiagnosticType diagnostic, Node n) {
* Subclasses must call these if they have changed the AST. * Subclasses must call these if they have changed the AST.
*/ */
protected void reportCodeChange() { protected void reportCodeChange() {
Preconditions.checkNotNull(compiler); traversal.reportCodeChange();
compiler.reportCodeChange();
} }


/** /**
Expand Down Expand Up @@ -86,15 +86,16 @@ protected boolean isASTNormalized() {
/** /**
* Informs the optimization that a traversal will begin. * Informs the optimization that a traversal will begin.
*/ */
void beginTraversal(AbstractCompiler compiler) { void beginTraversal(NodeTraversal traversal) {
this.compiler = compiler; this.traversal = traversal;
this.compiler = traversal.getCompiler();
} }


/** /**
* Informs the optimization that a traversal has completed. * Informs the optimization that a traversal has completed.
* @param compiler The current compiler.
*/ */
void endTraversal(AbstractCompiler compiler) { void endTraversal() {
this.traversal = null;
this.compiler = null; this.compiler = null;
} }


Expand Down Expand Up @@ -147,5 +148,4 @@ CodingConvention getCodingConvention() {
final boolean areDeclaredGlobalExternsOnWindow() { final boolean areDeclaredGlobalExternsOnWindow() {
return compiler != null && compiler.getOptions().declaredGlobalExternsOnWindow; return compiler != null && compiler.getOptions().declaredGlobalExternsOnWindow;
} }

} }
50 changes: 25 additions & 25 deletions src/com/google/javascript/jscomp/PeepholeFoldConstants.java
Expand Up @@ -181,7 +181,7 @@ private Node tryReduceVoid(Node n) {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
if ((!child.isNumber() || child.getDouble() != 0.0) && !mayHaveSideEffects(n)) { if ((!child.isNumber() || child.getDouble() != 0.0) && !mayHaveSideEffects(n)) {
n.replaceChild(child, IR.number(0)); n.replaceChild(child, IR.number(0));
compiler.reportCodeChange(); reportCodeChange();
} }
return n; return n;
} }
Expand Down Expand Up @@ -273,7 +273,7 @@ private void tryConvertToNumber(Node n) {
} }


n.replaceWith(replacement); n.replaceWith(replacement);
compiler.reportCodeChange(); reportCodeChange();
} }


/** /**
Expand Down Expand Up @@ -327,7 +327,7 @@ private Node tryFoldTypeof(Node originalTypeofNode) {
if (typeNameString != null) { if (typeNameString != null) {
Node newNode = IR.string(typeNameString); Node newNode = IR.string(typeNameString);
originalTypeofNode.replaceWith(newNode); originalTypeofNode.replaceWith(newNode);
compiler.reportCodeChange(); reportCodeChange();


return newNode; return newNode;
} }
Expand Down Expand Up @@ -361,13 +361,13 @@ private Node tryFoldUnaryOperator(Node n) {
} }
Node replacementNode = NodeUtil.booleanNode(!leftVal.toBoolean(true)); Node replacementNode = NodeUtil.booleanNode(!leftVal.toBoolean(true));
parent.replaceChild(n, replacementNode); parent.replaceChild(n, replacementNode);
compiler.reportCodeChange(); reportCodeChange();
return replacementNode; return replacementNode;
case POS: case POS:
if (NodeUtil.isNumericResult(left)) { if (NodeUtil.isNumericResult(left)) {
// POS does nothing to numeric values. // POS does nothing to numeric values.
parent.replaceChild(n, left.detach()); parent.replaceChild(n, left.detach());
compiler.reportCodeChange(); reportCodeChange();
return left; return left;
} }
return n; return n;
Expand All @@ -380,7 +380,7 @@ private Node tryFoldUnaryOperator(Node n) {
// "-NaN" is "NaN". // "-NaN" is "NaN".
n.removeChild(left); n.removeChild(left);
parent.replaceChild(n, left); parent.replaceChild(n, left);
compiler.reportCodeChange(); reportCodeChange();
return left; return left;
} }
} }
Expand All @@ -390,7 +390,7 @@ private Node tryFoldUnaryOperator(Node n) {


Node negNumNode = IR.number(negNum); Node negNumNode = IR.number(negNum);
parent.replaceChild(n, negNumNode); parent.replaceChild(n, negNumNode);
compiler.reportCodeChange(); reportCodeChange();
return negNumNode; return negNumNode;
} else { } else {
// left is not a number node, so do not replace, but warn the // left is not a number node, so do not replace, but warn the
Expand All @@ -405,7 +405,7 @@ private Node tryFoldUnaryOperator(Node n) {
int intVal = jsConvertDoubleToBits(val); int intVal = jsConvertDoubleToBits(val);
Node notIntValNode = IR.number(~intVal); Node notIntValNode = IR.number(~intVal);
parent.replaceChild(n, notIntValNode); parent.replaceChild(n, notIntValNode);
compiler.reportCodeChange(); reportCodeChange();
return notIntValNode; return notIntValNode;
} else { } else {
report(FRACTIONAL_BITWISE_OPERAND, left); report(FRACTIONAL_BITWISE_OPERAND, left);
Expand Down Expand Up @@ -454,7 +454,7 @@ private Node tryFoldInstanceof(Node n, Node left, Node right) {


if (replacementNode != null) { if (replacementNode != null) {
n.replaceWith(replacementNode); n.replaceWith(replacementNode);
compiler.reportCodeChange(); reportCodeChange();
return replacementNode; return replacementNode;
} }
} }
Expand Down Expand Up @@ -533,7 +533,7 @@ && areNodesEqualForInlining(left, right.getLastChild())) {
left.detach(), newRight.detach()); left.detach(), newRight.detach());
n.replaceWith(newNode); n.replaceWith(newNode);


compiler.reportCodeChange(); reportCodeChange();


return newNode; return newNode;
} }
Expand All @@ -558,7 +558,7 @@ private Node tryUnfoldAssignOp(Node n, Node left, Node right) {
new Node(op, left.cloneTree(), right.detach()) new Node(op, left.cloneTree(), right.detach())
.srcref(n)); .srcref(n));
n.replaceWith(replacement); n.replaceWith(replacement);
compiler.reportCodeChange(); reportCodeChange();


return replacement; return replacement;
} }
Expand Down Expand Up @@ -605,7 +605,7 @@ private Node tryFoldAndOr(Node n, Node left, Node right) {
// Fold it! // Fold it!
n.detachChildren(); n.detachChildren();
parent.replaceChild(n, result); parent.replaceChild(n, result);
compiler.reportCodeChange(); reportCodeChange();


return result; return result;
} else { } else {
Expand Down Expand Up @@ -641,7 +641,7 @@ private Node tryFoldChildAddString(Node n, Node left, Node right) {
String result = leftString + rightString; String result = leftString + rightString;
n.replaceChild(left, ll); n.replaceChild(left, ll);
n.replaceChild(right, IR.string(result)); n.replaceChild(right, IR.string(result));
compiler.reportCodeChange(); reportCodeChange();
return n; return n;
} }
} }
Expand All @@ -664,7 +664,7 @@ private Node tryFoldChildAddString(Node n, Node left, Node right) {
String result = leftString + rightString; String result = leftString + rightString;
n.replaceChild(right, rr); n.replaceChild(right, rr);
n.replaceChild(left, IR.string(result)); n.replaceChild(left, IR.string(result));
compiler.reportCodeChange(); reportCodeChange();
return n; return n;
} }
} }
Expand All @@ -685,7 +685,7 @@ private Node tryFoldAddConstantString(Node n, Node left, Node right) {
if (leftString != null && rightString != null) { if (leftString != null && rightString != null) {
Node newStringNode = IR.string(leftString + rightString); Node newStringNode = IR.string(leftString + rightString);
n.replaceWith(newStringNode); n.replaceWith(newStringNode);
compiler.reportCodeChange(); reportCodeChange();
return newStringNode; return newStringNode;
} }
} }
Expand All @@ -701,7 +701,7 @@ private Node tryFoldArithmeticOp(Node n, Node left, Node right) {
if (result != null) { if (result != null) {
result.useSourceInfoIfMissingFromForTree(n); result.useSourceInfoIfMissingFromForTree(n);
n.replaceWith(result); n.replaceWith(result);
compiler.reportCodeChange(); reportCodeChange();
return result; return result;
} }
return n; return n;
Expand Down Expand Up @@ -828,7 +828,7 @@ private Node tryFoldLeftChildOp(Node n, Node left, Node right) {
// added. // added.
replacement.useSourceInfoIfMissingFromForTree(right); replacement.useSourceInfoIfMissingFromForTree(right);
n.replaceChild(right, replacement); n.replaceChild(right, replacement);
compiler.reportCodeChange(); reportCodeChange();
} }
} }


Expand Down Expand Up @@ -905,7 +905,7 @@ private Node tryFoldShift(Node n, Node left, Node right) {


Node newNumber = IR.number(result); Node newNumber = IR.number(result);
n.replaceWith(newNumber); n.replaceWith(newNumber);
compiler.reportCodeChange(); reportCodeChange();


return newNumber; return newNumber;
} }
Expand All @@ -924,7 +924,7 @@ private Node tryFoldComparison(Node n, Node left, Node right) {


Node newNode = NodeUtil.booleanNode(result.toBoolean(true)); Node newNode = NodeUtil.booleanNode(result.toBoolean(true));
n.replaceWith(newNode); n.replaceWith(newNode);
compiler.reportCodeChange(); reportCodeChange();


return newNode; return newNode;
} }
Expand Down Expand Up @@ -1140,7 +1140,7 @@ private Node tryFoldCall(Node n) {
Node parent = n.getParent(); Node parent = n.getParent();
Node destObj = n.getSecondChild().detach(); Node destObj = n.getSecondChild().detach();
parent.replaceChild(n, destObj); parent.replaceChild(n, destObj);
compiler.reportCodeChange(); reportCodeChange();
} }
} }
return n; return n;
Expand Down Expand Up @@ -1188,7 +1188,7 @@ private Node tryFoldInForcedStringContext(Node n) {


parent.replaceChild(n, newString); parent.replaceChild(n, newString);
newString.useSourceInfoIfMissingFrom(parent); newString.useSourceInfoIfMissingFrom(parent);
compiler.reportCodeChange(); reportCodeChange();


return newString; return newString;
} }
Expand Down Expand Up @@ -1247,7 +1247,7 @@ private Node tryFoldGetProp(Node n, Node left, Node right) {
Preconditions.checkState(knownLength != -1); Preconditions.checkState(knownLength != -1);
Node lengthNode = IR.number(knownLength); Node lengthNode = IR.number(knownLength);
n.replaceWith(lengthNode); n.replaceWith(lengthNode);
compiler.reportCodeChange(); reportCodeChange();


return lengthNode; return lengthNode;
} }
Expand Down Expand Up @@ -1308,7 +1308,7 @@ private Node tryFoldArrayAccess(Node n, Node left, Node right) {


// Replace the entire GETELEM with the value // Replace the entire GETELEM with the value
n.replaceWith(elem); n.replaceWith(elem);
compiler.reportCodeChange(); reportCodeChange();
return elem; return elem;
} }


Expand Down Expand Up @@ -1359,7 +1359,7 @@ private Node tryFoldStringArrayAccess(Node n, Node left, Node right) {


// Replace the entire GETELEM with the value // Replace the entire GETELEM with the value
n.replaceWith(elem); n.replaceWith(elem);
compiler.reportCodeChange(); reportCodeChange();
return elem; return elem;
} }


Expand Down Expand Up @@ -1422,7 +1422,7 @@ private Node tryFoldObjectPropAccess(Node n, Node left, Node right) {
} }


n.replaceWith(replacement); n.replaceWith(replacement);
compiler.reportCodeChange(); reportCodeChange();
return n; return n;
} }
} }
41 changes: 25 additions & 16 deletions src/com/google/javascript/jscomp/PeepholeOptimizationsPass.java
Expand Up @@ -34,6 +34,9 @@ class PeepholeOptimizationsPass implements CompilerPass {


private boolean retraverseOnChange; private boolean retraverseOnChange;
private RecentChange handler; private RecentChange handler;
private FunctionCallback fnCallback;
private PeepCallback peepCallback;
private NodeTraversal traversal;


/** /**
* Creates a peephole optimization pass that runs the given * Creates a peephole optimization pass that runs the given
Expand All @@ -45,6 +48,10 @@ class PeepholeOptimizationsPass implements CompilerPass {
this.peepholeOptimizations = optimizations; this.peepholeOptimizations = optimizations;
this.retraverseOnChange = true; this.retraverseOnChange = true;
this.handler = new RecentChange(); this.handler = new RecentChange();
this.peepCallback = new PeepCallback();
this.traversal = new NodeTraversal(
compiler, peepCallback, new Es6SyntacticScopeCreator(compiler));
this.fnCallback = new ChangedFunctionCallback();
} }


void setRetraverseOnChange(boolean retraverse) { void setRetraverseOnChange(boolean retraverse) {
Expand All @@ -54,23 +61,25 @@ void setRetraverseOnChange(boolean retraverse) {
@Override @Override
public void process(Node externs, Node root) { public void process(Node externs, Node root) {
compiler.addChangeHandler(handler); compiler.addChangeHandler(handler);
beginTraversal(); beginTraversal(traversal);
NodeTraversal.traverseChangedFunctions(compiler, new FunctionCallback() { NodeTraversal.traverseChangedFunctions(compiler, fnCallback);
@Override
public void enterFunction(AbstractCompiler compiler, Node root) {
if (root.isFunction()) {
root = root.getLastChild();
}
do {
handler.reset();
NodeTraversal.traverseEs6(compiler, root, new PeepCallback());
} while (retraverseOnChange && handler.hasCodeChanged());
}
});
endTraversal(); endTraversal();
compiler.removeChangeHandler(handler); compiler.removeChangeHandler(handler);
} }


private class ChangedFunctionCallback implements FunctionCallback {
@Override
public void enterFunction(AbstractCompiler compiler, Node root) {
if (root.isFunction()) {
root = root.getLastChild();
}
do {
handler.reset();
traversal.traverse(root);
} while (retraverseOnChange && handler.hasCodeChanged());
}
}

private class PeepCallback extends AbstractShallowCallback { private class PeepCallback extends AbstractShallowCallback {
@Override @Override
public void visit(NodeTraversal t, Node n, Node parent) { public void visit(NodeTraversal t, Node n, Node parent) {
Expand All @@ -96,15 +105,15 @@ public void visit(NodeTraversal t, Node n, Node parent) {
* Make sure that all the optimizations have the current traversal so they * Make sure that all the optimizations have the current traversal so they
* can report errors. * can report errors.
*/ */
private void beginTraversal() { private void beginTraversal(NodeTraversal traversal) {
for (AbstractPeepholeOptimization optimization : peepholeOptimizations) { for (AbstractPeepholeOptimization optimization : peepholeOptimizations) {
optimization.beginTraversal(compiler); optimization.beginTraversal(traversal);
} }
} }


private void endTraversal() { private void endTraversal() {
for (AbstractPeepholeOptimization optimization : peepholeOptimizations) { for (AbstractPeepholeOptimization optimization : peepholeOptimizations) {
optimization.endTraversal(compiler); optimization.endTraversal();
} }
} }
} }

0 comments on commit 538fbf8

Please sign in to comment.