RFR: 8336830: C2: assert(get_loop(lca)->_nest < n_loop->_nest || lca->in(0)->is_NeverBranch()) failed: must not be moved into inner loop
Emanuel Peter
epeter at openjdk.org
Thu Jul 25 15:39:32 UTC 2024
On Thu, 25 Jul 2024 15:16:39 GMT, Roland Westrelin <roland at openjdk.org> wrote:
> A store is sunk from a counted loop into an enclosing infinite
> loop. The assert fires because:
>
>
> get_loop(lca)->_nest < n_loop->_nest
>
>
> is false. That happens because the outer loop was found to be infinite
> in the current loop opts pass. When that happens, it's not properly
> attached to the loop tree. The second part of the assert was added to
> cover a similar case:
>
>
> lca->in(0)->is_NeverBranch()
>
>
> but it doesn't work in this case bcause lca is not a projection of the
> `NeverBranch`. It's the exit projection of the counted loop. The fix I
> propose changes that part of the assert to test that lca is, indeed,
> in an infinite loop in a way that's robust.
>
> I also removed some code that I believe to be useless following
> 8335709.
LGTM, thanks for fixing this!
src/hotspot/share/opto/loopopts.cpp line 1275:
> 1273: for (;;) {
> 1274: Node* dom = idom(useblock);
> 1275: if (loop->is_member(get_loop(dom))) {
This would not be backported, right? Do you think we should do it in a separate RFE? Or is it necessary for the fix?
-------------
Marked as reviewed by epeter (Reviewer).
PR Review: https://git.openjdk.org/jdk/pull/20334#pullrequestreview-2199675821
PR Review Comment: https://git.openjdk.org/jdk/pull/20334#discussion_r1691680407
More information about the hotspot-compiler-dev
mailing list