# HG changeset patch # User Lukas Stadler # Date 1390916756 -3600 # Node ID c3d0aefceff7a7529cc0bf25b8b32a82bf09e1ef # Parent 7adf2778dc96345033d265a0fff8b0563dc0afce remember InvokeKind in MacroNode diff -r 7adf2778dc96 -r c3d0aefceff7 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Tue Jan 28 14:39:52 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Tue Jan 28 14:45:56 2014 +0100 @@ -24,8 +24,6 @@ import static java.lang.reflect.Modifier.*; -import java.lang.reflect.*; - import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; @@ -47,6 +45,7 @@ private final int bci; private final ResolvedJavaMethod targetMethod; private final JavaType returnType; + private final InvokeKind invokeKind; protected MacroNode(Invoke invoke) { super(invoke.asNode().stamp(), invoke.stateAfter()); @@ -55,6 +54,7 @@ this.bci = invoke.bci(); this.targetMethod = methodCallTarget.targetMethod(); this.returnType = methodCallTarget.returnType(); + this.invokeKind = methodCallTarget.invokeKind(); } public int getBci() { @@ -148,17 +148,21 @@ } } - private InvokeNode replaceWithInvoke() { + protected InvokeNode replaceWithInvoke() { InvokeNode invoke = createInvoke(); graph().replaceFixedWithFixed(this, invoke); return invoke; } protected InvokeNode createInvoke() { - InvokeKind invokeKind = Modifier.isStatic(targetMethod.getModifiers()) ? InvokeKind.Static : InvokeKind.Special; MethodCallTargetNode callTarget = graph().add(new MethodCallTargetNode(invokeKind, targetMethod, arguments.toArray(new ValueNode[arguments.size()]), returnType)); InvokeNode invoke = graph().add(new InvokeNode(callTarget, bci)); - invoke.setStateAfter(stateAfter()); + if (stateAfter() != null) { + invoke.setStateAfter(stateAfter().duplicate()); + if (kind() != Kind.Void) { + invoke.stateAfter().replaceFirstInput(this, invoke); + } + } return invoke; }