For

extern void baz ();
extern void boo ();
extern void bla ();
int a[100];
void foo (int n)
{
  for (int j = 0; j < n; ++j)
    {
      if (a[j+5])
        {
          if (a[j])
            break;
          baz ();
        }
      else
        bla ();
      boo ();
    }
}

we happen to visit BBs in an unfortunate order so that we do not
have all predecessors visited when visiting the BB of boo().  This
is because domwalk uses a postorder on the inverted graph to
order dominator children -- that doesn't play well with loops
(as we've figured elsewhere before).  The following makes us use
RPO order instead.

This should help EVRP and DOM.

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2016-10-18  Richard Biener  <rguent...@suse.de>

        * domwalk.c (dom_walker::walk): Use RPO order.

Index: gcc/domwalk.c
===================================================================
--- gcc/domwalk.c       (revision 241300)
+++ gcc/domwalk.c       (working copy)
@@ -243,7 +243,7 @@ dom_walker::walk (basic_block bb)
   if (m_dom_direction == CDI_DOMINATORS)
     {
       postorder = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
-      postorder_num = inverted_post_order_compute (postorder);
+      postorder_num = pre_and_rev_post_order_compute (NULL, postorder, true);
       bb_postorder = XNEWVEC (int, last_basic_block_for_fn (cfun));
       for (int i = 0; i < postorder_num; ++i)
        bb_postorder[postorder[i]] = i;

Reply via email to