http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53460
--- Comment #7 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-05-24 10:50:42 UTC --- We have an unreachable block: # BLOCK 4 # PRED: <L0>: operator delete (D.2260_4); # SUCC: 5 [100.0%] (fallthru) after profiling. Somehow we transform void offsetToMiddleOfGlyph(const SimpleFontData*) (const struct SimpleFontData * fontData) { void * D.2260; # BLOCK 2 freq:10000 # PRED: ENTRY [100.0%] (fallthru,exec) D.2260_4 = operator new (1); GlyphMetricsMap<int>::GlyphMetricsMap (D.2260_4); goto <bb 4>; # SUCC: 4 [100.0%] (fallthru,exec) 3 (eh,exec) # BLOCK 3 # PRED: 2 (eh,exec) <L0>: operator delete (D.2260_4); resx 1 # SUCC: to void offsetToMiddleOfGlyph(const SimpleFontData*) (const struct SimpleFontData * fontData) { void * __gcov_indirect_call_callee.8; long int * __gcov_indirect_call_counters.7; long int PROF_edge_counter.6; void * D.2260; # BLOCK 2 freq:10000 # PRED: ENTRY [100.0%] (fallthru,exec) __gcov_indirect_call_counters.7_15 = __gcov_indirect_call_counters; __gcov_indirect_call_callee.8_16 = __gcov_indirect_call_callee; __gcov_indirect_call_profiler (__gcov_indirect_call_counters.7_15, 2, offsetToMiddleOfGlyph, __gcov_indirect_call_callee.8_16); __gcov_indirect_call_callee = 0B; PROF_edge_counter.6_6 = __gcov0._Z21offsetToMiddleOfGlyphPK14SimpleFontData[0]; PROF_edge_counter.6_8 = PROF_edge_counter.6_6 + 1; __gcov0._Z21offsetToMiddleOfGlyphPK14SimpleFontData[0] = PROF_edge_counter.6_8; D.2260_4 = operator new (1); # SUCC: 3 [100.0%] (fallthru) # BLOCK 3 freq:10000 # PRED: 2 [100.0%] (fallthru) PROF_edge_counter.6_9 = __gcov0._Z21offsetToMiddleOfGlyphPK14SimpleFontData[1]; PROF_edge_counter.6_10 = PROF_edge_counter.6_9 + 1; __gcov0._Z21offsetToMiddleOfGlyphPK14SimpleFontData[1] = PROF_edge_counter.6_10; GlyphMetricsMap<int>::GlyphMetricsMap (D.2260_4); goto <bb 6>; # SUCC: 6 [100.0%] (fallthru,exec) # BLOCK 4 # PRED: <L0>: operator delete (D.2260_4); # SUCC: 5 [100.0%] (fallthru) branch_prob () splits the block this way, invalidating EH edges.