changeset 18402:64c042352f00

Make stamp of LoadHubNode flexible.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 17 Nov 2014 18:11:34 +0100
parents e7ab82e7cc37
children b9f2356c3a69
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/TypeGuardInlineInfo.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java
diffstat 4 files changed, 21 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java	Mon Nov 17 17:25:38 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java	Mon Nov 17 18:11:34 2014 +0100
@@ -41,21 +41,16 @@
         return value;
     }
 
-    public static LoadHubNode create(ValueNode value) {
-        return new LoadHubNode(value);
+    public static LoadHubNode create(@InjectedNodeParameter Stamp stamp, ValueNode value) {
+        return new LoadHubNode(stamp, value, null);
     }
 
-    protected LoadHubNode(ValueNode value) {
-        super(StampFactory.forPointer(PointerType.Type), null);
-        this.value = value;
+    public static LoadHubNode create(@InjectedNodeParameter Stamp stamp, ValueNode value, ValueNode guard) {
+        return new LoadHubNode(stamp, value, guard);
     }
 
-    public static LoadHubNode create(ValueNode value, ValueNode guard) {
-        return new LoadHubNode(value, guard);
-    }
-
-    protected LoadHubNode(ValueNode value, ValueNode guard) {
-        super(StampFactory.forPointer(PointerType.Type), (GuardingNode) guard);
+    protected LoadHubNode(Stamp stamp, ValueNode value, ValueNode guard) {
+        super(stamp, (GuardingNode) guard);
         assert value != guard;
         this.value = value;
     }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java	Mon Nov 17 17:25:38 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java	Mon Nov 17 18:11:34 2014 +0100
@@ -343,7 +343,7 @@
     private boolean createDispatchOnTypeBeforeInvoke(StructuredGraph graph, BeginNode[] successors, boolean invokeIsOnlySuccessor, MetaAccessProvider metaAccess) {
         assert ptypes.size() >= 1;
         ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke);
-        LoadHubNode hub = graph.unique(LoadHubNode.create(nonNullReceiver));
+        LoadHubNode hub = graph.unique(LoadHubNode.create(StampFactory.forPointer(PointerType.Type), nonNullReceiver));
 
         if (!invokeIsOnlySuccessor && chooseMethodDispatch()) {
             assert successors.length == concretes.size() + 1;
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/TypeGuardInlineInfo.java	Mon Nov 17 17:25:38 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/TypeGuardInlineInfo.java	Mon Nov 17 18:11:34 2014 +0100
@@ -24,17 +24,18 @@
 
 import java.util.*;
 
-import com.oracle.graal.api.code.Assumptions;
+import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
-import com.oracle.graal.compiler.common.calc.Condition;
+import com.oracle.graal.compiler.common.calc.*;
+import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.graph.*;
-import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.CallTargetNode.InvokeKind;
-import com.oracle.graal.nodes.calc.CompareNode;
-import com.oracle.graal.nodes.extended.LoadHubNode;
-import com.oracle.graal.phases.common.inlining.InliningUtil;
-import com.oracle.graal.phases.common.inlining.info.elem.Inlineable;
-import com.oracle.graal.phases.util.Providers;
+import com.oracle.graal.nodes.*;
+import com.oracle.graal.nodes.calc.*;
+import com.oracle.graal.nodes.extended.*;
+import com.oracle.graal.phases.common.inlining.*;
+import com.oracle.graal.phases.common.inlining.info.elem.*;
+import com.oracle.graal.phases.util.*;
 
 /**
  * Represents an inlining opportunity for which profiling information suggests a monomorphic
@@ -103,7 +104,7 @@
 
     private void createGuard(StructuredGraph graph, MetaAccessProvider metaAccess) {
         ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke);
-        LoadHubNode receiverHub = graph.unique(LoadHubNode.create(nonNullReceiver));
+        LoadHubNode receiverHub = graph.unique(LoadHubNode.create(StampFactory.forPointer(PointerType.Type), nonNullReceiver));
         ConstantNode typeHub = ConstantNode.forConstant(receiverHub.stamp(), type.getObjectHub(), metaAccess, graph);
 
         CompareNode typeCheck = CompareNode.createCompareNode(graph, Condition.EQ, receiverHub, typeHub);
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java	Mon Nov 17 17:25:38 2014 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java	Mon Nov 17 18:11:34 2014 +0100
@@ -214,7 +214,7 @@
 
         for (ResolvedJavaMethod m : nodeClass.getDeclaredMethods()) {
             if (m.getName().equals("create") && !m.isSynthetic()) {
-                JavaConstant[] match = match(graph, m, parameterTypes, nodeFactoryArguments);
+                JavaConstant[] match = match(graph, invokeStamp, m, parameterTypes, nodeFactoryArguments);
 
                 if (match != null) {
                     if (factory == null) {
@@ -267,7 +267,7 @@
         return false;
     }
 
-    private JavaConstant[] match(StructuredGraph graph, ResolvedJavaMethod m, ResolvedJavaType[] parameterTypes, JavaConstant[] nodeFactoryArguments) {
+    private JavaConstant[] match(StructuredGraph graph, Stamp invokeStamp, ResolvedJavaMethod m, ResolvedJavaType[] parameterTypes, JavaConstant[] nodeFactoryArguments) {
         JavaConstant[] arguments = null;
         JavaConstant[] injected = null;
 
@@ -284,6 +284,8 @@
                     injected[injected.length - 1] = snippetReflection.forObject(providers.getForeignCalls());
                 } else if (signature[i].equals(metaAccess.lookupJavaType(SnippetReflectionProvider.class))) {
                     injected[injected.length - 1] = snippetReflection.forObject(snippetReflection);
+                } else if (signature[i].isAssignableFrom(metaAccess.lookupJavaType(Stamp.class))) {
+                    injected[injected.length - 1] = snippetReflection.forObject(invokeStamp);
                 } else {
                     throw new GraalInternalError("Cannot handle injected argument of type %s in %s", signature[i].toJavaName(), m.format("%H.%n(%p)"));
                 }