RFR: 8351889: C2 crash: assertion failed: Base pointers must match (addp 344) [v7]
Roland Westrelin
roland at openjdk.org
Thu Dec 11 16:10:58 UTC 2025
> The test case has an out of loop `Store` with an `AddP` address
> expression that has other uses and is in the loop body. Schematically,
> only showing the address subgraph and the bases for the `AddP`s:
>
>
> Store#195 -> AddP#133 -> AddP#134 -> CastPP#110
> -> CastPP#110
>
>
> Both `AddP`s have the same base, a `CastPP` that's also in the loop
> body.
>
> That loop is a counted loop and only has 3 iterations so is fully
> unrolled. First, one iteration is peeled:
>
>
> /-> CastPP#110
> Store#195 -> Phi#360 -> AddP#133 -> AddP#134 -> CastPP#110
> -> AddP#277 -> AddP#278 -> CastPP#283
> -> CastPP#283
>
>
>
> The `AddP`s and `CastPP` are cloned (because in the loop body). As
> part of peeling, `PhaseIdealLoop::peeled_dom_test_elim()` is
> called. It finds the test that guards `CastPP#283` in the peeled
> iteration dominates and replaces the test that guards `CastPP#110`
> (the test in the peeled iteration is the clone of the test in the
> loop). That causes `CastPP#110`'s control to be updated to that of the
> test in the peeled iteration and to be yanked from the loop. So now
> `CastPP#283` and `CastPP#110` have the same inputs.
>
> Next unrolling happens:
>
>
> /-> CastPP#110
> /-> AddP#400 -> AddP#401 -> CastPP#110
> Store#195 -> Phi#360 -> Phi#477 -> AddP#133 -> AddP#134 -> CastPP#110
> \ -> CastPP#110
> -> AddP#277 -> AddP#278 -> CastPP#283
> -> CastPP#283
>
>
>
> `AddP`s are cloned once more but not the `CastPP`s because they are
> both in the peeled iteration now. A new `Phi` is added.
>
> Next igvn runs. It's going to push the `AddP`s through the `Phi`s.
>
> Through `Phi#477`:
>
>
>
> /-> CastPP#110
> Store#195 -> Phi#360 -> AddP#510 -> Phi#509 -> AddP#401 -> CastPP#110
> \ -> AddP#134 -> CastPP#110
> -> AddP#277 -> AddP#278 -> CastPP#283
> -> CastPP#283
>
>
>
> Through `Phi#360`:
>
>
> /-> AddP#134 -> CastPP#110
> /-> Phi#509 -> AddP#401 -> CastPP#110
> Store#195 -> AddP#516 -> Phi#515 -> AddP#278 -> CastPP#283
> -> Phi#514 -> CastPP#283
> -> CastP#110
>
>
> Then `Phi#514` which has 2 `CastPP`s as input with identical inputs is
> transformed into anot...
Roland Westrelin has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 19 additional commits since the last revision:
- review
- Merge branch 'master' into JDK-8351889
- Update src/hotspot/share/opto/phaseX.hpp
Co-authored-by: Roberto Castañeda Lozano <robcasloz at users.noreply.github.com>
- Update src/hotspot/share/opto/phaseX.cpp
Co-authored-by: Roberto Castañeda Lozano <robcasloz at users.noreply.github.com>
- review
- more
- review
- Merge branch 'master' into JDK-8351889
- exp
- Merge branch 'master' into JDK-8351889
- ... and 9 more: https://git.openjdk.org/jdk/compare/830e7075...100fad3d
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/25386/files
- new: https://git.openjdk.org/jdk/pull/25386/files/d2174c88..100fad3d
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=25386&range=06
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=25386&range=05-06
Stats: 45025 lines in 629 files changed: 27805 ins; 14178 del; 3042 mod
Patch: https://git.openjdk.org/jdk/pull/25386.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/25386/head:pull/25386
PR: https://git.openjdk.org/jdk/pull/25386
More information about the hotspot-dev
mailing list