# HG changeset patch # User Lukas Stadler # Date 1310049494 -7200 # Node ID cb6e4d82ef3a2bab395dd3c854e72866fcbe0cbc # Parent b9439feeec65324535a8e9bd33247ecfde458b6f canonicalize "if (x) return bool_constant; else return !bool_constant;" to MaterializeNode diff -r b9439feeec65 -r cb6e4d82ef3a graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java --- 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()); } diff -r b9439feeec65 -r cb6e4d82ef3a graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java --- 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; } diff -r b9439feeec65 -r cb6e4d82ef3a graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MaterializeNode.java --- 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); } diff -r b9439feeec65 -r cb6e4d82ef3a graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java --- 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 lookup(Class 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; + } + }; } diff -r b9439feeec65 -r cb6e4d82ef3a graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/CanonicalizerPhase.java --- 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++; }