Bounds checks with unsafe array access
Paul Sandoz
paul.sandoz at oracle.com
Fri Sep 12 14:37:43 UTC 2014
On Sep 10, 2014, at 10:20 PM, John Rose <john.r.rose at oracle.com> wrote:
> On Sep 10, 2014, at 3:47 AM, Paul Sandoz <paul.sandoz at oracle.com> wrote:
>
>> The patch for JDK-8003585 makes no difference.
>
> My first thought, is, why not? Isn't that just a bug?
>
I would presume so, it seems a general pattern, but I dunno enough about the C2 graph representation. Should i start by rendering graphs and eye-balling them?
> For virtualizing arrays, we need either an explicit range-check intrinsic, or robust canonicalization of the standard idioms into CmpU (which is what we use internally).
>
Ok.
> Actually, we now have Integer.compareUnsigned!
Ah! now it becomes obvious :-)
if (Integer.compareUnsigned(index, a.length) >= 0)
throw new ArrayIndexOutOfBoundsException();
That it should in principle, vis some intrinsification, reduce to something like a cmp/jae or test/jbe depending on what comes before it.
> If we agree that is an intrinsic for range checks, the JIT will have a better optimization target to aim at. Ultimately, we need an intrinsic (perhaps more intentional than Integer.compareUnsigned) that will encourage the JIT to treat it like a range check, doing iteration range splitting, predication, and all the rest.
>
>> (Note: in general we cannot assume that "int index = i & (a.length - 1)" always occurs before the bounds checks, otherwise i would have explicitly written "if (a.length == 0) throw ...")
>
> Right. You want to factor the range check into a bit of code that doesn't know how it's going to be used, but then gets the same perks as normal array code, including the a.length==0 stuff, and the loop opts I mentioned.
>
>> Ideally similar code as shown for an aaload should be generated. Any suggestions/ideas on how to make that happen?
>
> First, agree on a range check intrinsic. Then, treat optimization equity failures as JIT bugs.
Many thanks, seems like an excellent starting point is to intrinsify Integer.compareUnsigned and see what that yields.
Paul.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20140912/de353c43/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 841 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20140912/de353c43/signature.asc>
More information about the hotspot-compiler-dev
mailing list