RFR: 8236850: Operations on constant List/Set.of(element) instances does not consistently constant fold

John Rose john.r.rose at oracle.com
Sat Jan 11 01:23:50 UTC 2020


On Jan 10, 2020, at 10:47 AM, Remi Forax <forax at univ-mlv.fr> wrote:

> Seem to be a JIT bug to me,
> the fields of Set12 are declared final not @Stable (even if the field storing the instanceof of Set&2 itself is marked @Stable) so there is no reason not not let the constant folding happen.

It’s part of the contract of @Stable that default values (null) are not
inlined.  The reason for this is that some @Stable variables are lazy,
and the JIT needs to avoid assuming that default values stay that
way forever.

So, Claes is right that the empty slots need filling with a non-default
(non-null) value.

I think I’d prefer to see the following filler value rather `this`:

private static final EMPTY = new Object();

It might make escape analysis more robust if we don’t have objects
randomly storing pointer to themselves.

That value `SALT >= 0` inverts regularly every four seconds,
doesn’t it?  Not very salty, that.  I suggest adding a multiply to
make that sign bit more spicy:

         long nt = System.nanoTime();
         nt *=  0x243F_6A88_85A3_08D3L;  // a slice of pi
         SALT = (int)((nt >>> 32) ^ nt);
        REVERSE = SALT >= 0;

The hex number is the fractional part of pi (in hex).
Any arbitrary odd number with a balance of 1’s and 0’s will mix
things up well enough to produce an irregularly varying sign bit.
Using a well-known number makes it obvious there’s nothing
up our sleeve.

— John

P.S.  Not for this change set, but such salty values should be
derived from an optionally specified seed value, so JVM executions
can be made reproducible.  Could be a diagnostic flag:

    java -XX:+UnlockDiagnosticVMOptions -XX:VMSaltSeed=42

The salt seed would be initialized from the nanotime or some such.



More information about the core-libs-dev mailing list