[master] RFR: 8303769: [Lilliput] Fix interpreter asymmetric fast-locking

Thomas Stuefe stuefe at openjdk.org
Wed Mar 8 12:40:37 UTC 2023


On Tue, 7 Mar 2023 20:38:28 GMT, Roman Kennke <rkennke at openjdk.org> wrote:

> Currently we get the asymmetric locking check in the interpreters wrong:
> 
> ldr(header_reg, Address(rthread, JavaThread::lock_stack_current_offset()));
> cmpoop(header_reg, obj_reg);
> br(Assembler::NE, slow_case);
> 
> The intention is to load the top of the lock-stack, and compare it to the unlocked object, and, if not equal, branch to the slow-path to handle it. However, what it really does is, it loads the *address* of the top of lock-stack, and compares that to the unlocked object. This can never succeed, and therefore we always call the slow-path. Additionally, the address is not the address of the topmost object, it is the address of the next free slot. What we really want to load is the element at -1 oop from that address. This is not incorrect, but it's unnecessarily slow.'
> 
> I've already pushed that fix to the upstream fast-locking PR https://github.com/openjdk/jdk/pull/10907
> 
> Testing:
>  - [x] tier1 (x86_64, x86_32, aarch64)
>  - [ ] tier2 (x86_64, x86_32, aarch64)

- As with the other PR, reusing named registers for something else confuses casual readers like me :-) consider using aliases within the scopes where they are used. Even if they are just named "tmp".
- Accessing stack -1 looks scary. I would feel better with some sort of emitted assert that we don't access stack -1, unless this would increase the size of compiled code too much or unless we do this test somewhere else.
- You also may want to fix riscv

-------------

PR: https://git.openjdk.org/lilliput/pull/76


More information about the lilliput-dev mailing list