RFR(S)[13]: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
Stuart Monteith
stuart.monteith at linaro.org
Fri Jun 21 16:02:32 UTC 2019
Hello Andrew,
I'm trying passing r19 instead of rscratch1 to __ load_mirror and
also checking that rscratch1,2 aren't passed to load_at. That would
free up rscratch1 and 2 to be used, and not saved, in load_at. The tmp
register is more often than not set to rscratch2 or noreg, so it isn't
a terribly useful parameter.
BR,
Stuart
On Fri, 21 Jun 2019 at 14:07, Andrew Haley <aph at redhat.com> wrote:
>
> 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
> parameter.
>
> 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>
> https://keybase.io/andrewhaley
> EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
More information about the hotspot-gc-dev
mailing list