A simple optimization proposal (original) (raw)

Martin Grajcar maaartinus at gmail.com
Wed Feb 12 18:05:18 PST 2014


Hi Vladimir,

On Thu, Feb 13, 2014 at 12:45 AM, Vladimir Kozlov < vladimir.kozlov at oracle.com> wrote:

On 2/12/14 3:32 PM, Martin Grajcar wrote:

Hi John, Chris, and Vladimir,

I guess the Gist replacing (x & array.length - 1) u< array.length_ _by_ _array.length != 0_ _can be easily changed to implement_ _(x & (m-1)) u< m, if and only if (m > 0) Yes, that is what Kris did.

Yes, I was being too slow with my email.

in general, but I wonder if it will result in the optimal code for

arrays, which can look like

int mask = array.length - 1; // already there if (mask < 0) goAway(); C2 generates uncommon trap in such cases and go to interpreter to throw exception. As result the hot path in compiled code is compact.

That's what I've meant with goAway. My point was the jump using already computed flags (which doesn't work as you explained below).

where the second line on i86 translates to simply jump if sign, i.e., a

conditional branch without any test as the flags has been already set.

C2 always generates test instruction before jump. It is one of shortfalls of C2.

So forget my above idea.

Note that modern x86 cpus fuse tst+jcc (and cmp+jcc) instructions into 1 micro-instruction. So there should be no performance penalty to have a separate test instruction.

I see, but can't other limits (number of bytes fetched, or instructions decoded, or whatever) pose a problem? Probably not worth the effort, I guess.

Regards, Martin. -------------- next part -------------- An HTML attachment was scrubbed... URL: http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20140213/2e426d8e/attachment.html



More information about the hotspot-compiler-dev mailing list