RFR(S)[13]: AArch64: float point register corruption in ZBarrierSetAssembler::load_at

Andrew Haley aph at redhat.com
Fri Jun 21 13:07:12 UTC 2019

On 6/21/19 10:32 AM, Stuart Monteith wrote:
> Apologies - sent prematurely.
> The interpreter passes rscratch1, which ultimately ends up in load_at.
> The first thing you'll hit is a call from the interpreter.
> TemplateInterpreterGenerator::generate_fixed_frame
> 888       // Get mirror and store it in the frame as GC root for this Method*
> 889       __ load_mirror(rscratch1, rmethod);
> 890       __ stp(rscratch1, zr, Address(sp, 4 * wordSize));

Ah, yes. The interpreter has its own rules. So the problem is not that
rscratch1 is live across the call but that it's actually used as a

So how to fix it? There's no need to use scratch1 here, so we could
assert that scratch registers aren't used as args to load_at or make
load_at suitably defensive when it happens.

Andrew Haley  (he/him)
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671

More information about the hotspot-gc-dev mailing list