Currently, to free the memory allocated in a confined arena, we keep track of a 
list of 'cleanup actions', stored in linked list format in a so-called 
`ResourceList`, attached to the scope of the arena. When the scope is closed, 
we loop over all the entries in this resource list, and run all the cleanup 
actions one by one.

However, due to this linked list format, plus the control flow introduced by 
the cleanup loop, C2's escape analysis can not keep track of the nodes of this 
linked list (`ResourceList.ResourceCleanup`), and as a result, they can not be 
scalar replaced.

We can prevent just the first `ResourceCleanup` instance from escaping, by 
pulling out the first element of the list into a separate field. I also tried a 
setup where I had 2 separate fields for the first 2 elements, as well as a 
setup with an array with a fixed set of elements. While these also worked to 
prevent the first node from escaping, they were not able to provide the same 
benefit for multiple resource cleanup instances. Nevertheless, avoiding the 
allocation of the first element is relatively simple, and seems like a 
low-hanging fruit.

I've changed the `AllocTest` benchmark a bit so that we don't return the 
`MemorySegment` in `alloc_confined`, which would make it always escape. That 
way, we can use this existing benchmark to test whether there are any 
allocations when calling `allocate` on a confined arena. This matches what we 
were doing in the other benchmark methods in the same class.

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

Commit messages:
 - polish v2
 - simplify benchmark
 - polish
 - One element cache
 - fix bench

Changes: https://git.openjdk.org/jdk/pull/23321/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=23321&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8348668
  Stats: 46 lines in 3 files changed: 30 ins; 9 del; 7 mod
  Patch: https://git.openjdk.org/jdk/pull/23321.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/23321/head:pull/23321

PR: https://git.openjdk.org/jdk/pull/23321

Reply via email to