The following fixes two latent bugs I ran into when fixing PR72772.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2016-08-04  Richard Biener  <rguent...@suse.de>

        * tree-cfgcleanup.c (tree_forwarder_block_p): Use bb_loop_header_p.
        * cfghooks.c (force_nonfallthru): If we ended up splitting a latch
        adjust loop info accordingly.

Index: gcc/tree-cfgcleanup.c
===================================================================
--- gcc/tree-cfgcleanup.c       (revision 239120)
+++ gcc/tree-cfgcleanup.c       (working copy)
@@ -344,7 +344,7 @@ tree_forwarder_block_p (basic_block bb,
     {
       basic_block dest;
       /* Protect loop headers.  */
-      if (bb->loop_father->header == bb)
+      if (bb_loop_header_p (bb))
        return false;
 
       dest = EDGE_SUCC (bb, 0)->dest;
Index: gcc/cfghooks.c
===================================================================
--- gcc/cfghooks.c      (revision 239120)
+++ gcc/cfghooks.c      (working copy)
@@ -1030,11 +1030,17 @@ force_nonfallthru (edge e)
 
       if (current_loops != NULL)
        {
+         basic_block pred = single_pred (ret);
+         basic_block succ = single_succ (ret);
          struct loop *loop
-           = find_common_loop (single_pred (ret)->loop_father,
-                               single_succ (ret)->loop_father);
+           = find_common_loop (pred->loop_father, succ->loop_father);
          rescan_loop_exit (e, false, true);
          add_bb_to_loop (ret, loop);
+
+         /* If we split the latch edge of loop adjust the latch block.  */
+         if (loop->latch == pred
+             && loop->header == succ)
+           loop->latch = ret;
        }
     }
 

Reply via email to