# HG changeset patch # User Tom Rodriguez # Date 1450409914 28800 # Node ID b774f4158a1af65bfb258594d81c8f10e3de54c9 # Parent 2e195fa3808cc57279bd2c69718251fab89c2a71 Put non-null return stamps on allocation ForeignCalls diff -r 2e195fa3808c -r b774f4158a1a graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- 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; } /** diff -r 2e195fa3808c -r b774f4158a1a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java --- 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); /** diff -r 2e195fa3808c -r b774f4158a1a graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/graphbuilderconf/NodeIntrinsicPluginFactory.java --- 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 getInjectedArgument(Class type); - Stamp getReturnStamp(Class type); + Stamp getReturnStamp(Class type, boolean nonNull); } void registerPlugins(InvocationPlugins plugins, InjectionProvider injection); diff -r 2e195fa3808c -r b774f4158a1a graal/com.oracle.graal.replacements.verifier/src/com/oracle/graal/replacements/verifier/InjectedDependencies.java --- 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 { @@ -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()); } } diff -r 2e195fa3808c -r b774f4158a1a graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationProvider.java --- 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);