# HG changeset patch # User Doug Simon # Date 1373569134 -7200 # Node ID 05715450587818c860f9eb145085f9828c559547 # Parent 7f50d79c46f2dbfa0dda2789a5962d8d27feab75 fixed canonicalization bug (detected by Gilles) in binary logic nodes diff -r 7f50d79c46f2 -r 057154505878 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConjunctionNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConjunctionNode.java Thu Jul 11 20:57:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConjunctionNode.java Thu Jul 11 20:58:54 2013 +0200 @@ -26,7 +26,6 @@ /** * This node is true if {@link #getX() x} and {@link #getY() y} are true. - * */ public class LogicConjunctionNode extends LogicBinaryNode implements Canonicalizable { @@ -43,7 +42,30 @@ LogicNode x = getX(); LogicNode y = getY(); if (x == y) { - return x; + // @formatter:off + // a && a = a + // a && !a = false + // !a && a = false + // !a && !a = !a + // @formatter:on + if (isXNegated()) { + if (isYNegated()) { + // !a && !a = !a + negateUsages(); + return x; + } else { + // !a && a = false + return LogicConstantNode.contradiction(graph()); + } + } else { + if (isYNegated()) { + // a && !a = false + return LogicConstantNode.contradiction(graph()); + } else { + // a && a = a + return x; + } + } } if (x instanceof LogicConstantNode) { if (((LogicConstantNode) x).getValue() ^ isXNegated()) { diff -r 7f50d79c46f2 -r 057154505878 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConstantNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConstantNode.java Thu Jul 11 20:57:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConstantNode.java Thu Jul 11 20:58:54 2013 +0200 @@ -26,8 +26,7 @@ import com.oracle.graal.nodes.spi.*; /** - * The {@code ConstantNode} represents a constant such as an integer value, long, float, object - * reference, address, etc. + * The {@code LogicConstantNode} represents a boolean constant. */ @NodeInfo(nameTemplate = "{p#value}") public class LogicConstantNode extends LogicNode implements LIRLowerable { @@ -50,10 +49,16 @@ return graph.unique(new LogicConstantNode(v)); } + /** + * Gets a constant for {@code true}. + */ public static LogicConstantNode tautology(Graph graph) { return forBoolean(true, graph); } + /** + * Gets a constant for {@code false}. + */ public static LogicConstantNode contradiction(Graph graph) { return forBoolean(false, graph); } diff -r 7f50d79c46f2 -r 057154505878 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicDisjunctionNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicDisjunctionNode.java Thu Jul 11 20:57:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicDisjunctionNode.java Thu Jul 11 20:58:54 2013 +0200 @@ -43,7 +43,30 @@ LogicNode x = getX(); LogicNode y = getY(); if (x == y) { - return x; + // @formatter:off + // a || a = a + // a || !a = true + // !a || a = true + // !a || !a = !a + // @formatter:on + if (isXNegated()) { + if (isYNegated()) { + // !a || !a = !a + negateUsages(); + return x; + } else { + // !a || a = true + return LogicConstantNode.tautology(graph()); + } + } else { + if (isYNegated()) { + // a || !a = true + return LogicConstantNode.tautology(graph()); + } else { + // a || a = a + return x; + } + } } if (x instanceof LogicConstantNode) { if (((LogicConstantNode) x).getValue() ^ isXNegated()) {