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.