Smaller byte code for small constants
Paul Govereau
paul.govereau at oracle.com
Sat Sep 13 01:29:08 UTC 2014
Hi Vitaly,
Thanks for the response. The only benefit here is a slightly smaller
classfile. However, if there is a risk of impacting the optimizer, it
hardly seems worth it.
On 09/12/2014 07:00 PM, Vitaly Davidovich wrote:
> Hi Paul,
>
> This would increase the bytecode size of methods containing these
> scenarios, right? If so, having several of these may push a method over
> jit inlining heuristic that uses bytecode size. This issue has come up
> in other contexts as well (e.g. asserts causing same problem). I'd say
> until the jit inliner is changed to use something smarter (e.g. CFG
> complexity post some basic reductions or something like that), this has
> potential for perf regressions.
>
> Presumably interpreter may not like this either, but I don't know.
>
> Out of curiosity what's the practical benefit of saving a constant pool
> slot? Less VM memory overhead?
>
> Sent from my phone
>
> On Sep 12, 2014 2:42 PM, "Paul Govereau" <paul.govereau at oracle.com
> <mailto:paul.govereau at oracle.com>> wrote:
>
> Currently, for long, float and double, javac will emit an ldc
> instruction for small constants (aside from 0, 1, 2). For instance,
> this statement:
>
> long x = 3;
>
> produces the code:
>
> ldc2_w #index
> lstore_n
>
> However, we could save ourselves a constant pool slot with:
>
> bipush 3
> i2l
> istore_n
>
> The same trick can be used for float and double constants that
> happen to be round integers (modulo the semantics of i2f?).
>
> Are there bad consequences for the interpreter or runtime compiler
> if we made this change in javac?
>
> Thanks,
> Paul
>
More information about the compiler-dev
mailing list