RFR: 8373495: C2: Aggressively fold loads from objects that have not escaped [v5]
Quan Anh Mai
qamai at openjdk.org
Fri Dec 12 03:59:50 UTC 2025
On Fri, 12 Dec 2025 02:30:22 GMT, Quan Anh Mai <qamai at openjdk.org> wrote:
>> Hi,
>>
>> The current escape analysis mechanism is all-or-nothing: either the object does not escape, or it does. If the object escapes, we lose the ability to analyse the values of its fields completely, even if the object only escapes at return.
>>
>> This PR tries to find the escape status of an object at a load, and if it is decided that the object has not escaped there, we can try folding the load aggressively, ignoring calls and memory barriers to find a corresponding store that the load observes.
>>
>> For the runtime cost, this phase runs very fast, around 5 - 7% the runtime of EA, and about 0.5% the total runtime of C2.
>>
>> Please take a look and leave your thoughts, thanks a lot.
>
> Quan Anh Mai has updated the pull request incrementally with one additional commit since the last revision:
>
> more detailed explanations
The sufficient condition to decide that a freshly allocated object does not escape in a region bounded by the allocation and a call is that there is no action in that region that makes the object escape. This means that there is no node that escapes the object which has the call as a transitive use.
As a result, my solution here is to find all nodes that escape the object, then mark all of its transitive uses as escape. I believe you want to do it in the opposite way, that is, to try to find the nodes that escape the freshly allocated object from a call. But that means that we need to traverse all the transitive inputs of the call, which seems unrealistic for something running in `IterGVN`. Am I understanding it correctly?
-------------
PR Comment: https://git.openjdk.org/jdk/pull/28764#issuecomment-3644799880
More information about the hotspot-compiler-dev
mailing list