changeset 5752:6e9c7af8ce5d

Fixed propagation of return type into call sites. Eager resolve return type when specified in the graph builder. Added new test case.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Mon, 02 Jul 2012 19:46:54 +0200
parents 7ee5a3634003
children f9c9c01969c0
files graal/com.oracle.graal.boot.test/src/com/oracle/graal/boot/BigBangTest.java graal/com.oracle.graal.boot.test/src/com/oracle/graal/boot/TestPrograms.java graal/com.oracle.graal.boot/src/com/oracle/graal/boot/meta/InvokeElement.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java
diffstat 4 files changed, 34 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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});
+    }
 }
--- 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() {
+
         }
     }
 }
--- 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.
--- 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)));