Mercurial > hg > truffle
changeset 15414:997bfb063417
Fix bug in CompareNode canonicalization.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Mon, 28 Apr 2014 21:30:38 +0200 |
parents | 3a6dffce5158 |
children | 2a83d2482625 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java |
diffstat | 3 files changed, 33 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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());
--- 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;
--- 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) {