# HG changeset patch # User Tom Rodriguez # Date 1403634486 25200 # Node ID 8fde32ece68efab884b258aa6bff9192b54a03a0 # Parent b1be2a46cc5c94e7fb67aee32e2974bf063beec3 use receiver type in findUniqueConcreteMethod diff -r b1be2a46cc5c -r 8fde32ece68e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Tue Jun 24 11:28:00 2014 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Tue Jun 24 11:28:06 2014 -0700 @@ -87,7 +87,7 @@ * @return the metaspace Method result or 0 is there is no unique concrete method for * {@code metaspaceMethod} */ - long findUniqueConcreteMethod(long metaspaceMethod); + long findUniqueConcreteMethod(long actualHolderMetaspaceKlass, long metaspaceMethod); /** * Returns the implementor for the given interface class. diff -r b1be2a46cc5c -r 8fde32ece68e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Tue Jun 24 11:28:00 2014 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Tue Jun 24 11:28:06 2014 -0700 @@ -68,7 +68,7 @@ public native boolean hasBalancedMonitors(long metaspaceMethod); @Override - public native long findUniqueConcreteMethod(long metaspaceMethod); + public native long findUniqueConcreteMethod(long actualHolderMetaspaceKlass, long metaspaceMethod); @Override public native long getKlassImplementor(long metaspaceKlass); diff -r b1be2a46cc5c -r 8fde32ece68e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Tue Jun 24 11:28:00 2014 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Tue Jun 24 11:28:06 2014 -0700 @@ -350,8 +350,8 @@ return runtime().getCompilerToVM().getStackTraceElement(metaspaceMethod, bci); } - public ResolvedJavaMethod uniqueConcreteMethod() { - if (holder.isInterface()) { + public ResolvedJavaMethod uniqueConcreteMethod(HotSpotResolvedObjectType receiver) { + if (receiver.isInterface()) { // Cannot trust interfaces. Because of: // interface I { void foo(); } // class A { public void foo() {} } @@ -362,7 +362,7 @@ // seeing A.foo(). return null; } - final long uniqueConcreteMethod = runtime().getCompilerToVM().findUniqueConcreteMethod(metaspaceMethod); + final long uniqueConcreteMethod = runtime().getCompilerToVM().findUniqueConcreteMethod(receiver.getMetaspaceKlass(), metaspaceMethod); if (uniqueConcreteMethod == 0) { return null; } diff -r b1be2a46cc5c -r 8fde32ece68e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java Tue Jun 24 11:28:00 2014 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java Tue Jun 24 11:28:06 2014 -0700 @@ -459,7 +459,26 @@ @Override public ResolvedJavaMethod findUniqueConcreteMethod(ResolvedJavaMethod method) { - return ((HotSpotResolvedJavaMethod) method).uniqueConcreteMethod(); + HotSpotResolvedJavaMethod hmethod = (HotSpotResolvedJavaMethod) method; + HotSpotResolvedObjectType declaredHolder = hmethod.getDeclaringClass(); + /* + * Sometimes the receiver type in the graph hasn't stabilized to a subtype of declared + * holder, usually because of phis, so make sure that the type is related to the declared + * type before using it for lookup. + */ + if (!declaredHolder.isAssignableFrom(this) || this.isArray() || this.equals(declaredHolder)) { + return hmethod.uniqueConcreteMethod(declaredHolder); + } + /* + * The holder may be a subtype of the decaredHolder so make sure to resolve the method to + * the correct method for the subtype. + */ + HotSpotResolvedJavaMethod newMethod = (HotSpotResolvedJavaMethod) resolveMethod(hmethod, this); + if (newMethod != null && !hmethod.equals(newMethod)) { + hmethod = newMethod; + } + + return hmethod.uniqueConcreteMethod(this); } /** diff -r b1be2a46cc5c -r 8fde32ece68e src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Tue Jun 24 11:28:00 2014 -0700 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Tue Jun 24 11:28:06 2014 -0700 @@ -194,9 +194,9 @@ return (jlong) (address) method(); } -C2V_VMENTRY(jlong, findUniqueConcreteMethod, (JNIEnv *, jobject, jlong metaspace_method)) +C2V_VMENTRY(jlong, findUniqueConcreteMethod, (JNIEnv *, jobject, jlong metaspace_klass, jlong metaspace_method)) methodHandle method = asMethod(metaspace_method); - KlassHandle holder = method->method_holder(); + KlassHandle holder = asKlass(metaspace_klass); assert(!holder->is_interface(), "should be handled in Java code"); ResourceMark rm; MutexLocker locker(Compile_lock); @@ -1003,7 +1003,7 @@ {CC"exceptionTableStart", CC"("METASPACE_METHOD")J", FN_PTR(exceptionTableStart)}, {CC"exceptionTableLength", CC"("METASPACE_METHOD")I", FN_PTR(exceptionTableLength)}, {CC"hasBalancedMonitors", CC"("METASPACE_METHOD")Z", FN_PTR(hasBalancedMonitors)}, - {CC"findUniqueConcreteMethod", CC"("METASPACE_METHOD")"METASPACE_METHOD, FN_PTR(findUniqueConcreteMethod)}, + {CC"findUniqueConcreteMethod", CC"("METASPACE_KLASS METASPACE_METHOD")"METASPACE_METHOD, FN_PTR(findUniqueConcreteMethod)}, {CC"getKlassImplementor", CC"("METASPACE_KLASS")"METASPACE_KLASS, FN_PTR(getKlassImplementor)}, {CC"getStackTraceElement", CC"("METASPACE_METHOD"I)"STACK_TRACE_ELEMENT, FN_PTR(getStackTraceElement)}, {CC"methodIsIgnoredBySecurityStackWalk", CC"("METASPACE_METHOD")Z", FN_PTR(methodIsIgnoredBySecurityStackWalk)},