RFR (S) 8141044: C1 should fold (this == null) to false

Aleksey Shipilev aleksey.shipilev at oracle.com
Sun Nov 1 12:59:14 UTC 2015


Hi John,

On 11/01/2015 05:10 AM, John Rose wrote:
> On Oct 31, 2015, at 5:52 PM, Aleksey Shipilev
> <aleksey.shipilev at oracle.com> wrote:
>> 
>> Hi,
>> 
>> I would like to suggest a simple improvement in C1: folding "(this
>> == null)" to "false". This is a minor nit in A*FU performance with
>> C1.
>> 
>> JIRA: https://bugs.openjdk.java.net/browse/JDK-8141044
>> 
>> Webrev: http://cr.openjdk.java.net/~shade/8141044/webrev.01/
>> 
>> The patch passes JPRT, and improves the generated code in targeted 
>> benchmarks.
> 
> What happens if javac uses Local[0] for another value, and that value
> is null?

Um. I think there is a confusion between "slots" in bytecode and Locals
in C1. My cursory reading of C1 code tells me that only the receiver and
arguments are exposed as Local-s in C1: see the patch, where only
GraphBuilder::state_at_entry creates Locals, and also it is said:

// A local is a placeholder for an incoming argument to a function call.
LEAF(Local, Instruction)

It would seem that we track what instruction had born the value, and
Local is a placeholder for "look, it was coming from the outside".
Therefore, I think a subsequent astore_0/aload_0 cannot be confused as
the receiver.

> Something has to clear out the _is_receiver bit if Local[0] can ever
> be set to non-null.

That's the thing: I cannot see how it could be set to non-null... If we
ever overwrite the slot, we overwrite the Local[0] completely, including
its _is_receiver, right?

> Here's a bad case of how it can go wrong:

> foo(x, y) {
> entry:
>   Local[0] = x; Local[0].is_recv = true;
>   Local[1] = y;
> loopHead:
>   for (;;) {
>     if (Local[0] == null)  doSomethingValid();  // SHOULD reach here, if y==null
>   trickyBit:
>     Local[0] = Local[1];
>   }
> }

I don't understand this example, sorry. What does it mean, "Local[0] =
Local[1]"? The example seems to assume that Local is some kind of
indexed table where we store values. But in C1, Local is just a Value
box which stores the incoming function argument.

Thanks,
-Aleksey


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20151101/775ecd97/signature.asc>


More information about the hotspot-compiler-dev mailing list