changeset 23202:b774f4158a1a

Put non-null return stamps on allocation ForeignCalls
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Thu, 17 Dec 2015 19:38:34 -0800
parents 2e195fa3808c
children fd4350a00e99
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/graphbuilderconf/NodeIntrinsicPluginFactory.java graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/InjectedDependencies.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationProvider.java
diffstat 5 files changed, 17 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Thu Dec 17 17:20:10 2015 +0100
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Thu Dec 17 19:38:34 2015 -0800
@@ -188,6 +188,12 @@
          * ignored and can therefore safely be {@code null}.
          */
         boolean setStampFromReturnType() default false;
+
+        /**
+         * Determines if the stamp of the instantiated intrinsic node is guaranteed to be non-null.
+         * Generally used in conjunction with {@link #setStampFromReturnType()}.
+         */
+        boolean returnStampIsNonNull() default false;
     }
 
     /**
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java	Thu Dec 17 17:20:10 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java	Thu Dec 17 19:38:34 2015 -0800
@@ -204,7 +204,7 @@
         return piCast(verifyOop(result), StampFactory.forNodeIntrinsic());
     }
 
-    @NodeIntrinsic(ForeignCallNode.class)
+    @NodeIntrinsic(value = ForeignCallNode.class, returnStampIsNonNull = true)
     public static native Object newInstance(@ConstantNodeParameter ForeignCallDescriptor descriptor, KlassPointer hub);
 
     @Snippet
@@ -270,20 +270,20 @@
         return result;
     }
 
-    @NodeIntrinsic(ForeignCallNode.class)
+    @NodeIntrinsic(value = ForeignCallNode.class, returnStampIsNonNull = true)
     public static native Object newArray(@ConstantNodeParameter ForeignCallDescriptor descriptor, KlassPointer hub, int length, boolean fillContents);
 
     public static final ForeignCallDescriptor DYNAMIC_NEW_ARRAY = new ForeignCallDescriptor("dynamic_new_array", Object.class, Class.class, int.class);
     public static final ForeignCallDescriptor DYNAMIC_NEW_INSTANCE = new ForeignCallDescriptor("dynamic_new_instance", Object.class, Class.class);
 
-    @NodeIntrinsic(ForeignCallNode.class)
+    @NodeIntrinsic(value = ForeignCallNode.class, returnStampIsNonNull = true)
     public static native Object dynamicNewArrayStub(@ConstantNodeParameter ForeignCallDescriptor descriptor, Class<?> elementType, int length);
 
     public static Object dynamicNewInstanceStub(Class<?> elementType) {
         return dynamicNewInstanceStubCall(DYNAMIC_NEW_INSTANCE, elementType);
     }
 
-    @NodeIntrinsic(ForeignCallNode.class)
+    @NodeIntrinsic(value = ForeignCallNode.class, returnStampIsNonNull = true)
     public static native Object dynamicNewInstanceStubCall(@ConstantNodeParameter ForeignCallDescriptor descriptor, Class<?> elementType);
 
     @Snippet
@@ -342,7 +342,7 @@
         return newArrayCall(HotSpotBackend.NEW_MULTI_ARRAY, hub, rank, dims);
     }
 
-    @NodeIntrinsic(ForeignCallNode.class)
+    @NodeIntrinsic(value = ForeignCallNode.class, returnStampIsNonNull = true)
     public static native Object newArrayCall(@ConstantNodeParameter ForeignCallDescriptor descriptor, Word hub, int rank, Word dims);
 
     /**
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/graphbuilderconf/NodeIntrinsicPluginFactory.java	Thu Dec 17 17:20:10 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/graphbuilderconf/NodeIntrinsicPluginFactory.java	Thu Dec 17 19:38:34 2015 -0800
@@ -30,7 +30,7 @@
 
         <T> T getInjectedArgument(Class<T> type);
 
-        Stamp getReturnStamp(Class<?> type);
+        Stamp getReturnStamp(Class<?> type, boolean nonNull);
     }
 
     void registerPlugins(InvocationPlugins plugins, InjectionProvider injection);
--- a/graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/InjectedDependencies.java	Thu Dec 17 17:20:10 2015 +0100
+++ b/graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/InjectedDependencies.java	Thu Dec 17 19:38:34 2015 -0800
@@ -30,6 +30,7 @@
 import javax.lang.model.type.DeclaredType;
 import javax.lang.model.type.TypeMirror;
 
+import com.oracle.graal.graph.Node.NodeIntrinsic;
 import com.oracle.graal.replacements.verifier.InjectedDependencies.Dependency;
 
 public class InjectedDependencies implements Iterable<Dependency> {
@@ -67,7 +68,8 @@
 
         @Override
         public String inject(ExecutableElement inject) {
-            return String.format("injection.getReturnStamp(%s.class)", GeneratedPlugin.getErasedType(inject.getReturnType()));
+            NodeIntrinsic nodeIntrinsic = inject.getAnnotation(NodeIntrinsic.class);
+            return String.format("injection.getReturnStamp(%s.class, %s)", GeneratedPlugin.getErasedType(inject.getReturnType()), nodeIntrinsic != null && nodeIntrinsic.returnStampIsNonNull());
         }
     }
 
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationProvider.java	Thu Dec 17 17:20:10 2015 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationProvider.java	Thu Dec 17 19:38:34 2015 -0800
@@ -49,14 +49,14 @@
     }
 
     @Override
-    public Stamp getReturnStamp(Class<?> type) {
+    public Stamp getReturnStamp(Class<?> type, boolean nonNull) {
         JavaKind kind = JavaKind.fromJavaClass(type);
         if (kind == JavaKind.Object) {
             ResolvedJavaType returnType = metaAccess.lookupJavaType(type);
             if (wordTypes.isWord(returnType)) {
                 return wordTypes.getWordStamp(returnType);
             } else {
-                return StampFactory.declared(returnType);
+                return nonNull ? StampFactory.declaredNonNull(returnType) : StampFactory.declared(returnType);
             }
         } else {
             return StampFactory.forKind(kind);