Mercurial > hg > truffle
changeset 6579:77fb2026fcbe
added test case to demonstrate current limitation in the IfNode simplification of removing intermediate materializations
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Thu, 25 Oct 2012 12:42:25 +0200 |
parents | 1112609bb5dc |
children | d56d600819fe |
files | graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InstanceOfTest.java |
diffstat | 1 files changed, 48 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InstanceOfTest.java Thu Oct 25 12:29:56 2012 +0200 +++ b/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InstanceOfTest.java Thu Oct 25 12:42:25 2012 +0200 @@ -30,8 +30,9 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.phases.*; -import com.oracle.graal.phases.common.*; -import com.oracle.graal.snippets.CheckCastTest.*; +import com.oracle.graal.snippets.CheckCastTest.Depth12; +import com.oracle.graal.snippets.CheckCastTest.Depth13; +import com.oracle.graal.snippets.CheckCastTest.Depth14; /** * Tests the implementation of instanceof, allowing profiling information to @@ -41,7 +42,7 @@ @Override protected void editPhasePlan(ResolvedJavaMethod method, StructuredGraph graph, PhasePlan phasePlan) { - phasePlan.disablePhase(InliningPhase.class); + // phasePlan.disablePhase(InliningPhase.class); } @Override @@ -199,10 +200,10 @@ public static int isThrowableInt(Object o) { if (o instanceof Throwable) { - return 1; + return id(1); } if (o instanceof Throwable) { - return 2; + return id(2); } return 0; } @@ -213,9 +214,9 @@ public static int isMapInt(Object o) { if (o instanceof Map) { - return 1; + return id(1); } - return 0; + return id(0); } public static boolean isDepth12(Object o) { @@ -228,4 +229,44 @@ } return id(0); } + + /** + * This test exists to show the kind of pattern that *should* be optimizable by {@code removeIntermediateMaterialization()} + * in {@link IfNode}. The optimization is currently blocked for the code pattern in this method because of a non-null + * frame state at the position indicated in the source. For this particular method, the frame state could be ignored + * as there are no deopt points after the merge. However, this is not the case for all methods where this pattern is + * present. The problem (yet to be solved) is figuring how how to evacuate the frame state of the merge to + * the code paths that result from the transformation. + * <p> + * The test exists in this source file as the transformation was originally motivated by the need to + * remove use of special JumpNodes in the {@code InstanceOfSnippets}. The transformation works for + * the snippet as all frame state are stripped from snippets. + */ + @Test + public void test_removeIntermediateMaterialization() { + List<String> list = Arrays.asList("1", "2", "3", "4"); + test("removeIntermediateMaterialization", profile(), list, "2", "yes", "no"); + test("removeIntermediateMaterialization", profile(), list, null, "yes", "no"); + test("removeIntermediateMaterialization", profile(), null, "2", "yes", "no"); + } + + public static String removeIntermediateMaterialization(List<Object> list, Object e, String a, String b) { + boolean test; + if (list == null || e == null) { + test = false; + } else { + test = false; + for (Object i : list) { + if (i.equals(e)) { + test = true; + break; + } + } + } + // The merge here has a non-null frame state + if (test) { + return a; + } + return b; + } }