# HG changeset patch # User Christian Wimmer # Date 1452303930 28800 # Node ID c98de39fd944fea3867652c902bb80fce257757a # Parent 4ba7375046818e9c4e40f3dc399958f1b4173227 Add targetMethod parameter to node intrisics with custom intrinsify method diff -r 4ba737504681 -r c98de39fd944 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java Fri Jan 08 17:44:37 2016 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java Fri Jan 08 17:45:30 2016 -0800 @@ -27,6 +27,7 @@ import jdk.vm.ci.code.BytecodeFrame; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.LocationIdentity; +import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.Value; import com.oracle.graal.compiler.common.spi.ForeignCallDescriptor; @@ -62,8 +63,8 @@ protected final ForeignCallDescriptor descriptor; protected int bci = BytecodeFrame.UNKNOWN_BCI; - public static boolean intrinsify(GraphBuilderContext b, @InjectedNodeParameter Stamp returnStamp, @InjectedNodeParameter ForeignCallsProvider foreignCalls, ForeignCallDescriptor descriptor, - ValueNode... arguments) { + public static boolean intrinsify(GraphBuilderContext b, ResolvedJavaMethod targetMethod, @InjectedNodeParameter Stamp returnStamp, @InjectedNodeParameter ForeignCallsProvider foreignCalls, + ForeignCallDescriptor descriptor, ValueNode... arguments) { ForeignCallNode node = new ForeignCallNode(foreignCalls, descriptor, arguments); node.setStamp(returnStamp); @@ -77,7 +78,7 @@ node.setBci(nonIntrinsicAncestor.bci()); } - JavaKind returnKind = returnStamp.getStackKind(); + JavaKind returnKind = targetMethod.getSignature().getReturnKind(); if (returnKind == JavaKind.Void) { b.add(node); } else { diff -r 4ba737504681 -r c98de39fd944 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCopyNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCopyNode.java Fri Jan 08 17:44:37 2016 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCopyNode.java Fri Jan 08 17:45:30 2016 -0800 @@ -24,6 +24,7 @@ import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.LocationIdentity; +import jdk.vm.ci.meta.ResolvedJavaMethod; import com.oracle.graal.graph.Node.ConstantNodeParameter; import com.oracle.graal.graph.Node.NodeIntrinsic; @@ -36,8 +37,8 @@ */ public final class UnsafeCopyNode { - public static boolean intrinsify(GraphBuilderContext b, ValueNode sourceObject, ValueNode sourceOffset, ValueNode destinationObject, ValueNode destinationOffset, JavaKind accessKind, - LocationIdentity locationIdentity) { + public static boolean intrinsify(GraphBuilderContext b, @SuppressWarnings("unused") ResolvedJavaMethod targetMethod, ValueNode sourceObject, ValueNode sourceOffset, ValueNode destinationObject, + ValueNode destinationOffset, JavaKind accessKind, LocationIdentity locationIdentity) { UnsafeLoadNode value = b.add(new UnsafeLoadNode(sourceObject, sourceOffset, accessKind, locationIdentity)); b.add(new UnsafeStoreNode(destinationObject, destinationOffset, value, accessKind, locationIdentity)); return true; diff -r 4ba737504681 -r c98de39fd944 graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/GeneratedNodeIntrinsicPlugin.java --- a/graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/GeneratedNodeIntrinsicPlugin.java Fri Jan 08 17:44:37 2016 -0800 +++ b/graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/GeneratedNodeIntrinsicPlugin.java Fri Jan 08 17:45:30 2016 -0800 @@ -155,13 +155,13 @@ @Override protected List getParameters() { List ret = customFactory.getParameters(); - // remove initial GraphBuilderContext parameter - return ret.subList(1, ret.size()); + // remove initial GraphBuilderContext and ResolvedJavaMethod parameters + return ret.subList(2, ret.size()); } @Override protected void factoryCall(ProcessingEnvironment env, PrintWriter out, InjectedDependencies deps, int argCount) { - out.printf(" return %s.%s(b", customFactory.getEnclosingElement(), customFactory.getSimpleName()); + out.printf(" return %s.%s(b, targetMethod", customFactory.getEnclosingElement(), customFactory.getSimpleName()); for (int i = 0; i < argCount; i++) { out.printf(", arg%d", i); } diff -r 4ba737504681 -r c98de39fd944 graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/NodeIntrinsicVerifier.java --- a/graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/NodeIntrinsicVerifier.java Fri Jan 08 17:44:37 2016 -0800 +++ b/graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/NodeIntrinsicVerifier.java Fri Jan 08 17:45:30 2016 -0800 @@ -69,6 +69,10 @@ return env.getElementUtils().getTypeElement("jdk.vm.ci.meta.ResolvedJavaType").asType(); } + private TypeMirror resolvedJavaMethodType() { + return env.getElementUtils().getTypeElement("jdk.vm.ci.meta.ResolvedJavaMethod").asType(); + } + private TypeMirror structuralInputType() { return env.getElementUtils().getTypeElement("com.oracle.graal.nodeinfo.StructuralInput").asType(); } @@ -202,7 +206,7 @@ List failureReasons = new ArrayList<>(); for (ExecutableElement constructor : constructors) { - String failureReason = matchSignature(false, constructor, signature); + String failureReason = matchSignature(0, constructor, signature); if (failureReason == null) { // found return constructor; @@ -230,7 +234,7 @@ continue; } - if (method.getParameters().isEmpty()) { + if (method.getParameters().size() < 2) { continue; } @@ -239,7 +243,12 @@ continue; } - String failureReason = matchSignature(true, method, signature); + VariableElement secondArg = method.getParameters().get(1); + if (!isTypeCompatible(secondArg.asType(), resolvedJavaMethodType())) { + continue; + } + + String failureReason = matchSignature(2, method, signature); if (failureReason == null) { // found return method; @@ -249,9 +258,9 @@ return null; } - private String matchSignature(boolean skipFirst, ExecutableElement method, TypeMirror[] signature) { + private String matchSignature(int numSkippedParameters, ExecutableElement method, TypeMirror[] signature) { int sIdx = 0; - int cIdx = skipFirst ? 1 : 0; + int cIdx = numSkippedParameters; while (cIdx < method.getParameters().size()) { VariableElement parameter = method.getParameters().get(cIdx++); if (parameter.getAnnotation(InjectedNodeParameter.class) != null) {