# HG changeset patch # User Bernhard Urban # Date 1367586307 -7200 # Node ID f8a5f7f7d0bd9c120d136a6941bfd19e5ce7c665 # Parent 8a6bd04d951015ec02782bf16949df93da986944 CheckCastNode: eliminate the other way around and replace the previous node with a more specific node regarding its type diff -r 8a6bd04d9510 -r f8a5f7f7d0bd graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/EliminateNestedCheckCastsTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/EliminateNestedCheckCastsTest.java Fri May 03 15:29:26 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/EliminateNestedCheckCastsTest.java Fri May 03 15:05:07 2013 +0200 @@ -26,7 +26,7 @@ import junit.framework.Assert; -import org.junit.*; +import org.junit.Test; import com.oracle.graal.api.code.*; import com.oracle.graal.debug.*; @@ -99,7 +99,6 @@ return sum + a3.x3; } - @Ignore @Test public void test5() { StructuredGraph graph = compileSnippet("test5Snippet", 2, 1); diff -r 8a6bd04d9510 -r f8a5f7f7d0bd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Fri May 03 15:29:26 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Fri May 03 15:05:07 2013 +0200 @@ -85,11 +85,15 @@ // checkcast. return object(); } + // remove checkcast if next node is a more specific checkcast - if (next() instanceof CheckCastNode) { - CheckCastNode ccn = (CheckCastNode) next(); - if (ccn != null && ccn.type() != null && this == ccn.object() && type.isAssignableFrom(ccn.type())) { - return object(); + if (predecessor() instanceof CheckCastNode) { + CheckCastNode ccn = (CheckCastNode) predecessor(); + if (ccn != null && ccn.type != null && ccn == object && ccn.forStoreCheck == forStoreCheck && ccn.type.isAssignableFrom(type)) { + StructuredGraph graph = (StructuredGraph) ccn.graph(); + CheckCastNode newccn = graph.add(new CheckCastNode(type, ccn.object, ccn.profile, ccn.forStoreCheck)); + graph.replaceFixedWithFixed(ccn, newccn); + return newccn; } }