changeset 11410:446a94461d53

Improve canonicalization of ConditionalNode.
author Roland Schatz <roland.schatz@oracle.com>
date Sat, 24 Aug 2013 15:02:10 +0200
parents 1f302b6e16b0
children 95cbf029018c
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerBelowThanNode.java
diffstat 2 files changed, 12 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java	Sat Aug 24 14:38:11 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java	Sat Aug 24 15:02:10 2013 +0200
@@ -92,6 +92,13 @@
                 return falseValue();
             }
         }
+        if (condition instanceof CompareNode && ((CompareNode) condition).condition() == Condition.EQ) {
+            // optimize the pattern (x == y) ? x : y
+            CompareNode compare = (CompareNode) condition;
+            if ((compare.x() == trueValue() && compare.y() == falseValue()) || (compare.x() == falseValue() && compare.y() == trueValue())) {
+                return falseValue();
+            }
+        }
         if (trueValue() == falseValue()) {
             return trueValue();
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerBelowThanNode.java	Sat Aug 24 14:38:11 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerBelowThanNode.java	Sat Aug 24 15:02:10 2013 +0200
@@ -58,6 +58,11 @@
         if (x() == y()) {
             return LogicConstantNode.contradiction(graph());
         } else {
+            if (x().isConstant() && x().asConstant().asLong() == 0) {
+                // 0 |<| y is the same as 0 != y
+                return graph().unique(new LogicNegationNode(CompareNode.createCompareNode(Condition.EQ, x(), y())));
+            }
+
             if (x().stamp() instanceof IntegerStamp && y().stamp() instanceof IntegerStamp) {
                 IntegerStamp xStamp = (IntegerStamp) x().stamp();
                 IntegerStamp yStamp = (IntegerStamp) y().stamp();