RFR (S): use invoker's stamp if target's return stamp is of different type
Christian Thalinger
christian.thalinger at oracle.com
Tue May 21 17:58:55 PDT 2013
On May 20, 2013, at 5:19 PM, Thomas Wuerthinger <thomas.wuerthinger at oracle.com> wrote:
> Looks good - please push!
Thanks. I almost forgot about it.
-- Chris
>
> - thomas
>
> On May 17, 2013, at 1:00 AM, Christian Thalinger <christian.thalinger at oracle.com> wrote:
>
>> This is a fix for 292.
>>
>> -- Chris
>>
>> diff --git a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AbstractMethodHandleNode.java b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AbstractMethodHandleNode.java
>> --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AbstractMethodHandleNode.java
>> +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AbstractMethodHandleNode.java
>> @@ -273,9 +273,20 @@
>> ValueNode[] args = replacementArguments.toArray(new ValueNode[replacementArguments.size()]);
>> callTarget = new SelfReplacingMethodCallTargetNode(invokeKind, targetMethod, targetArguments, returnType, replacementTargetMethod, args, replacementReturnType);
>> }
>> + graph().add(callTarget);
>>
>> - graph().add(callTarget);
>> - InvokeNode invoke = graph().add(new InvokeNode(callTarget, getBci()));
>> + // The call target can have a different return type than the invoker,
>> + // e.g. the target returns an Object but the invoker void. In this case
>> + // we need to use the stamp of the invoker. Note: always using the
>> + // invoker's stamp would be wrong because it's a less concrete type
>> + // (usually java.lang.Object).
>> + InvokeNode invoke;
>> + if (callTarget.returnStamp().kind() != stamp().kind()) {
>> + invoke = new InvokeNode(callTarget, getBci(), stamp());
>> + } else {
>> + invoke = new InvokeNode(callTarget, getBci());
>> + }
>> + graph().add(invoke);
>> invoke.setStateAfter(stateAfter());
>> return invoke;
>> }
>> diff --git a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java
>> --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java
>> +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java
>> @@ -29,6 +29,7 @@
>> import com.oracle.graal.nodes.extended.*;
>> import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity;
>> import com.oracle.graal.nodes.spi.*;
>> +import com.oracle.graal.nodes.type.Stamp;
>> import com.oracle.graal.nodes.util.*;
>>
>> /**
>> @@ -47,11 +48,22 @@
>> /**
>> * Constructs a new Invoke instruction.
>> *
>> + * @param callTarget the target method being called
>> * @param bci the bytecode index of the original invoke (used for debug infos)
>> - * @param callTarget the target method being called
>> */
>> public InvokeNode(CallTargetNode callTarget, int bci) {
>> - super(callTarget.returnStamp());
>> + this(callTarget, bci, callTarget.returnStamp());
>> + }
>> +
>> + /**
>> + * Constructs a new Invoke instruction.
>> + *
>> + * @param callTarget the target method being called
>> + * @param bci the bytecode index of the original invoke (used for debug infos)
>> + * @param stamp the stamp to be used for this value
>> + */
>> + public InvokeNode(CallTargetNode callTarget, int bci, Stamp stamp) {
>> + super(stamp);
>> this.callTarget = callTarget;
>> this.bci = bci;
>> this.polymorphic = false;
>>
>
More information about the graal-dev
mailing list