changeset 23283:c98de39fd944

Add targetMethod parameter to node intrisics with custom intrinsify method
author Christian Wimmer <christian.wimmer@oracle.com>
date Fri, 08 Jan 2016 17:45:30 -0800
parents 4ba737504681
children 8257baff2f0d
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCopyNode.java graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/GeneratedNodeIntrinsicPlugin.java graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/NodeIntrinsicVerifier.java
diffstat 4 files changed, 24 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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 {
--- 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;
--- 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<? extends VariableElement> getParameters() {
             List<? extends VariableElement> 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);
             }
--- 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<String> 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) {