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.

Reply via email to