tableswitch does not use an array of offsets

Yann Le Tallec ylt at letallec.org
Wed Mar 27 01:56:06 PDT 2013


The code below is compiled as a tableswitch bytecode instruction as one
would expect because the case values are contiguous. However, the JIT
(Hotspot using JDK/JRE 1.7u17 64 bit on x86/Windows in either -server or
-client mode) compiles it into a succession of cmp/je/jg.

When adding one more case statement (case 17) to reach a total number of 18
case statements, the JIT does compile the switch using an array of offsets
to calculate the jump.

A micro-benchmark (controlled for compilation, inlining (off), gc) shows
that adding an additional case statement to the method below (case 17) to
reach a total of 18 improves performance materially (up to 25% depending on
how the method is exercised).

Is the decision to *not* use an array of offsets for <18 cases derived from
profiling? Is that the expected behaviour and what is the underlying reason?

Many thanks,
Yann

    static double multiplyByPowerOfTen(final double d, final int exponent) {
        switch (exponent) {
            case 0:
                return d;
            case 1:
                return d * 10;
            case 2:
                return d * 100;
            case 3:
                return d * 1000;
            case 4:
                return d * 10000;
            case 5:
                return d * 100000;
            case 6:
                return d * 1000000;
            case 7:
                return d * 10000000;
            case 8:
                return d * 100000000;
            case 9:
                return d * 1000000000;
            case 10:
                return d * 10000000000L;
            case 11:
                return d * 100000000000L;
            case 12:
                return d * 1000000000000L;
            case 13:
                return d * 10000000000000L;
            case 14:
                return d * 100000000000000L;
            case 15:
                return d * 1000000000000000L;
            case 16:
                return d * 10000000000000000L;
            default:
                throw new RuntimeException("Unhandled power of ten " +
exponent);
        }
    }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20130327/844ad935/attachment.html 


More information about the hotspot-compiler-dev mailing list