tree-if-conv.c (add_bb_predicate_gimplified_stmts): Use gimple_seq_add_seq_without_up...
authorRichard Biener <rguenther@suse.de>
Fri, 20 May 2016 09:01:23 +0000 (09:01 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 20 May 2016 09:01:23 +0000 (09:01 +0000)
2016-05-20  Richard Biener  <rguenther@suse.de>

* tree-if-conv.c (add_bb_predicate_gimplified_stmts): Use
gimple_seq_add_seq_without_update.
(release_bb_predicate): Assert we have no operands to free.
(if_convertible_loop_p_1): Calculate post dominators later.
Do not free BB predicates here.
(combine_blocks): Do not recompute BB predicates.
(version_loop_for_if_conversion): Save BB predicates around
loop versioning.

* gcc.dg/tree-ssa/ifc-cd.c: Adjust.

From-SVN: r236498

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ifc-cd.c
gcc/tree-if-conv.c

index fed248d32e81c40ea61ad6d0ed553069e51d4da1..8471e8a01f4522bee35f4dae8ddbe190a536f67b 100644 (file)
@@ -1,3 +1,14 @@
+2016-05-20  Richard Biener  <rguenther@suse.de>
+
+       * tree-if-conv.c (add_bb_predicate_gimplified_stmts): Use
+       gimple_seq_add_seq_without_update.
+       (release_bb_predicate): Assert we have no operands to free.
+       (if_convertible_loop_p_1): Calculate post dominators later.
+       Do not free BB predicates here.
+       (combine_blocks): Do not recompute BB predicates.
+       (version_loop_for_if_conversion): Save BB predicates around
+       loop versioning.
+
 2016-05-19  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * function.c (make_epilogue_seq): Remove epilogue_end parameter.
index 41668728f078deb22442d6fd81ac7b72d13eb68a..0c2f4bc2dfead7da6434f7d515d797bf4fd38cd3 100644 (file)
@@ -1,3 +1,7 @@
+2016-05-20  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/ifc-cd.c: Adjust.
+
 2016-05-19  Marek Polacek  <polacek@redhat.com>
 
        PR c++/71075
index f800f72cf697a3fce3ea2954185ccf619c76d27f..29e2559e42be49b42cc20a4e7086127f7031d503 100644 (file)
@@ -25,4 +25,4 @@ void foo (int *x1, int *x2, int *x3, int *x4, int *y)
     }
 }
 
-/* { dg-final { scan-tree-dump-times "Use predicate of bb" 8 "ifcvt" } } */
+/* { dg-final { scan-tree-dump-times "Use predicate of bb" 4 "ifcvt" } } */
index 8dc9a430f90c477db8e7aaed6cd5209b2796c57d..3bfa69cfb5093baac3602d1db31ffabb6d2aa34a 100644 (file)
@@ -257,7 +257,7 @@ set_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts)
 static inline void
 add_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts)
 {
-  gimple_seq_add_seq
+  gimple_seq_add_seq_without_update
     (&(((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts), stmts);
 }
 
@@ -280,10 +280,11 @@ release_bb_predicate (basic_block bb)
   gimple_seq stmts = bb_predicate_gimplified_stmts (bb);
   if (stmts)
     {
-      gimple_stmt_iterator i;
+      if (flag_checking)
+       for (gimple_stmt_iterator i = gsi_start (stmts);
+            !gsi_end_p (i); gsi_next (&i))
+         gcc_assert (! gimple_use_ops (gsi_stmt (i)));
 
-      for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
-       free_stmt_operands (cfun, gsi_stmt (i));
       set_bb_predicate_gimplified_stmts (bb, NULL);
     }
 }
@@ -1322,7 +1323,6 @@ if_convertible_loop_p_1 (struct loop *loop, vec<data_reference_p> *refs)
     return false;
 
   calculate_dominance_info (CDI_DOMINATORS);
-  calculate_dominance_info (CDI_POST_DOMINATORS);
 
   /* Allow statements that can be handled during if-conversion.  */
   ifc_bbs = get_loop_body_in_if_conv_order (loop);
@@ -1370,6 +1370,7 @@ if_convertible_loop_p_1 (struct loop *loop, vec<data_reference_p> *refs)
          = new hash_map<innermost_loop_behavior_hash, data_reference_p>;
   baseref_DR_map = new hash_map<tree_operand_hash, data_reference_p>;
 
+  calculate_dominance_info (CDI_POST_DOMINATORS);
   predicate_bbs (loop);
 
   for (i = 0; refs->iterate (i, &dr); i++)
@@ -1421,9 +1422,6 @@ if_convertible_loop_p_1 (struct loop *loop, vec<data_reference_p> *refs)
            return false;
     }
 
-  for (i = 0; i < loop->num_nodes; i++)
-    free_bb_predicate (ifc_bbs[i]);
-
   /* Checking PHIs needs to be done after stmts, as the fact whether there
      are any masked loads or stores affects the tests.  */
   for (i = 0; i < loop->num_nodes; i++)
@@ -2298,7 +2296,6 @@ combine_blocks (struct loop *loop)
   edge e;
   edge_iterator ei;
 
-  predicate_bbs (loop);
   remove_conditions_and_labels (loop);
   insert_gimplified_predicates (loop);
   predicate_all_scalar_phis (loop);
@@ -2428,13 +2425,23 @@ version_loop_for_if_conversion (struct loop *loop)
                                  integer_zero_node);
   gimple_call_set_lhs (g, cond);
 
+  /* Save BB->aux around loop_version as that uses the same field.  */
+  void **saved_preds = XALLOCAVEC (void *, loop->num_nodes);
+  for (unsigned i = 0; i < loop->num_nodes; i++)
+    saved_preds[i] = ifc_bbs[i]->aux;
+
   initialize_original_copy_tables ();
   new_loop = loop_version (loop, cond, &cond_bb,
                           REG_BR_PROB_BASE, REG_BR_PROB_BASE,
                           REG_BR_PROB_BASE, true);
   free_original_copy_tables ();
+
+  for (unsigned i = 0; i < loop->num_nodes; i++)
+    ifc_bbs[i]->aux = saved_preds[i];
+
   if (new_loop == NULL)
     return false;
+
   new_loop->dont_vectorize = true;
   new_loop->force_vectorize = false;
   gsi = gsi_last_bb (cond_bb);