changeset 19891:aa66d0a6f9dc

MethodHandleNode: record unique concrete method assumptions
author Andreas Woess <andreas.woess@oracle.com>
date Tue, 17 Mar 2015 15:36:09 +0100
parents 3ac6b576ef70
children 08233b1ae932
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java
diffstat 1 files changed, 11 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java	Tue Mar 17 14:40:35 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java	Tue Mar 17 15:36:09 2015 +0100
@@ -180,24 +180,26 @@
             maybeCastArgument(receiverSkip + index, parameterType);
         }
 
+        if (target.canBeStaticallyBound()) {
+            return createTargetInvokeNode(target, intrinsicMethod);
+        }
+
         // Try to get the most accurate receiver type
         if (intrinsicMethod == IntrinsicMethod.LINK_TO_VIRTUAL || intrinsicMethod == IntrinsicMethod.LINK_TO_INTERFACE) {
             ResolvedJavaType receiverType = StampTool.typeOrNull(getReceiver().stamp());
             if (receiverType != null) {
                 AssumptionResult<ResolvedJavaMethod> concreteMethod = receiverType.findUniqueConcreteMethod(target);
                 if (concreteMethod != null) {
+                    graph().getAssumptions().record(concreteMethod);
                     return createTargetInvokeNode(concreteMethod.getResult(), intrinsicMethod);
                 }
             }
-        }
-
-        if (target.canBeStaticallyBound()) {
-            return createTargetInvokeNode(target, intrinsicMethod);
-        }
-
-        AssumptionResult<ResolvedJavaMethod> concreteMethod = target.getDeclaringClass().findUniqueConcreteMethod(target);
-        if (concreteMethod != null) {
-            return createTargetInvokeNode(concreteMethod.getResult(), intrinsicMethod);
+        } else {
+            AssumptionResult<ResolvedJavaMethod> concreteMethod = target.getDeclaringClass().findUniqueConcreteMethod(target);
+            if (concreteMethod != null) {
+                graph().getAssumptions().record(concreteMethod);
+                return createTargetInvokeNode(concreteMethod.getResult(), intrinsicMethod);
+            }
         }
 
         return null;