# HG changeset patch # User Doug Simon # Date 1417040756 -3600 # Node ID e43065342babb182866cbc522a40fdbbc10500d8 # Parent 4f27e4a4b4c594986323f9310fa66da6a01547ef# Parent 3fb1231699de62e934ecda3315728e2cb45520fd Merge. diff -r 4f27e4a4b4c5 -r e43065342bab graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java Wed Nov 26 23:24:13 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java Wed Nov 26 23:25:56 2014 +0100 @@ -57,7 +57,7 @@ protected MethodHandleNode(Invoke invoke) { super(invoke); - MethodCallTargetNode callTarget = (MethodCallTargetNode) invoke.callTarget(); + CallTargetNode callTarget = invoke.callTarget(); // See if we need to save some replacement method data. if (callTarget instanceof SelfReplacingMethodCallTargetNode) { @@ -237,7 +237,6 @@ */ private InvokeNode createTargetInvokeNode(ResolvedJavaMethod target, IntrinsicMethod intrinsicMethod) { InvokeKind targetInvokeKind = target.isStatic() ? InvokeKind.Static : InvokeKind.Special; - JavaType targetReturnType = target.getSignature().getReturnType(null); // MethodHandleLinkTo* nodes have a trailing MemberName argument which // needs to be popped. @@ -258,12 +257,12 @@ } // If there is already replacement information, use that instead. - MethodCallTargetNode callTarget; + CallTargetNode callTarget; if (replacementTargetMethod == null) { - callTarget = SelfReplacingMethodCallTargetNode.create(targetInvokeKind, target, targetArguments, targetReturnType, getTargetMethod(), originalArguments, getReturnType()); + callTarget = SelfReplacingMethodCallTargetNode.create(targetInvokeKind, target, targetArguments, getTargetMethod(), originalArguments, getReturnType()); } else { ValueNode[] args = replacementArguments.toArray(new ValueNode[replacementArguments.size()]); - callTarget = SelfReplacingMethodCallTargetNode.create(targetInvokeKind, target, targetArguments, targetReturnType, replacementTargetMethod, args, replacementReturnType); + callTarget = SelfReplacingMethodCallTargetNode.create(targetInvokeKind, target, targetArguments, replacementTargetMethod, args, replacementReturnType); } graph().add(callTarget); diff -r 4f27e4a4b4c5 -r e43065342bab graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/SelfReplacingMethodCallTargetNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/SelfReplacingMethodCallTargetNode.java Wed Nov 26 23:24:13 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/SelfReplacingMethodCallTargetNode.java Wed Nov 26 23:25:56 2014 +0100 @@ -24,6 +24,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; +import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodeinfo.*; import com.oracle.graal.nodes.*; @@ -37,21 +38,21 @@ * inlined. */ @NodeInfo -public class SelfReplacingMethodCallTargetNode extends MethodCallTargetNode implements Lowerable { +public class SelfReplacingMethodCallTargetNode extends CallTargetNode implements Lowerable { // Replacement method data protected final ResolvedJavaMethod replacementTargetMethod; protected final JavaType replacementReturnType; @Input NodeInputList replacementArguments; - public static SelfReplacingMethodCallTargetNode create(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] arguments, JavaType returnType, - ResolvedJavaMethod replacementTargetMethod, ValueNode[] replacementArguments, JavaType replacementReturnType) { - return new SelfReplacingMethodCallTargetNode(invokeKind, targetMethod, arguments, returnType, replacementTargetMethod, replacementArguments, replacementReturnType); + public static SelfReplacingMethodCallTargetNode create(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] arguments, ResolvedJavaMethod replacementTargetMethod, + ValueNode[] replacementArguments, JavaType replacementReturnType) { + return new SelfReplacingMethodCallTargetNode(invokeKind, targetMethod, arguments, replacementTargetMethod, replacementArguments, replacementReturnType); } - protected SelfReplacingMethodCallTargetNode(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] arguments, JavaType returnType, ResolvedJavaMethod replacementTargetMethod, + protected SelfReplacingMethodCallTargetNode(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] arguments, ResolvedJavaMethod replacementTargetMethod, ValueNode[] replacementArguments, JavaType replacementReturnType) { - super(invokeKind, targetMethod, arguments, returnType); + super(arguments, targetMethod, invokeKind); this.replacementTargetMethod = replacementTargetMethod; this.replacementReturnType = replacementReturnType; this.replacementArguments = new NodeInputList<>(this, replacementArguments); @@ -83,4 +84,22 @@ public void generate(NodeLIRBuilderTool gen) { throw GraalInternalError.shouldNotReachHere("should have replaced itself"); } + + @Override + public Stamp returnStamp() { + Kind returnKind = targetMethod().getSignature().getReturnKind(); + if (returnKind == Kind.Object && replacementReturnType instanceof ResolvedJavaType) { + return StampFactory.declared((ResolvedJavaType) replacementReturnType); + } else { + return StampFactory.forKind(returnKind); + } + } + + @Override + public String targetName() { + if (targetMethod() == null) { + return "??Invalid!"; + } + return targetMethod().format("%h.%n"); + } } diff -r 4f27e4a4b4c5 -r e43065342bab graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java Wed Nov 26 23:24:13 2014 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java Wed Nov 26 23:25:56 2014 +0100 @@ -144,15 +144,19 @@ lookupExceedsMaxSize(); } + StructuredGraph graph; + PhaseContext phaseContext = new PhaseContext(providers, new Assumptions(false)); try (Scope s = Debug.scope("TruffleCache", providers.getMetaAccess(), method)) { - final PhaseContext phaseContext = new PhaseContext(providers, new Assumptions(false)); - Mark mark = null; - - final StructuredGraph graph = parseGraph(method, phaseContext); + graph = parseGraph(method, phaseContext); if (graph == null) { return null; } + } catch (Throwable e) { + throw Debug.handle(e); + } + + try (Scope s = Debug.scope("TruffleCache", providers.getMetaAccess(), method, graph)) { lastUsed.put(key, counter++); cache.put(key, markerGraph); @@ -172,6 +176,7 @@ PartialEscapePhase partialEscapePhase = new PartialEscapePhase(false, canonicalizer); + Mark mark = null; while (true) { partialEscapePhase.apply(graph, phaseContext);