http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53695
--- Comment #8 from Steven Bosscher <steven at gcc dot gnu.org> 2012-08-22 20:20:22 UTC --- FWIW, GCC handles loops with one header and multiple latches just fine: void do_something_1 (void); void do_something_2 (void); int some_cond (void); void foo (void) { while (1) { switch (some_cond ()) { case 1: do_something_1 (); continue; case 2: do_something_2 (); continue; default: return; } } } ;; 2 loops found ;; ;; Loop 0 ;; header 0, latch 1 ;; depth 0, outer -1 ;; nodes: 0 1 2 3 4 5 6 7 ;; ;; Loop 1 ;; header 4, latch 3 ;; depth 1, outer 0 ;; nodes: 4 3 6 5 ;; 2 succs { 4 } ;; 3 succs { 4 } ;; 4 succs { 7 5 6 } ;; 5 succs { 3 } ;; 6 succs { 3 } ;; 7 succs { 1 } foo () { int _4; <bb 2>: goto <bb 4>; <bb 3>: <bb 4>: _4 = some_cond (); switch (_4) <default: <L6>, case 1: <L1>, case 2: <L2>> <L1>: do_something_1 (); goto <bb 3>; <L2>: do_something_2 (); goto <bb 3>; <L6>: return; } Note the single latch.