tree-predcom.c (struct chain): New field init_seq.
authorBin Cheng <bin.cheng@arm.com>
Fri, 28 Jul 2017 14:55:49 +0000 (14:55 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Fri, 28 Jul 2017 14:55:49 +0000 (14:55 +0000)
* tree-predcom.c (struct chain): New field init_seq.
(release_chain): Release init_seq.
(prepare_initializers_chain): Record intialization stmts in above
field.
(insert_init_seqs): New function.
(tree_predictive_commoning_loop): Call insert_init_seqs.

From-SVN: r250666

gcc/ChangeLog
gcc/tree-predcom.c

index 0419984fdf53ad6bb7f437f12833c95207312a56..536340272795232429f04b664f26d4f274a61f58 100644 (file)
@@ -1,3 +1,12 @@
+2017-07-28  Bin Cheng  <bin.cheng@arm.com>
+
+       * tree-predcom.c (struct chain): New field init_seq.
+       (release_chain): Release init_seq.
+       (prepare_initializers_chain): Record intialization stmts in above
+       field.
+       (insert_init_seqs): New function.
+       (tree_predictive_commoning_loop): Call insert_init_seqs.
+
 2017-07-28  Bin Cheng  <bin.cheng@arm.com>
 
        * tree-predcom.c (determine_roots_comp): Skip trivial components.
index 536fe3494367039da73e9609948a6ea9c00fc5d6..089d3c674a4197a4540879f04e489277c27560f0 100644 (file)
@@ -294,6 +294,9 @@ typedef struct chain
   /* Initializers for the variables.  */
   vec<tree> inits;
 
+  /* gimple stmts intializing the initial variables of the chain.  */
+  gimple_seq init_seq;
+
   /* True if there is a use of a variable with the maximal distance
      that comes after the root in the loop.  */
   unsigned has_max_use_after : 1;
@@ -511,6 +514,8 @@ release_chain (chain_p chain)
   chain->refs.release ();
   chain->vars.release ();
   chain->inits.release ();
+  if (chain->init_seq)
+    gimple_seq_discard (chain->init_seq);
 
   free (chain);
 }
@@ -2457,7 +2462,7 @@ prepare_initializers_chain (struct loop *loop, chain_p chain)
        }
 
       if (stmts)
-       gsi_insert_seq_on_edge_immediate (entry, stmts);
+       gimple_seq_add_seq_without_update (&chain->init_seq, stmts);
 
       chain->inits[i] = init;
     }
@@ -2487,6 +2492,22 @@ prepare_initializers (struct loop *loop, vec<chain_p> chains)
     }
 }
 
+/* Insert all initializing gimple stmts into loop's entry edge.  */
+
+static void
+insert_init_seqs (struct loop *loop, vec<chain_p> chains)
+{
+  unsigned i;
+  edge entry = loop_preheader_edge (loop);
+
+  for (i = 0; i < chains.length (); ++i)
+    if (chains[i]->init_seq)
+      {
+       gsi_insert_seq_on_edge_immediate (entry, chains[i]->init_seq);
+       chains[i]->init_seq = NULL;
+      }
+}
+
 /* Performs predictive commoning for LOOP.  Returns true if LOOP was
    unrolled.  */
 
@@ -2568,6 +2589,8 @@ tree_predictive_commoning_loop (struct loop *loop)
   /* Try to combine the chains that are always worked with together.  */
   try_combine_chains (&chains);
 
+  insert_init_seqs (loop, chains);
+
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
       fprintf (dump_file, "Before commoning:\n\n");