--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CheckGraalIntrinsics.java 2017-04-28 11:48:53.000000000 +0200 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CheckGraalIntrinsics.java 2017-04-28 11:48:53.000000000 +0200 @@ -29,15 +29,12 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; -import org.junit.Test; - import org.graalvm.compiler.api.test.Graal; import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; @@ -45,12 +42,15 @@ import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; +import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Binding; import org.graalvm.compiler.runtime.RuntimeProvider; import org.graalvm.compiler.test.GraalTest; +import org.junit.Test; import jdk.vm.ci.hotspot.HotSpotVMConfigStore; import jdk.vm.ci.hotspot.VMIntrinsicMethod; import jdk.vm.ci.meta.MetaAccessProvider; +import jdk.vm.ci.meta.MetaUtil; import jdk.vm.ci.meta.MethodHandleAccessProvider.IntrinsicMethod; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -63,11 +63,10 @@ */ public class CheckGraalIntrinsics extends GraalTest { - public static boolean match(ResolvedJavaMethod method, VMIntrinsicMethod intrinsic) { - if (intrinsic.name.equals(method.getName())) { - if (intrinsic.descriptor.equals(method.getSignature().toMethodDescriptor())) { - String declaringClass = method.getDeclaringClass().toClassName().replace('.', '/'); - if (declaringClass.equals(intrinsic.declaringClass)) { + public static boolean match(String type, Binding binding, VMIntrinsicMethod intrinsic) { + if (intrinsic.name.equals(binding.name)) { + if (intrinsic.descriptor.startsWith(binding.argumentsDescriptor)) { + if (type.equals(intrinsic.declaringClass)) { return true; } } @@ -75,16 +74,20 @@ return false; } - private static ResolvedJavaMethod findMethod(Set methods, VMIntrinsicMethod intrinsic) { - for (ResolvedJavaMethod method : methods) { - if (match(method, intrinsic)) { - return method; + public static InvocationPlugin findPlugin(Map> bindings, VMIntrinsicMethod intrinsic) { + for (Map.Entry> e : bindings.entrySet()) { + // Match format of VMIntrinsicMethod.declaringClass + String type = MetaUtil.internalNameToJava(e.getKey(), true, false).replace('.', '/'); + for (Binding binding : e.getValue()) { + if (match(type, binding, intrinsic)) { + return binding.plugin; + } } } return null; } - private static ResolvedJavaMethod resolveIntrinsic(MetaAccessProvider metaAccess, VMIntrinsicMethod intrinsic) throws ClassNotFoundException { + public static ResolvedJavaMethod resolveIntrinsic(MetaAccessProvider metaAccess, VMIntrinsicMethod intrinsic) throws ClassNotFoundException { Class c = Class.forName(intrinsic.declaringClass.replace('/', '.'), false, CheckGraalIntrinsics.class.getClassLoader()); for (Method javaMethod : c.getDeclaredMethods()) { if (javaMethod.getName().equals(intrinsic.name)) { @@ -425,28 +428,20 @@ public void test() throws ClassNotFoundException { HotSpotGraalRuntimeProvider rt = (HotSpotGraalRuntimeProvider) Graal.getRequiredCapability(RuntimeProvider.class); HotSpotProviders providers = rt.getHostBackend().getProviders(); - Map impl = new HashMap<>(); Plugins graphBuilderPlugins = providers.getGraphBuilderPlugins(); InvocationPlugins invocationPlugins = graphBuilderPlugins.getInvocationPlugins(); - for (ResolvedJavaMethod method : invocationPlugins.getMethods()) { - InvocationPlugin plugin = invocationPlugins.lookupInvocation(method); - assert plugin != null; - impl.put(method, plugin); - } - Set methods = invocationPlugins.getMethods(); HotSpotVMConfigStore store = rt.getVMConfig().getStore(); List intrinsics = store.getIntrinsics(); List missing = new ArrayList<>(); + Map> bindings = invocationPlugins.getBindings(true); for (VMIntrinsicMethod intrinsic : intrinsics) { - ResolvedJavaMethod method = findMethod(methods, intrinsic); - if (method == null) { - method = resolveIntrinsic(providers.getMetaAccess(), intrinsic); - - IntrinsicMethod intrinsicMethod = null; + InvocationPlugin plugin = findPlugin(bindings, intrinsic); + if (plugin == null) { + ResolvedJavaMethod method = resolveIntrinsic(providers.getMetaAccess(), intrinsic); if (method != null) { - intrinsicMethod = providers.getConstantReflection().getMethodHandleAccess().lookupMethodHandleIntrinsic(method); + IntrinsicMethod intrinsicMethod = providers.getConstantReflection().getMethodHandleAccess().lookupMethodHandleIntrinsic(method); if (intrinsicMethod != null) { continue; }