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

Richard Guenther <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|                            |2012-09-10
         AssignedTo|unassigned at gcc dot       |rguenth at gcc dot gnu.org
                   |gnu.org                     |
     Ever Confirmed|0                           |1

--- Comment #3 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-09-10 
10:51:23 UTC ---
The (latent) bug is that when threading over a subloop

      /* Remove the new pre-header blocks from our loop.  */
      bblocks = XCNEWVEC (basic_block, loop->num_nodes);
      nblocks = dfs_enumerate_from (header, 0, def_split_header_continue_p,
                                    bblocks, loop->num_nodes, tgt_bb);
      for (i = 0; i < nblocks; i++)
        {
          remove_bb_from_loops (bblocks[i]);
          add_bb_to_loop (bblocks[i], loop_outer (loop));
        }
      free (bblocks);

does not remove properly all blocks from the loop.

  oldheader
    | \
    |  subloop
    |   |
    |   exit block
    |   /
   new header
     |
     ...

because the DFS walk stops at 'subloop'...

Reply via email to