# HG changeset patch # User Lukas Stadler # Date 1401292043 -7200 # Node ID d5b824a415305db0af2496a0b338c07aeabe55ff # Parent da6941811da8546db483128b94aa71c717fc5945 CompareNode refactorings diff -r da6941811da8 -r d5b824a41530 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java Wed May 28 17:47:23 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java Wed May 28 17:47:23 2014 +0200 @@ -26,6 +26,8 @@ import com.oracle.graal.api.meta.ProfilingInfo.TriState; import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.calc.*; +import com.oracle.graal.debug.*; +import com.oracle.graal.debug.internal.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; @@ -62,6 +64,17 @@ */ public abstract boolean unorderedIsTrue(); + protected static final DebugHistogram histogram = Debug.createHistogram("histo"); + + static { + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + new DebugHistogramAsciiPrinter(System.out).print(histogram); + } + }); + } + private LogicNode optimizeConditional(Constant constant, ConditionalNode conditionalNode, ConstantReflectionProvider constantReflection, Condition cond) { Constant trueConstant = conditionalNode.trueValue().asConstant(); Constant falseConstant = conditionalNode.falseValue().asConstant(); @@ -105,38 +118,42 @@ return result; } if (x().isConstant()) { - if (y() instanceof ConditionalNode) { - return optimizeConditional(x().asConstant(), (ConditionalNode) y(), tool.getConstantReflection(), condition().mirror()); - } else if (y() instanceof NormalizeCompareNode) { - return optimizeNormalizeCmp(x().asConstant(), (NormalizeCompareNode) y(), true); + if ((result = canonicalizeSymmetricConstant(tool, x().asConstant(), y(), true)) != this) { + return result; } } else if (y().isConstant()) { - if (x() instanceof ConditionalNode) { - return optimizeConditional(y().asConstant(), (ConditionalNode) x(), tool.getConstantReflection(), condition()); - } else if (x() instanceof NormalizeCompareNode) { - return optimizeNormalizeCmp(y().asConstant(), (NormalizeCompareNode) x(), false); + if ((result = canonicalizeSymmetricConstant(tool, y().asConstant(), x(), false)) != this) { + return result; } - } - if (x() instanceof ConvertNode && y() instanceof ConvertNode) { + } else if (x() instanceof ConvertNode && y() instanceof ConvertNode) { ConvertNode convertX = (ConvertNode) x(); ConvertNode convertY = (ConvertNode) y(); if (convertX.preservesOrder(condition()) && convertY.preservesOrder(condition()) && convertX.getInput().stamp().isCompatible(convertY.getInput().stamp())) { - setX(convertX.getInput()); - setY(convertY.getInput()); + return graph().unique(duplicateModified(convertX.getInput(), convertY.getInput())); } - } else if (x() instanceof ConvertNode && y().isConstant()) { - ConvertNode convertX = (ConvertNode) x(); - ConstantNode newY = canonicalConvertConstant(tool, convertX, y().asConstant()); - if (newY != null) { - setX(convertX.getInput()); - setY(newY); + + } + return this; + } + + protected abstract CompareNode duplicateModified(ValueNode newX, ValueNode newY); + + protected Node canonicalizeSymmetricConstant(CanonicalizerTool tool, Constant constant, ValueNode nonConstant, boolean mirrored) { + if (nonConstant instanceof BinaryNode) { + if (nonConstant instanceof ConditionalNode) { + return optimizeConditional(constant, (ConditionalNode) nonConstant, tool.getConstantReflection(), mirrored ? condition().mirror() : condition()); + } else if (nonConstant instanceof NormalizeCompareNode) { + return optimizeNormalizeCmp(constant, (NormalizeCompareNode) nonConstant, mirrored); } - } else if (y() instanceof ConvertNode && x().isConstant()) { - ConvertNode convertY = (ConvertNode) y(); - ConstantNode newX = canonicalConvertConstant(tool, convertY, x().asConstant()); - if (newX != null) { - setX(newX); - setY(convertY.getInput()); + } else if (nonConstant instanceof ConvertNode) { + ConvertNode convert = (ConvertNode) nonConstant; + ConstantNode newConstant = canonicalConvertConstant(tool, convert, constant); + if (newConstant != null) { + if (mirrored) { + return graph().unique(duplicateModified(newConstant, convert.getInput())); + } else { + return graph().unique(duplicateModified(convert.getInput(), newConstant)); + } } } return this; diff -r da6941811da8 -r d5b824a41530 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatEqualsNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatEqualsNode.java Wed May 28 17:47:23 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatEqualsNode.java Wed May 28 17:47:23 2014 +0200 @@ -68,4 +68,9 @@ } return super.evaluate(constantReflection, forX, forY); } + + @Override + protected CompareNode duplicateModified(ValueNode newX, ValueNode newY) { + return new FloatEqualsNode(newX, newY); + } } diff -r da6941811da8 -r d5b824a41530 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java Wed May 28 17:47:23 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java Wed May 28 17:47:23 2014 +0200 @@ -67,4 +67,9 @@ } return super.evaluate(constantReflection, forX, forY); } + + @Override + protected CompareNode duplicateModified(ValueNode newX, ValueNode newY) { + return new FloatLessThanNode(newX, newY, unorderedIsTrue); + } } diff -r da6941811da8 -r d5b824a41530 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerBelowThanNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerBelowThanNode.java Wed May 28 17:47:23 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerBelowThanNode.java Wed May 28 17:47:23 2014 +0200 @@ -86,4 +86,9 @@ } return this; } + + @Override + protected CompareNode duplicateModified(ValueNode newX, ValueNode newY) { + return new IntegerBelowThanNode(newX, newY); + } } diff -r da6941811da8 -r d5b824a41530 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerEqualsNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerEqualsNode.java Wed May 28 17:47:23 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerEqualsNode.java Wed May 28 17:47:23 2014 +0200 @@ -23,7 +23,7 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.api.meta.*; -import com.oracle.graal.api.meta.ProfilingInfo.*; +import com.oracle.graal.api.meta.ProfilingInfo.TriState; import com.oracle.graal.compiler.common.calc.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.*; @@ -72,6 +72,11 @@ } @Override + protected CompareNode duplicateModified(ValueNode newX, ValueNode newY) { + return new IntegerEqualsNode(newX, newY); + } + + @Override public TriState evaluate(ConstantReflectionProvider constantReflection, ValueNode forX, ValueNode forY) { if (GraphUtil.unproxify(forX) == GraphUtil.unproxify(forY)) { return TriState.TRUE; @@ -82,62 +87,51 @@ } @Override - public Node canonical(CanonicalizerTool tool) { - Node result = super.canonical(tool); - if (result != this) { - return result; - } - - result = canonicalizeSymmetric(x(), y()); - if (result != this) { - return result; - } - - return canonicalizeSymmetric(y(), x()); - } - - private ValueNode canonicalizeSymmetric(ValueNode x, ValueNode y) { - if (y.isConstant() && y.asConstant().asLong() == 0) { - if (x instanceof AndNode) { - return graph().unique(new IntegerTestNode(((AndNode) x).x(), ((AndNode) x).y())); - } else if (x instanceof LeftShiftNode) { - LeftShiftNode shift = (LeftShiftNode) x; - if (shift.y().isConstant()) { - int mask = shift.getShiftAmountMask(); - int amount = shift.y().asConstant().asInt() & mask; - if (shift.x().getKind() == Kind.Int) { - return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forInt(-1 >>> amount, graph()))); - } else { - assert shift.x().getKind() == Kind.Long; - return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forLong(-1L >>> amount, graph()))); + protected Node canonicalizeSymmetricConstant(CanonicalizerTool tool, Constant constant, ValueNode nonConstant, boolean mirrored) { + if (constant.asLong() == 0) { + if (nonConstant instanceof AndNode) { + AndNode andNode = (AndNode) nonConstant; + return graph().unique(new IntegerTestNode(andNode.x(), andNode.y())); + } else if (nonConstant instanceof ShiftNode) { + if (nonConstant instanceof LeftShiftNode) { + LeftShiftNode shift = (LeftShiftNode) nonConstant; + if (shift.y().isConstant()) { + int mask = shift.getShiftAmountMask(); + int amount = shift.y().asConstant().asInt() & mask; + if (shift.x().getKind() == Kind.Int) { + return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forInt(-1 >>> amount, graph()))); + } else { + assert shift.x().getKind() == Kind.Long; + return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forLong(-1L >>> amount, graph()))); + } } - } - } else if (x instanceof RightShiftNode) { - RightShiftNode shift = (RightShiftNode) x; - if (shift.y().isConstant() && ((IntegerStamp) shift.x().stamp()).isPositive()) { - int mask = shift.getShiftAmountMask(); - int amount = shift.y().asConstant().asInt() & mask; - if (shift.x().getKind() == Kind.Int) { - return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forInt(-1 << amount, graph()))); - } else { - assert shift.x().getKind() == Kind.Long; - return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forLong(-1L << amount, graph()))); + } else if (nonConstant instanceof RightShiftNode) { + RightShiftNode shift = (RightShiftNode) nonConstant; + if (shift.y().isConstant() && ((IntegerStamp) shift.x().stamp()).isPositive()) { + int mask = shift.getShiftAmountMask(); + int amount = shift.y().asConstant().asInt() & mask; + if (shift.x().getKind() == Kind.Int) { + return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forInt(-1 << amount, graph()))); + } else { + assert shift.x().getKind() == Kind.Long; + return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forLong(-1L << amount, graph()))); + } } - } - } else if (x instanceof UnsignedRightShiftNode) { - UnsignedRightShiftNode shift = (UnsignedRightShiftNode) x; - if (shift.y().isConstant()) { - int mask = shift.getShiftAmountMask(); - int amount = shift.y().asConstant().asInt() & mask; - if (shift.x().getKind() == Kind.Int) { - return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forInt(-1 << amount, graph()))); - } else { - assert shift.x().getKind() == Kind.Long; - return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forLong(-1L << amount, graph()))); + } else if (nonConstant instanceof UnsignedRightShiftNode) { + UnsignedRightShiftNode shift = (UnsignedRightShiftNode) nonConstant; + if (shift.y().isConstant()) { + int mask = shift.getShiftAmountMask(); + int amount = shift.y().asConstant().asInt() & mask; + if (shift.x().getKind() == Kind.Int) { + return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forInt(-1 << amount, graph()))); + } else { + assert shift.x().getKind() == Kind.Long; + return graph().unique(new IntegerTestNode(shift.x(), ConstantNode.forLong(-1L << amount, graph()))); + } } } } } - return this; + return super.canonicalizeSymmetricConstant(tool, constant, nonConstant, mirrored); } } diff -r da6941811da8 -r d5b824a41530 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerLessThanNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerLessThanNode.java Wed May 28 17:47:23 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerLessThanNode.java Wed May 28 17:47:23 2014 +0200 @@ -101,4 +101,9 @@ } return this; } + + @Override + protected CompareNode duplicateModified(ValueNode newX, ValueNode newY) { + return new IntegerLessThanNode(newX, newY); + } } diff -r da6941811da8 -r d5b824a41530 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ObjectEqualsNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ObjectEqualsNode.java Wed May 28 17:47:23 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ObjectEqualsNode.java Wed May 28 17:47:23 2014 +0200 @@ -119,7 +119,7 @@ /* * One of the two objects has identity, the other doesn't. In code, this looks like * "Integer.valueOf(a) == new Integer(b)", which is always false. - * + * * In other words: an object created via valueOf can never be equal to one created * by new in the same compilation unit. */ @@ -138,4 +138,9 @@ } } } + + @Override + protected CompareNode duplicateModified(ValueNode newX, ValueNode newY) { + return new ObjectEqualsNode(newX, newY); + } }