# HG changeset patch # User Lukas Stadler # Date 1309795452 -7200 # Node ID 9bb94b82f264c62daa040ceb7934ed2d2ed3aff2 # Parent f5c607fb850d7c7d98cc0c2040ab795634921192 canonicalization for CheckCast, InstanceOf, IsNonNull, IsType and NotInstanceOf, checkstyle fix diff -r f5c607fb850d -r 9bb94b82f264 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/CheckCast.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/CheckCast.java Sun Jul 03 11:05:05 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/CheckCast.java Mon Jul 04 18:04:12 2011 +0200 @@ -23,6 +23,7 @@ package com.oracle.max.graal.compiler.ir; import com.oracle.max.graal.compiler.debug.*; +import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.CanonicalizerOp; import com.oracle.max.graal.graph.*; import com.sun.cri.bytecode.*; import com.sun.cri.ci.*; @@ -94,4 +95,27 @@ CheckCast x = new CheckCast(null, null, into); return x; } + + private static CanonicalizerOp CANONICALIZER = new CanonicalizerOp() { + @Override + public Node canonical(Node node) { + CheckCast checkCast = (CheckCast) node; + Value object = checkCast.object(); + RiType exactType = object.exactType(); + if (exactType != null) { + return Constant.forBoolean(exactType.isSubtypeOf(checkCast.targetClass()), node.graph()); + } + CiConstant constant = object.asConstant(); + if (constant != null) { + assert constant.kind == CiKind.Object; + if (constant.isNull()) { + return Constant.forBoolean(true, node.graph()); + } else { + // this should never happen - non-null constants are always expected to provide an exactType + assert false; + } + } + return checkCast; + } + }; } diff -r f5c607fb850d -r 9bb94b82f264 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Constant.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Constant.java Sun Jul 03 11:05:05 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Constant.java Mon Jul 04 18:04:12 2011 +0200 @@ -57,8 +57,8 @@ @Override public BooleanNode negate() { - if (kind != CiKind.Boolean) { - throw new IllegalStateException(); + if (value.kind != CiKind.Boolean) { + throw new IllegalStateException("boolean expected, actual: " + kind); } return Constant.forBoolean(!value.asBoolean(), graph()); } diff -r f5c607fb850d -r 9bb94b82f264 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/InstanceOf.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/InstanceOf.java Sun Jul 03 11:05:05 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/InstanceOf.java Mon Jul 04 18:04:12 2011 +0200 @@ -23,10 +23,12 @@ package com.oracle.max.graal.compiler.ir; import com.oracle.max.graal.compiler.debug.*; +import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.CanonicalizerOp; import com.oracle.max.graal.compiler.util.*; import com.oracle.max.graal.graph.*; import com.sun.cri.bytecode.*; import com.sun.cri.ci.*; +import com.sun.cri.ri.*; /** * The {@code InstanceOf} instruction represents an instanceof test. @@ -74,4 +76,36 @@ public Node copy(Graph into) { return new InstanceOf(null, null, into); } + + @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) { + InstanceOf isInstance = (InstanceOf) node; + Value object = isInstance.object(); + RiType exactType = object.exactType(); + if (exactType != null) { + return Constant.forBoolean(exactType.isSubtypeOf(isInstance.targetClass()), node.graph()); + } + CiConstant constant = object.asConstant(); + if (constant != null) { + assert constant.kind == CiKind.Object; + if (constant.isNull()) { + return Constant.forBoolean(false, node.graph()); + } else { + // this should never happen - non-null constants are always expected to provide an exactType + assert false; + } + } + return isInstance; + } + }; } diff -r f5c607fb850d -r 9bb94b82f264 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsNonNull.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsNonNull.java Sun Jul 03 11:05:05 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsNonNull.java Mon Jul 04 18:04:12 2011 +0200 @@ -23,6 +23,7 @@ package com.oracle.max.graal.compiler.ir; import com.oracle.max.graal.compiler.debug.*; +import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.CanonicalizerOp; import com.oracle.max.graal.compiler.util.*; import com.oracle.max.graal.graph.*; import com.sun.cri.bytecode.*; @@ -107,4 +108,30 @@ public Node copy(Graph into) { return new IsNonNull(null, into); } + + @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) { + IsNonNull isNonNull = (IsNonNull) node; + Value object = isNonNull.object(); + if (object instanceof NewInstance || object instanceof NewArray) { + return Constant.forBoolean(true, node.graph()); + } + CiConstant constant = object.asConstant(); + if (constant != null) { + assert constant.kind == CiKind.Object; + return Constant.forBoolean(constant.isNonNull(), node.graph()); + } + return isNonNull; + } + }; } diff -r f5c607fb850d -r 9bb94b82f264 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsType.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsType.java Sun Jul 03 11:05:05 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsType.java Mon Jul 04 18:04:12 2011 +0200 @@ -25,6 +25,7 @@ import java.util.*; import com.oracle.max.graal.compiler.debug.*; +import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.CanonicalizerOp; import com.oracle.max.graal.compiler.util.*; import com.oracle.max.graal.graph.*; import com.sun.cri.bytecode.*; @@ -127,4 +128,27 @@ public Node copy(Graph into) { return new IsType(null, type, into); } + + @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) { + IsType isType = (IsType) node; + Value object = isType.object(); + RiType exactType = object.exactType(); + if (exactType != null) { + return Constant.forBoolean(exactType == isType.type, node.graph()); + } + // constants return the correct exactType, so they are handled by the code above + return isType; + } + }; } diff -r f5c607fb850d -r 9bb94b82f264 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NotInstanceOf.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NotInstanceOf.java Sun Jul 03 11:05:05 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NotInstanceOf.java Mon Jul 04 18:04:12 2011 +0200 @@ -23,10 +23,12 @@ package com.oracle.max.graal.compiler.ir; import com.oracle.max.graal.compiler.debug.*; +import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.CanonicalizerOp; import com.oracle.max.graal.compiler.util.*; import com.oracle.max.graal.graph.*; import com.sun.cri.bytecode.*; import com.sun.cri.ci.*; +import com.sun.cri.ri.*; /** * The {@code InstanceOf} instruction represents an instanceof test. @@ -74,4 +76,36 @@ public Node copy(Graph into) { return new NotInstanceOf(null, null, into); } + + @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) { + NotInstanceOf notIsInstance = (NotInstanceOf) node; + Value object = notIsInstance.object(); + RiType exactType = object.exactType(); + if (exactType != null) { + return Constant.forBoolean(!exactType.isSubtypeOf(notIsInstance.targetClass()), node.graph()); + } + CiConstant constant = object.asConstant(); + if (constant != null) { + assert constant.kind == CiKind.Object; + if (constant.isNull()) { + return Constant.forBoolean(true, node.graph()); + } else { + // this should never happen - non-null constants are always expected to provide an exactType + assert false; + } + } + return notIsInstance; + } + }; } diff -r f5c607fb850d -r 9bb94b82f264 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Sun Jul 03 11:05:05 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Mon Jul 04 18:04:12 2011 +0200 @@ -150,10 +150,10 @@ if (node.predecessors().size() > 0) { for (Node pred : node.predecessors()) { TTY.println("!PRED! " + pred + " (" + flood.isMarked(pred) + ")"); - for (int i=0; isucc: " + pred.successors().get(i)); } - for (int i=0; iusage: " + pred.usages().get(i)); } }