RFR: 8347499: C2: Make `PhaseIdealLoop` eliminate more redundant safepoints in loops [v7]

Emanuel Peter epeter at openjdk.org
Fri Oct 24 15:17:27 UTC 2025


On Fri, 17 Oct 2025 09:32:48 GMT, Qizheng Xing <qxing at openjdk.org> wrote:

>> In `PhaseIdealLoop`, `IdealLoopTree::check_safepts` method checks if any call that is guaranteed to have a safepoint dominates the tail of the loop. In the previous implementation, `check_safepts` would stop if it found a local non-call safepoint. At this time, if there was a call before the safepoint in the dom-path, this safepoint would not be eliminated.
>> 
>> <img width="353" alt="loop-safepoint" src="https://github.com/user-attachments/assets/c220e103-aaba-4e3f-98ac-1ddb6465c309" />
>> 
>> This patch changes the behavior of `check_safepts` to not stop when it finds a non-local safepoint. This makes simple loops with one method call ~3.8% faster (on aarch64).
>> 
>> 
>> Benchmark                Mode  Cnt       Score      Error  Units
>> LoopSafepoint.loopVar    avgt   15  208296.259 ± 1350.409  ns/op   # baseline
>> LoopSafepoint.loopVar    avgt   15  200692.874 ±  616.770  ns/op   # this patch
>> 
>> 
>> Testing: tier1-2 on x86_64 and aarch64.
>
> Qizheng Xing has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - Update microbench
>  - Add IR tests for nested loops

This now looks really good to me, thanks for all the additions!

I think it would be best if @rwestrel also gave this a look.

One question I have, maybe @rwestrel can weight in here too: how does all of this play with `LongCountedLoops`? I suppose they decay to int loops at some point... We don't have to worry about this in this PR, I'm just asking the question because it came to mind :)

I'll run some internal testing now, before approving from my side.

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

PR Review: https://git.openjdk.org/jdk/pull/23057#pullrequestreview-3377437061


More information about the hotspot-compiler-dev mailing list