re PR tree-optimization/80928 (SLP vectorization does not handle induction in outer...
authorRichard Biener <rguenther@suse.de>
Mon, 26 Jun 2017 07:19:37 +0000 (07:19 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 26 Jun 2017 07:19:37 +0000 (07:19 +0000)
2017-06-26  Richard Biener  <rguenther@suse.de>

        PR tree-optimization/80928
* cfghooks.c (duplicate_block): Do not copy BB_DUPLICATED flag.
(copy_bbs): Set BB_DUPLICATED flag early.
(execute_on_growing_pred): Do not execute for BB_DUPLICATED
marked blocks.
(execute_on_shrinking_pred): Likewise.
* tree-ssa.c (ssa_redirect_edge): Do not look for PHI args in
BB_DUPLICATED blocks.
* tree-ssa-phionlycoprop.c (eliminate_degenerate_phis_1): Properly
iterate over all PHIs considering removal of *gsi.

From-SVN: r249638

gcc/ChangeLog
gcc/cfghooks.c
gcc/tree-ssa-phionlycprop.c
gcc/tree-ssa.c

index 0e94ee68a396b1db316f04974c1dafc2f0fdb568..eb945484a55dcbaf471d6ab149dd081921e96a62 100644 (file)
@@ -1,3 +1,16 @@
+2017-06-26  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/80928
+       * cfghooks.c (duplicate_block): Do not copy BB_DUPLICATED flag.
+       (copy_bbs): Set BB_DUPLICATED flag early.
+       (execute_on_growing_pred): Do not execute for BB_DUPLICATED
+       marked blocks.
+       (execute_on_shrinking_pred): Likewise.
+       * tree-ssa.c (ssa_redirect_edge): Do not look for PHI args in
+       BB_DUPLICATED blocks.
+       * tree-ssa-phionlycoprop.c (eliminate_degenerate_phis_1): Properly
+       iterate over all PHIs considering removal of *gsi.
+
 2017-06-23  Jim Wilson  <jim.wilson@linaro.org>
 
        * doc/invoke.texi (AArch64 Options, -mtune): Re-add falkor and
index 1b3f2695b3905780c623bc60963dd394d7c9a91f..bcda422d89a2120ab129e5d1af94dd8c10f5f143 100644 (file)
@@ -1087,7 +1087,7 @@ duplicate_block (basic_block bb, edge e, basic_block after)
   if (after)
     move_block_after (new_bb, after);
 
-  new_bb->flags = bb->flags;
+  new_bb->flags = (bb->flags & ~BB_DUPLICATED);
   FOR_EACH_EDGE (s, ei, bb->succs)
     {
       /* Since we are creating edges from a new block to successors
@@ -1207,7 +1207,8 @@ flow_call_edges_add (sbitmap blocks)
 void
 execute_on_growing_pred (edge e)
 {
-  if (cfg_hooks->execute_on_growing_pred)
+  if (! (e->dest->flags & BB_DUPLICATED)
+      && cfg_hooks->execute_on_growing_pred)
     cfg_hooks->execute_on_growing_pred (e);
 }
 
@@ -1217,7 +1218,8 @@ execute_on_growing_pred (edge e)
 void
 execute_on_shrinking_pred (edge e)
 {
-  if (cfg_hooks->execute_on_shrinking_pred)
+  if (! (e->dest->flags & BB_DUPLICATED)
+      && cfg_hooks->execute_on_shrinking_pred)
     cfg_hooks->execute_on_shrinking_pred (e);
 }
 
@@ -1353,6 +1355,12 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
   basic_block bb, new_bb, dom_bb;
   edge e;
 
+  /* Mark the blocks to be copied.  This is used by edge creation hooks
+     to decide whether to reallocate PHI nodes capacity to avoid reallocating
+     PHIs in the set of source BBs.  */
+  for (i = 0; i < n; i++)
+    bbs[i]->flags |= BB_DUPLICATED;
+
   /* Duplicate bbs, update dominators, assign bbs to loops.  */
   for (i = 0; i < n; i++)
     {
@@ -1360,7 +1368,6 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
       bb = bbs[i];
       new_bb = new_bbs[i] = duplicate_block (bb, NULL, after);
       after = new_bb;
-      bb->flags |= BB_DUPLICATED;
       if (bb->loop_father)
        {
          /* Possibly set loop header.  */
index aa0f50256cd78002c20b33a683cad10c65621da9..9fa427ff2f71e906df048fa4642da431f408cce2 100644 (file)
@@ -420,10 +420,11 @@ eliminate_degenerate_phis_1 (basic_block bb, bitmap interesting_names,
   basic_block son;
   bool cfg_altered = false;
 
-  for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+  for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi);)
     {
       gphi *phi = gsi.phi ();
-
+      /* We might end up removing PHI so advance the iterator now.  */
+      gsi_next (&gsi);
       cfg_altered |= eliminate_const_or_copy (phi, interesting_names,
                                              need_eh_cleanup);
     }
index 45b9951bf256b3012d36fa9c51590358ba83ebb9..fa8f81e9a1a14fda0d76bd1cc39b81d242e1a311 100644 (file)
@@ -142,21 +142,24 @@ ssa_redirect_edge (edge e, basic_block dest)
 
   redirect_edge_var_map_clear (e);
 
-  /* Remove the appropriate PHI arguments in E's destination block.  */
-  for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
-    {
-      tree def;
-      source_location locus ;
-
-      phi = gsi.phi ();
-      def = gimple_phi_arg_def (phi, e->dest_idx);
-      locus = gimple_phi_arg_location (phi, e->dest_idx);
-
-      if (def == NULL_TREE)
-       continue;
-
-      redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
-    }
+  /* Remove the appropriate PHI arguments in E's destination block.
+     If we are redirecting a copied edge the destination has not
+     got PHI argument space reserved nor an interesting argument.  */
+  if (! (e->dest->flags & BB_DUPLICATED))
+    for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
+      {
+       tree def;
+       source_location locus ;
+
+       phi = gsi.phi ();
+       def = gimple_phi_arg_def (phi, e->dest_idx);
+       locus = gimple_phi_arg_location (phi, e->dest_idx);
+
+       if (def == NULL_TREE)
+         continue;
+
+       redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
+      }
 
   e = redirect_edge_succ_nodup (e, dest);