# HG changeset patch # User Thomas Wuerthinger # Date 1424007196 -3600 # Node ID b720a1e02fa08e30bbd19577a9dee32229011cf4 # Parent 1a9d5e9ab0f4333db193bda4bca812452c87458f Add graph building time canonicalization for NormalizeCompareNode. diff -r 1a9d5e9ab0f4 -r b720a1e02fa0 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sun Feb 15 14:28:01 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sun Feb 15 14:33:16 2015 +0100 @@ -607,7 +607,7 @@ @Override protected ValueNode genNormalizeCompare(ValueNode x, ValueNode y, boolean isUnorderedLess) { - return new NormalizeCompareNode(x, y, isUnorderedLess); + return NormalizeCompareNode.create(x, y, isUnorderedLess, constantReflection); } @Override @@ -916,7 +916,7 @@ int nodeCount = currentGraph.getNodeCount(); Mark mark = needsNullCheck ? currentGraph.getMark() : null; if (InvocationPlugin.execute(this, plugin, args)) { - assert beforeStackSize + resultType.getSlotCount() == frameState.stackSize : "plugin manipulated the stack incorrectly"; + assert beforeStackSize + resultType.getSlotCount() == frameState.stackSize : "plugin manipulated the stack incorrectly " + targetMethod; assert !needsNullCheck || containsNullCheckOf(currentGraph.getNewNodes(mark), args[0]) : "plugin needs to null check the receiver of " + targetMethod + ": " + args[0]; return true; } diff -r 1a9d5e9ab0f4 -r b720a1e02fa0 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 Sun Feb 15 14:28:01 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java Sun Feb 15 14:33:16 2015 +0100 @@ -22,6 +22,7 @@ */ package com.oracle.graal.nodes.calc; +import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.calc.*; import com.oracle.graal.compiler.common.type.*; @@ -39,6 +40,15 @@ assert x.stamp().isCompatible(y.stamp()); } + public static LogicNode create(ValueNode x, ValueNode y, boolean unorderedIsTrue, ConstantReflectionProvider constantReflection) { + LogicNode result = CompareNode.tryConstantFold(Condition.LT, x, y, constantReflection, unorderedIsTrue); + if (result != null) { + return result; + } else { + return new FloatLessThanNode(x, y, unorderedIsTrue); + } + } + @Override public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) { ValueNode result = super.canonical(tool, forX, forY); diff -r 1a9d5e9ab0f4 -r b720a1e02fa0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Sun Feb 15 14:28:01 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Sun Feb 15 14:33:16 2015 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.common.calc.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodeinfo.*; @@ -44,6 +45,26 @@ this.isUnorderedLess = isUnorderedLess; } + public static ValueNode create(ValueNode x, ValueNode y, boolean isUnorderedLess, ConstantReflectionProvider constantReflection) { + LogicNode result = CompareNode.tryConstantFold(Condition.EQ, x, y, constantReflection, false); + if (result instanceof LogicConstantNode) { + LogicConstantNode logicConstantNode = (LogicConstantNode) result; + LogicNode resultLT = CompareNode.tryConstantFold(Condition.LT, x, y, constantReflection, isUnorderedLess); + if (resultLT instanceof LogicConstantNode) { + LogicConstantNode logicConstantNodeLT = (LogicConstantNode) resultLT; + if (logicConstantNodeLT.getValue()) { + return ConstantNode.forInt(-1); + } else if (logicConstantNode.getValue()) { + return ConstantNode.forInt(0); + } else { + return ConstantNode.forInt(1); + } + } + } + + return new NormalizeCompareNode(x, y, isUnorderedLess); + } + @Override public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) { // nothing to do @@ -56,10 +77,10 @@ LogicNode lessComp; if (getX().stamp() instanceof FloatStamp) { equalComp = graph().unique(FloatEqualsNode.create(getX(), getY(), tool.getConstantReflection())); - lessComp = graph().unique(new FloatLessThanNode(getX(), getY(), isUnorderedLess)); + lessComp = graph().unique(FloatLessThanNode.create(getX(), getY(), isUnorderedLess, tool.getConstantReflection())); } else { - equalComp = graph().unique(new IntegerEqualsNode(getX(), getY())); - lessComp = graph().unique(new IntegerLessThanNode(getX(), getY())); + equalComp = graph().unique(IntegerEqualsNode.create(getX(), getY(), tool.getConstantReflection())); + lessComp = graph().unique(IntegerLessThanNode.create(getX(), getY(), tool.getConstantReflection())); } ConditionalNode equalValue = graph().unique(new ConditionalNode(equalComp, ConstantNode.forInt(0, graph()), ConstantNode.forInt(1, graph())));