# HG changeset patch # User Roland Schatz # Date 1398713438 -7200 # Node ID 997bfb0634172909dfccc60e2669df795d24c14f # Parent 3a6dffce51585208d1038e91b870414fad272ae1 Fix bug in CompareNode canonicalization. diff -r 3a6dffce5158 -r 997bfb063417 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 Mon Apr 28 12:11:20 2014 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java Mon Apr 28 21:30:38 2014 +0200 @@ -120,7 +120,7 @@ if (x() instanceof ConvertNode && y() instanceof ConvertNode) { ConvertNode convertX = (ConvertNode) x(); ConvertNode convertY = (ConvertNode) y(); - if (convertX.isLossless() && convertY.isLossless() && convertX.getInput().stamp().isCompatible(convertY.getInput().stamp())) { + if (convertX.preservesOrder(condition()) && convertY.preservesOrder(condition()) && convertX.getInput().stamp().isCompatible(convertY.getInput().stamp())) { setX(convertX.getInput()); setY(convertY.getInput()); } @@ -142,8 +142,8 @@ return this; } - private static ConstantNode canonicalConvertConstant(ConvertNode convert, Constant constant) { - if (convert.isLossless()) { + private ConstantNode canonicalConvertConstant(ConvertNode convert, Constant constant) { + if (convert.preservesOrder(condition())) { Constant reverseConverted = convert.reverse(constant); if (convert.convert(reverseConverted).equals(constant)) { return ConstantNode.forPrimitive(convert.getInput().stamp(), reverseConverted, convert.graph()); diff -r 3a6dffce5158 -r 997bfb063417 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java Mon Apr 28 12:11:20 2014 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java Mon Apr 28 21:30:38 2014 +0200 @@ -24,6 +24,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.common.calc.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.nodes.*; @@ -47,8 +48,23 @@ public abstract Constant reverse(Constant c); + /** + * Check whether a conversion is lossless. + * + * @return true iff reverse(convert(c)) == c for all c + */ public abstract boolean isLossless(); + /** + * Check whether a conversion preserves comparison order. + * + * @param op a comparison operator + * @return true iff (c1 op c2) == (convert(c1) op convert(c2)) for all c1, c2 + */ + public boolean preservesOrder(Condition op) { + return isLossless(); + } + @Override public Constant evalConst(Constant... inputs) { assert inputs.length == 1; diff -r 3a6dffce5158 -r 997bfb063417 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java Mon Apr 28 12:11:20 2014 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java Mon Apr 28 21:30:38 2014 +0200 @@ -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.*; import com.oracle.graal.graph.spi.*; @@ -64,6 +65,19 @@ } @Override + public boolean preservesOrder(Condition op) { + switch (op) { + case GE: + case GT: + case LE: + case LT: + return false; + default: + return true; + } + } + + @Override public Node canonical(CanonicalizerTool tool) { ValueNode ret = canonicalConvert(); if (ret != null) {