RFR: 8261308: C2: assert(inner->is_valid_counted_loop(T_INT) && inner->is_strip_mined()) failed: OuterStripMinedLoop should have been removed

Vladimir Kozlov kvn at openjdk.java.net
Thu Feb 25 18:11:53 UTC 2021


On Thu, 11 Feb 2021 16:11:50 GMT, Roland Westrelin <roland at openjdk.org> wrote:

> The inner counted loop of the test case starts at 1 and stops at 1 so
> runs for one iteration. A counted loop is created for it. The iv Phi
> is found to be the constant 1 and its type is set by:
> 
> l->phi()->as_Phi()->set_type(l->phi()->Value(&_igvn));
> 
> in PhaseIdealLoop::is_counted_loop() but it's not replaced by the
> constant 1 yet so the counted loop's shape is preserved.
> 
> IdealLoopTree::do_one_iteration_loop() runs but doesn't optimize the
> loop because the trip count is not set to 1. The loop contains a range
> check and range check elimination is applied. That causes the loop
> exit test to be adjusted with a MinI(..) expression. When IGVN runs
> next, the phi is replaced with 1 but because the exit test was
> changed, IGVN can't prove it always fails. So the loop is not removed
> which causes the assert failure as loop opts progress.
> 
> The fix I propose is for IdealLoopTree::do_one_iteration_loop() to
> remove the 1 iteration loop. The reason it doesn't happen is that
> IdealLoopTree::compute_trip_count() doesn't set the trip count because
> it finds a zero trip count: limit - init = 1 - 1 = 0. All loops, once
> entered execute at least once. So I think, it's safe to set the trip
> count to 1 in those cases.

Good.

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

Marked as reviewed by kvn (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/2529


More information about the hotspot-compiler-dev mailing list