RFR: 8357781: Deep recursion in PhaseCFG::set_next_call leads to stack overflow [v2]

Tobias Hartmann thartmann at openjdk.org
Tue May 27 10:06:51 UTC 2025


On Tue, 27 May 2025 09:57:54 GMT, Marc Chevalier <mchevalier at openjdk.org> wrote:

>> test/hotspot/jtreg/compiler/c2/StackOverflowInSetNextCall.java line 30:
>> 
>>> 28:  * @summary Triggered a stack overflow in PhaseCFG::set_next_call due to a legitimately big (mostly deep and not wide) graph.
>>> 29:  *
>>> 30:  * @run main/othervm -Xcomp -XX:LoopUnrollLimit=8192 -XX:CompileCommand=compileonly,StackOverflowInSetNextCall::test StackOverflowInSetNextCall
>> 
>> What happens if we set the `LoopUnrollLimit` to its max value, i.e. `max_jint / 4`?
>
> It doesn't crash because the loops that could be unrolled are already unrolled as much as possible with this example.
> 
> But what if I replace the `100` with `1000`, then it takes longer, but at some point, the node budget is exceeded and it ends well.
> 
> But what if I increase the node budget like crazy (then NodeLimitFudgeFactor is too small, but I can increase that as well). Then it takes 100% CPU for a while until it crashes because it exhausts the memory limit (and in my experiments, we crash even after this, later in code generation).
> 
> I could raise the memory limit, but it will be the same: either eventually it works because I can fit all the nodes and everything in memory (including my worklist), or I'll explode the limit and get terminated eventually. But that seems orthogonal to this problem: if you use options that creates many nodes, the memory might be too limited.

Right, I think that's expected. Thanks for checking!

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

PR Review Comment: https://git.openjdk.org/jdk/pull/25448#discussion_r2108777197


More information about the hotspot-compiler-dev mailing list