[Bug rtl-optimization/49710] [4.7 Regression] segfault

hubicka at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Dec 28 19:52:00 GMT 2011


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

--- Comment #5 from Jan Hubicka <hubicka at gcc dot gnu.org> 2011-12-28 19:37:38 UTC ---
OK, loop hiearchy looks as follows:

loop_0 (header = 0, latch = 1, niter = )
{
  bb_2 (preds = {bb_0 }, succs = {bb_3 })
  bb_6 (preds = {bb_5 }, succs = {bb_13 })
  bb_12 (preds = {bb_4 }, succs = {bb_1 })
  loop_4 (header = 13, latch = 14, niter = )
  {
    bb_13 (preds = {bb_6 bb_14 }, succs = {bb_14 })
    bb_14 (preds = {bb_13 }, succs = {bb_13 })
  }
  loop_1 (header = 3, latch = 9, niter = )
  {
    bb_3 (preds = {bb_2 bb_9 }, succs = {bb_4 })
    bb_9 (preds = {bb_8 }, succs = {bb_3 })
    loop_2 (header = 4, latch = 11, niter = )
    {
      bb_4 (preds = {bb_3 bb_11 }, succs = {bb_12 bb_5 })
      bb_5 (preds = {bb_4 }, succs = {bb_6 bb_7 })
      bb_7 (preds = {bb_5 }, succs = {bb_10 })
      bb_11 (preds = {bb_10 }, succs = {bb_4 })
      loop_3 (header = 10, latch = 15, niter = )
      {
        bb_8 (preds = {bb_10 }, succs = {bb_9 bb_15 })
        bb_15 (preds = {bb_8 }, succs = {bb_10 })
        bb_10 (preds = {bb_7 bb_15 }, succs = {bb_8 bb_11 })
      }
    }
  }
}

We remove path from 10 to 8, that is closing the loop of loop_3.
Basic blocks removed are 8 9 and 15.

Finally we fail on BB 3 that is believed to be in loop 1, but header is null at
this point because of code in delete_basic_block:

504      /* If we remove the header or the latch of a loop, mark the loop for
405         removal by setting its header and latch to NULL.  */
506           if (loop->latch == bb
507               || loop->header == bb)
508             {
509               loop->header = NULL;
510               loop->latch = NULL;
511             }

OK, so it seems that fix_bb_placements is not ready to see loops marked for
removal. I guess the catch is that loop peeling renders bb 3 unreachable.
I however do not understand how loop peeling can make this happen, perhaps
folding of the header condition is done?

Honza



More information about the Gcc-bugs mailing list