[master] RFR: 8303769: [Lilliput] Fix interpreter asymmetric fast-locking [v2]
Roman Kennke
rkennke at openjdk.org
Wed Mar 8 18:57:15 UTC 2023
> 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)
Roman Kennke has updated the pull request incrementally with one additional commit since the last revision:
Alias tmp registers, also fix RISCV (hopefully)
-------------
Changes:
- all: https://git.openjdk.org/lilliput/pull/76/files
- new: https://git.openjdk.org/lilliput/pull/76/files/5ae12e37..98bcd82e
Webrevs:
- full: https://webrevs.openjdk.org/?repo=lilliput&pr=76&range=01
- incr: https://webrevs.openjdk.org/?repo=lilliput&pr=76&range=00-01
Stats: 11 lines in 3 files changed: 4 ins; 0 del; 7 mod
Patch: https://git.openjdk.org/lilliput/pull/76.diff
Fetch: git fetch https://git.openjdk.org/lilliput pull/76/head:pull/76
PR: https://git.openjdk.org/lilliput/pull/76
More information about the lilliput-dev
mailing list