http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55329
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED AssignedTo|unassigned at gcc dot |jakub at gcc dot gnu.org |gnu.org | --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-11-15 16:31:10 UTC --- Created attachment 28701 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28701 gcc48-pr55329.patch Untested fix. The problem is that clearing bits in a bitmap while it is being iterated using EXECUTE_IF_SET_IN_BITMAP is dangerous and can't work reliably, in this case the bitmap contained just a single bit, that got cleared and replaced by a smaller bit (the clearing removed the only bitmap_element, setting reused it with different index (smaller) with higher bits set in it). In gimple_purge_all_dead_eh_edges it is just a few extra instructions to process the forwarder blocks (it quickly finds out that they don't have any EDGE_EH edges and does nothing for them), so IMHO it doesn't matter much if we don't clear those bits. On the other side, if there could be multiple forwarder blocks, we might risk we don't handle them correctly, as they could have bb's with lower indexes as successors.