RFR (M): 8068038: C2: large constant offsets aren't handled on SPARC
vladimir.x.ivanov at oracle.com
Thu Feb 25 22:09:31 UTC 2016
C2 doesn't handle large constant offsets ((>=2^12 bytes) on SPARC and
simply bails out the compilation and marks the method as non-compilable.
It has severe performance impact For example, some Octane benchmarks
suffer >10x slowdown.
The fix is to use variable-sized encoding and put large offsets in the
register. It means that all match rules and instructions which depend on
emit_form3_mem_reg become variable-sized as well and their size should
be computed dynamically.
I verified C2 compilation times and code emission still takes ~3-4%.
Also, did some cleanups: got rid of size computations in
MachSpillCopyNode::implementation and helper methods, refactored
Testing: octane, JPRT.
PS: there's an additional cleanup  in sparc.ad (mostly 32-bit SPARC
removal, but also added some comments). It can go along with this fix or
as part of the 32-bit SPARC complete removal (JDK-8150388). Let me know
what do you prefer.
More information about the hotspot-compiler-dev