https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100492

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ah, no - there's an irreducible region inside the inner loop.  The logic

              /* In distribution of loop nest, if bb is inner loop's exit_bb,
                 we choose its exit edge/path in order to avoid generating
                 infinite loop.  For all other cases, we choose an arbitrary
                 path through the empty CFG part that this unnecessary
                 control stmt controls.  */
              if (gcond *cond_stmt = dyn_cast <gcond *> (stmt))
                {
                  if (inner_exit && inner_exit->flags & EDGE_TRUE_VALUE)
                    gimple_cond_make_true (cond_stmt);
                  else
                    gimple_cond_make_false (cond_stmt);
                  update_stmt (stmt);
                }

only works for conditions exiting the loop (where we asked for a single-exit
earlier) and for conditions not controlling a cycle (where it doesn't matter
which way we go).

There's no sweep over stmts qualifying a loop body, but
find_seed_stmts_for_distribution could be abused that way.  We could also
simply forcefully put this condition in all partitions or we could see
whether to use post-dominance we compute for control dependence can be
used to find the edge towards exit.

Reply via email to