changeset 3180:cb6e4d82ef3a

canonicalize "if (x) return bool_constant; else return !bool_constant;" to MaterializeNode
author Lukas Stadler <lukas.stadler@jku.at>
date Thu, 07 Jul 2011 16:38:14 +0200
parents b9439feeec65
children ef0ff458d074 4ccb3d5e4da1
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MaterializeNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/CanonicalizerPhase.java
diffstat 5 files changed, 66 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java	Thu Jul 07 14:33:57 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java	Thu Jul 07 16:38:14 2011 +0200
@@ -199,7 +199,7 @@
                     if (compare.condition == Condition.NE) {
                         isFalseCheck = !isFalseCheck;
                     }
-                    BooleanNode result = materializeNode.value();
+                    Value result = materializeNode.value();
                     if (isFalseCheck) {
                         result = new NegateBooleanNode(result, compare.graph());
                     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java	Thu Jul 07 14:33:57 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java	Thu Jul 07 16:38:14 2011 +0200
@@ -66,7 +66,7 @@
         assertTrue(inputs().size() == 0, "inputs empty");
         assertTrue(successors().size() == 0, "successors empty");
         assertTrue(usages().size() <= 1, "at most one usage");
-        assertTrue(predecessors().size() <= 1, "at most one predecessor");
+        assertTrue(predecessors().size() <= 1, "at most one predecessor " + predecessors());
         return true;
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MaterializeNode.java	Thu Jul 07 14:33:57 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MaterializeNode.java	Thu Jul 07 16:38:14 2011 +0200
@@ -52,11 +52,11 @@
     /**
      * The instruction which produces the input value to this instruction.
      */
-     public BooleanNode value() {
-        return (BooleanNode) inputs().get(super.inputCount() + INPUT_VALUE);
+     public Value value() {
+        return (Value) inputs().get(super.inputCount() + INPUT_VALUE);
     }
 
-    public void setValue(BooleanNode n) {
+    public void setValue(Value n) {
         inputs().set(super.inputCount() + INPUT_VALUE, n);
     }
 
@@ -67,7 +67,7 @@
      * @param kind the result type of this instruction
      * @param graph
      */
-    public MaterializeNode(BooleanNode value, Graph graph) {
+    public MaterializeNode(Value value, Graph graph) {
         super(CiKind.Int, INPUT_COUNT, SUCCESSOR_COUNT, graph);
         setValue(value);
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java	Thu Jul 07 14:33:57 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java	Thu Jul 07 16:38:14 2011 +0200
@@ -26,6 +26,7 @@
 
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.ir.StateSplit.*;
+import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
 
@@ -174,4 +175,62 @@
             }
         };
     }
+
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == CanonicalizerOp.class) {
+            return (T) CANONICALIZER;
+        }
+        return super.lookup(clazz);
+    }
+
+    private static CanonicalizerOp CANONICALIZER = new CanonicalizerOp() {
+
+        @Override
+        public Node canonical(Node node) {
+            Phi phiNode = (Phi) node;
+//            if (phiNode.valueCount() != 2 || phiNode.merge().endCount() != 2 || phiNode.merge().phis().size() != 1) {
+//                return phiNode;
+//            }
+//            if (!(phiNode.valueAt(0) instanceof Constant && phiNode.valueAt(1) instanceof Constant)) {
+//                return phiNode;
+//            }
+//            Merge merge = phiNode.merge();
+//            Node end0 = merge.endAt(0);
+//            Node end1 = merge.endAt(1);
+//            if (end0.predecessors().size() != 1 || end1.predecessors().size() != 1) {
+//                return phiNode;
+//            }
+//            Node endPred0 = end0.predecessors().get(0);
+//            Node endPred1 = end1.predecessors().get(0);
+//            if (endPred0 != endPred1 || !(endPred0 instanceof If)) {
+//                return phiNode;
+//            }
+//            If ifNode = (If) endPred0;
+//            if (ifNode.predecessors().size() != 1) {
+//                return phiNode;
+//            }
+//            boolean inverted = ((If) endPred0).trueSuccessor() == end1;
+//            CiConstant trueValue = phiNode.valueAt(inverted ? 1 : 0).asConstant();
+//            CiConstant falseValue = phiNode.valueAt(inverted ? 0 : 1).asConstant();
+//            if (trueValue.kind != CiKind.Int || falseValue.kind != CiKind.Int) {
+//                return phiNode;
+//            }
+//            if ((trueValue.asInt() == 0 || trueValue.asInt() == 1) && (falseValue.asInt() == 0 || falseValue.asInt() == 1) && (trueValue.asInt() != falseValue.asInt())) {
+//                MaterializeNode result;
+//                if (trueValue.asInt() == 1) {
+//                    result = new MaterializeNode(ifNode.compare(), phiNode.graph());
+//                } else {
+//                    result = new MaterializeNode(new NegateBooleanNode(ifNode.compare(), phiNode.graph()), phiNode.graph());
+//                }
+//                Node next = merge.next();
+//                merge.setNext(null);
+//                ifNode.predecessors().get(0).successors().replace(ifNode, next);
+//                return result;
+//            }
+            return phiNode;
+        }
+    };
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/CanonicalizerPhase.java	Thu Jul 07 14:33:57 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/CanonicalizerPhase.java	Thu Jul 07 16:38:14 2011 +0200
@@ -42,7 +42,7 @@
                 Node canonical = op.canonical(node);
                 if (canonical != node) {
                     node.replaceAndDelete(canonical);
-                    nodeWorkList.replaced(canonical, node, EdgeType.USAGES);
+                    nodeWorkList.replaced(canonical, node, true, EdgeType.USAGES);
                     //System.out.println("-->" + n + " canonicalized to " + canonical);
                     GraalMetrics.NodesCanonicalized++;
                 }