# HG changeset patch # User Thomas Wuerthinger # Date 1367069935 -7200 # Node ID 1ac1247bb98dead0a64e2f4386e6ebfeba96ade0 # Parent f1170c277b7b2b403039464bbbc591e5893020b4 Implemented isnull after instanceof swapping. diff -r f1170c277b7b -r 1ac1247bb98d graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Sat Apr 27 15:38:17 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Sat Apr 27 15:38:55 2013 +0200 @@ -26,6 +26,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.api.meta.JavaTypeProfile.ProfiledType; +import com.oracle.graal.api.meta.ProfilingInfo.TriState; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; @@ -191,7 +192,16 @@ private static boolean prepareForSwap(LogicNode a, LogicNode b, double probabilityA, double probabilityB) { if (a instanceof InstanceOfNode) { InstanceOfNode instanceOfA = (InstanceOfNode) a; - if (b instanceof InstanceOfNode) { + if (b instanceof IsNullNode) { + IsNullNode isNullNode = (IsNullNode) b; + if (isNullNode.object() == instanceOfA.object()) { + if (instanceOfA.profile().getNullSeen() != TriState.FALSE) { + instanceOfA.setProfile(new JavaTypeProfile(TriState.FALSE, instanceOfA.profile().getNotRecordedProbability(), instanceOfA.profile().getTypes())); + } + Debug.log("Can swap instanceof and isnull if"); + return true; + } + } else if (b instanceof InstanceOfNode) { InstanceOfNode instanceOfB = (InstanceOfNode) b; if (instanceOfA.object() == instanceOfB.object() && !instanceOfA.type().isAssignableFrom(instanceOfB.type()) && !instanceOfB.type().isAssignableFrom(instanceOfA.type())) { // Two instanceof on the same value with mutually exclusive types.