# HG changeset patch # User Thomas Wuerthinger # Date 1341251214 -7200 # Node ID 6e9c7af8ce5dad0ce55bcb457e90978415b43bf5 # Parent 7ee5a3634003573cd79406e98366172800ac43a0 Fixed propagation of return type into call sites. Eager resolve return type when specified in the graph builder. Added new test case. diff -r 7ee5a3634003 -r 6e9c7af8ce5d graal/com.oracle.graal.boot.test/src/com/oracle/graal/boot/BigBangTest.java --- a/graal/com.oracle.graal.boot.test/src/com/oracle/graal/boot/BigBangTest.java Tue Jun 26 10:56:03 2012 +0200 +++ b/graal/com.oracle.graal.boot.test/src/com/oracle/graal/boot/BigBangTest.java Mon Jul 02 19:46:54 2012 +0200 @@ -30,7 +30,7 @@ public void helloWorldTest() { BootImageGenerator generator = new BootImageGenerator(); generator.addEntryMethod(TestPrograms.class, "helloWorldTest"); - Assert.assertArrayEquals(generator.getBigBang().printState(), new int[]{3, 118, 58, 21}); + Assert.assertArrayEquals(generator.getBigBang().printState(), new int[]{3, 148, 66, 24}); } @Test @@ -62,4 +62,11 @@ generator.addEntryMethod(TestPrograms.class, "arrayListTest"); Assert.assertArrayEquals(generator.getBigBang().printState(), new int[]{2, 20, 3, 2}); } + + @Test + public void arrayListTestWithCalls() { + BootImageGenerator generator = new BootImageGenerator(); + generator.addEntryMethod(TestPrograms.class, "arrayListTestWithCalls"); + Assert.assertArrayEquals(generator.getBigBang().printState(), new int[]{2, 20, 3, 2}); + } } diff -r 7ee5a3634003 -r 6e9c7af8ce5d graal/com.oracle.graal.boot.test/src/com/oracle/graal/boot/TestPrograms.java --- a/graal/com.oracle.graal.boot.test/src/com/oracle/graal/boot/TestPrograms.java Tue Jun 26 10:56:03 2012 +0200 +++ b/graal/com.oracle.graal.boot.test/src/com/oracle/graal/boot/TestPrograms.java Mon Jul 02 19:46:54 2012 +0200 @@ -53,8 +53,26 @@ newArr[0].testMethod(); } + @SuppressWarnings("unchecked") + public static void arrayListTestWithCalls() { + ArrayList list = createNewArrayList(); + list.add(new TestObject()); + TestObject[] newArr = (TestObject[]) list.toArray(new TestObject[0]); + TestObject t2 = newArr[0].testMethod(); + t2.testMethod2(); + } + + private static ArrayList createNewArrayList() { + return new ArrayList(); + } + public static class TestObject { - public void testMethod() { + public TestObject testMethod() { + return new TestObject(); + } + + public void testMethod2() { + } } } diff -r 7ee5a3634003 -r 6e9c7af8ce5d graal/com.oracle.graal.boot/src/com/oracle/graal/boot/meta/InvokeElement.java --- a/graal/com.oracle.graal.boot/src/com/oracle/graal/boot/meta/InvokeElement.java Tue Jun 26 10:56:03 2012 +0200 +++ b/graal/com.oracle.graal.boot/src/com/oracle/graal/boot/meta/InvokeElement.java Mon Jul 02 19:46:54 2012 +0200 @@ -68,6 +68,7 @@ ResolvedJavaMethod method = methodCallTarget.targetMethod(); concreteTargets.add(method); MethodElement processedMethod = bb.getProcessedMethod(method); + processedMethod.addUsage(bb, this.methodCallTarget.invoke().node()); processedMethod.postParseGraph(bb); } } @@ -94,6 +95,7 @@ bb.getProcessedMethod(method).getParameter(i).postUnionTypes(bb, null, newSeenTypesTemp); } } + processedMethod.addUsage(bb, this.methodCallTarget.invoke().node()); } // Register new type for receiver. diff -r 7ee5a3634003 -r 6e9c7af8ce5d graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Jun 26 10:56:03 2012 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Jul 02 19:46:54 2012 +0200 @@ -965,7 +965,11 @@ return; } - MethodCallTargetNode callTarget = currentGraph.add(new MethodCallTargetNode(invokeKind, targetMethod, args, targetMethod.signature().returnType(method.holder()))); + JavaType returnType = targetMethod.signature().returnType(method.holder()); + if (graphBuilderConfig.eagerResolvingForSnippets()) { + returnType = returnType.resolve(targetMethod.holder()); + } + MethodCallTargetNode callTarget = currentGraph.add(new MethodCallTargetNode(invokeKind, targetMethod, args, returnType)); // be conservative if information was not recorded (could result in endless recompiles otherwise) if (optimisticOpts.useExceptionProbability() && profilingInfo.getExceptionSeen(bci()) == ExceptionSeen.FALSE) { ValueNode result = appendWithBCI(currentGraph.add(new InvokeNode(callTarget, bci(), graphId)));