http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48133

--- Comment #7 from Uros Bizjak <ubizjak at gmail dot com> 2012-02-27 20:50:46 
UTC ---
I have done a bit of debugging here.

The problem starts in peel_loop_completely, loop-unroll.c. Before remove_path
(ein), we have:

loop_0 (header = 0, latch = 1, niter = )
{
  bb_2 (preds = {bb_0 }, succs = {bb_3 })
  bb_9 (preds = {bb_8 }, succs = {bb_1 })
  loop_1 (header = 3, latch = 10, niter = )
  {
    bb_3 (preds = {bb_2 bb_10 }, succs = {bb_4 })
    bb_10 (preds = {bb_5 }, succs = {bb_3 })
    loop_2 (header = 4, latch = 11, niter = )
    {
      bb_4 (preds = {bb_11 bb_3 }, succs = {bb_7 bb_5 })
      bb_5 (preds = {bb_4 }, succs = {bb_6 bb_10 })
      bb_6 (preds = {bb_7 bb_5 }, succs = {bb_7 })
      bb_7 (preds = {bb_4 bb_6 }, succs = {bb_6 bb_8 })
      bb_8 (preds = {bb_7 }, succs = {bb_11 bb_9 })
      bb_11 (preds = {bb_8 }, succs = {bb_4 })
    }
  }
}

We cancel loop2 completely and path ( 8 -> 11), and we get:

loop_0 (header = 0, latch = 1, niter = )
{
  bb_2 (preds = {bb_0 }, succs = {bb_3 })
  bb_8 (preds = {bb_7 }, succs = {bb_9 })
  bb_9 (preds = {bb_8 }, succs = {bb_1 })
  loop_1 (header = 3, latch = 10, niter = )
  {
    bb_3 (preds = {bb_2 bb_10 }, succs = {bb_4 })
    bb_4 (preds = {bb_3 }, succs = {bb_7 bb_5 })
    bb_5 (preds = {bb_4 }, succs = {bb_6 bb_10 })
    bb_10 (preds = {bb_5 }, succs = {bb_3 })
    bb_6 (preds = {bb_7 bb_5 }, succs = {bb_7 })
    bb_7 (preds = {bb_4 bb_6 }, succs = {bb_6 bb_8 })
  }
}

Analysing loop_1 through get_loop_body -> get_loop_body_with_size ->
dfs_enumerate_from (..., 1 /* reverse */, ...), we visit only BBs 3, 10, 5 and
4, leaving out BBs 6 and 7.

This crashes compilation later in get_loop_body:

  gcc_assert (tv == loop->num_nodes);

since tv == 4 and loop->num_nodes == 6.

Reply via email to