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