# HG changeset patch # User Roland Schatz # Date 1416244294 -3600 # Node ID 64c042352f00d342e5efe0d1426c9e7a2cfed594 # Parent e7ab82e7cc3760586abf6e5821734b6f6571713f Make stamp of LoadHubNode flexible. diff -r e7ab82e7cc37 -r 64c042352f00 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java --- 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; } diff -r e7ab82e7cc37 -r 64c042352f00 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java --- 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; diff -r e7ab82e7cc37 -r 64c042352f00 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/TypeGuardInlineInfo.java --- 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); diff -r e7ab82e7cc37 -r 64c042352f00 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java --- 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)")); }