]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Avoid gimple body modifications while streaming.
authorJan Hubicka <hubicka@ucw.cz>
Sat, 26 Oct 2019 16:57:16 +0000 (18:57 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 26 Oct 2019 16:57:16 +0000 (16:57 +0000)
Backport from mainline
2019-10-11  Jan Hubicka  <hubicka@ucw.cz>
* gimple-streamer-out.c (output_gimple_stmt): Add explicit function
parameter.
* lto-streamer-out.c: Include tree-dfa.h.
(output_cfg): Do not use cfun.
(lto_prepare_function_for_streaming): New.
(output_function): Do not push cfun; do not initialize loop optimizer.
* lto-streamer.h (lto_prepare_function_for_streaming): Declare.
* passes.c (ipa_write_summaries): Use it.
(ipa_write_optimization_summaries): Do not modify bodies.
* tree-dfa.c (renumber_gimple_stmt_uids): Add function parameter.
* tree.dfa.h (renumber_gimple_stmt_uids): Update prototype.
* tree-ssa-dse.c (pass_dse::execute): Update use of
renumber_gimple_stmt_uids.
* tree-ssa-math-opts.c (pass_optimize_widening_mul::execute): Likewise.

2019-10-12  Jan Hubicka  <hubicka@ucw.cz>
* lto-streamer-out.c (collect_block_tree_leafs): Renumber statements
so non-virutal are before virutals.
(output_function): Avoid body modifications.

From-SVN: r277473

gcc/ChangeLog
gcc/gimple-streamer-out.c
gcc/lto-streamer-out.c
gcc/lto-streamer.h
gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/passes.c
gcc/tree-dfa.c
gcc/tree-dfa.h
gcc/tree-ssa-dse.c
gcc/tree-ssa-math-opts.c

index cd06ab2b24e69cb2bd5fc490d8a814793bf6fcfd..22157fe4704907a2f53bb713c2532218efadd1cb 100644 (file)
@@ -1,3 +1,27 @@
+2019-10-25  Jan Hubicka  <hubicka@ucw.cz>
+
+       Backport from mainline
+       2019-10-11  Jan Hubicka  <hubicka@ucw.cz>
+       * gimple-streamer-out.c (output_gimple_stmt): Add explicit function
+       parameter.
+       * lto-streamer-out.c: Include tree-dfa.h.
+       (output_cfg): Do not use cfun.
+       (lto_prepare_function_for_streaming): New.
+       (output_function): Do not push cfun; do not initialize loop optimizer.
+       * lto-streamer.h (lto_prepare_function_for_streaming): Declare.
+       * passes.c (ipa_write_summaries): Use it.
+       (ipa_write_optimization_summaries): Do not modify bodies.
+       * tree-dfa.c (renumber_gimple_stmt_uids): Add function parameter.
+       * tree.dfa.h (renumber_gimple_stmt_uids): Update prototype.
+       * tree-ssa-dse.c (pass_dse::execute): Update use of
+       renumber_gimple_stmt_uids.
+       * tree-ssa-math-opts.c (pass_optimize_widening_mul::execute): Likewise.
+
+       2019-10-12  Jan Hubicka  <hubicka@ucw.cz>
+       * lto-streamer-out.c (collect_block_tree_leafs): Renumber statements
+       so non-virutal are before virutals.
+       (output_function): Avoid body modifications.
+
 2019-10-25  Richard Earnshaw  <rearnsha@arm.com>
 
        Backport from mainline
index 34b8d6fda7dadb30820dbe2c7edeece6c0319b31..7185c07f36b2b71d150c2a96f035cd2ba5d37ec2 100644 (file)
@@ -57,7 +57,7 @@ output_phi (struct output_block *ob, gphi *phi)
 /* Emit statement STMT on the main stream of output block OB.  */
 
 static void
-output_gimple_stmt (struct output_block *ob, gimple *stmt)
+output_gimple_stmt (struct output_block *ob, struct function *fn, gimple *stmt)
 {
   unsigned i;
   enum gimple_code code;
@@ -80,7 +80,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt)
                     as_a <gassign *> (stmt)),
                   1);
   bp_pack_value (&bp, gimple_has_volatile_ops (stmt), 1);
-  hist = gimple_histogram_value (cfun, stmt);
+  hist = gimple_histogram_value (fn, stmt);
   bp_pack_value (&bp, hist != NULL, 1);
   bp_pack_var_len_unsigned (&bp, stmt->subcode);
 
@@ -139,7 +139,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt)
             so that we do not have to deal with type mismatches on
             merged symbols during IL read in.  The first operand
             of GIMPLE_DEBUG must be a decl, not MEM_REF, though.  */
-         if (op && (i || !is_gimple_debug (stmt)))
+         if (!flag_wpa && op && (i || !is_gimple_debug (stmt)))
            {
              basep = &op;
              if (TREE_CODE (*basep) == ADDR_EXPR)
@@ -147,7 +147,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt)
              while (handled_component_p (*basep))
                basep = &TREE_OPERAND (*basep, 0);
              if (VAR_P (*basep)
-                 && !auto_var_in_fn_p (*basep, current_function_decl)
+                 && !auto_var_in_fn_p (*basep, fn->decl)
                  && !DECL_REGISTER (*basep))
                {
                  bool volatilep = TREE_THIS_VOLATILE (*basep);
@@ -228,7 +228,7 @@ output_bb (struct output_block *ob, basic_block bb, struct function *fn)
              print_gimple_stmt (streamer_dump_file, stmt, 0, TDF_SLIM);
            }
 
-         output_gimple_stmt (ob, stmt);
+         output_gimple_stmt (ob, fn, stmt);
 
          /* Emit the EH region holding STMT.  */
          region = lookup_stmt_eh_lp_fn (fn, stmt);
index e07085770a5534554c47fcf95efd07c8bcfa57c9..42f382ecf216e151b1dd781c0c3ec3c8e8750e57 100644 (file)
@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "debug.h"
 #include "omp-offload.h"
 #include "print-tree.h"
+#include "tree-dfa.h"
 
 
 static void lto_write_tree (struct output_block*, tree, bool);
@@ -1891,7 +1892,7 @@ output_cfg (struct output_block *ob, struct function *fn)
 
   streamer_write_hwi (ob, -1);
 
-  bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
+  bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
   while (bb->next_bb)
     {
       streamer_write_hwi (ob, bb->next_bb->index);
@@ -1900,9 +1901,6 @@ output_cfg (struct output_block *ob, struct function *fn)
 
   streamer_write_hwi (ob, -1);
 
-  /* ???  The cfgloop interface is tied to cfun.  */
-  gcc_assert (cfun == fn);
-
   /* Output the number of loops.  */
   streamer_write_uhwi (ob, number_of_loops (fn));
 
@@ -2063,6 +2061,62 @@ collect_block_tree_leafs (tree root, vec<tree> &leafs)
       collect_block_tree_leafs (BLOCK_SUBBLOCKS (root), leafs);
 }
 
+/* This performs function body modifications that are needed for streaming
+   to work.  */
+
+void
+lto_prepare_function_for_streaming (struct cgraph_node *node)
+{
+  struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
+  basic_block bb;
+
+  if (number_of_loops (fn))
+    {
+      push_cfun (fn);
+      loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
+      loop_optimizer_finalize ();
+      pop_cfun ();
+    }
+  /* We will renumber the statements.  The code that does this uses
+     the same ordering that we use for serializing them so we can use
+     the same code on the other end and not have to write out the
+     statement numbers.  We do not assign UIDs to PHIs here because
+     virtual PHIs get re-computed on-the-fly which would make numbers
+     inconsistent.  */
+  set_gimple_stmt_max_uid (fn, 0);
+  FOR_ALL_BB_FN (bb, fn)
+    {
+      for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
+          gsi_next (&gsi))
+       {
+         gphi *stmt = gsi.phi ();
+
+         /* Virtual PHIs are not going to be streamed.  */
+         if (!virtual_operand_p (gimple_phi_result (stmt)))
+           gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
+       }
+      for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
+          gsi_next (&gsi))
+       {
+         gimple *stmt = gsi_stmt (gsi);
+         gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
+       }
+    }
+  /* To avoid keeping duplicate gimple IDs in the statements, renumber
+     virtual phis now.  */
+  FOR_ALL_BB_FN (bb, fn)
+    {
+      for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
+          gsi_next (&gsi))
+       {
+         gphi *stmt = gsi.phi ();
+         if (virtual_operand_p (gimple_phi_result (stmt)))
+           gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
+       }
+    }
+
+}
+
 /* Output the body of function NODE->DECL.  */
 
 static void
@@ -2086,9 +2140,6 @@ output_function (struct cgraph_node *node)
 
   gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
 
-  /* Set current_function_decl and cfun.  */
-  push_cfun (fn);
-
   /* Make string 0 be a NULL string.  */
   streamer_write_char_stream (ob->string_stream, 0);
 
@@ -2125,9 +2176,6 @@ output_function (struct cgraph_node *node)
      debug info.  */
   if (gimple_has_body_p (function))
     {
-      /* Fixup loops if required to match discovery done in the reader.  */
-      loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
-
       streamer_write_uhwi (ob, 1);
       output_struct_function_base (ob, fn);
 
@@ -2137,45 +2185,6 @@ output_function (struct cgraph_node *node)
       /* Output any exception handling regions.  */
       output_eh_regions (ob, fn);
 
-
-      /* We will renumber the statements.  The code that does this uses
-        the same ordering that we use for serializing them so we can use
-        the same code on the other end and not have to write out the
-        statement numbers.  We do not assign UIDs to PHIs here because
-        virtual PHIs get re-computed on-the-fly which would make numbers
-        inconsistent.  */
-      set_gimple_stmt_max_uid (cfun, 0);
-      FOR_ALL_BB_FN (bb, cfun)
-       {
-         for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
-              gsi_next (&gsi))
-           {
-             gphi *stmt = gsi.phi ();
-
-             /* Virtual PHIs are not going to be streamed.  */
-             if (!virtual_operand_p (gimple_phi_result (stmt)))
-               gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
-           }
-         for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
-              gsi_next (&gsi))
-           {
-             gimple *stmt = gsi_stmt (gsi);
-             gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
-           }
-       }
-      /* To avoid keeping duplicate gimple IDs in the statements, renumber
-        virtual phis now.  */
-      FOR_ALL_BB_FN (bb, cfun)
-       {
-         for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
-              gsi_next (&gsi))
-           {
-             gphi *stmt = gsi.phi ();
-             if (virtual_operand_p (gimple_phi_result (stmt)))
-               gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
-           }
-       }
-
       /* Output the code for the function.  */
       FOR_ALL_BB_FN (bb, fn)
        output_bb (ob, bb, fn);
@@ -2184,9 +2193,6 @@ output_function (struct cgraph_node *node)
       streamer_write_record_start (ob, LTO_null);
 
       output_cfg (ob, fn);
-
-      loop_optimizer_finalize ();
-      pop_cfun ();
    }
   else
     streamer_write_uhwi (ob, 0);
index 04b79dbce3b8ffc2b23217cb22bcc90af52ccdec..ac3ecc9e5edcb1d716d76db8be4bdf403f97a4ed 100644 (file)
@@ -879,6 +879,7 @@ void lto_output_decl_state_refs (struct output_block *,
                                 struct lto_out_decl_state *);
 void lto_output_location (struct output_block *, struct bitpack_d *, location_t);
 void lto_output_init_mode_table (void);
+void lto_prepare_function_for_streaming (cgraph_node *);
 
 
 /* In lto-cgraph.c  */
index e99eb1520febf5bdac35324c4ff4d77933885c85..c78f9c92a8628533bd38f29067ec006d5ac15616 100644 (file)
@@ -1,3 +1,13 @@
+2019-10-26  Jan Hubicka  <hubicka@ucw.cz>
+
+       Backport from mainline
+
+       2019-10-12  Jan Hubicka  <hubicka@ucw.cz>
+       * lto.c (lto_wpa_write_files): Do not update bodies of clones.
+
+       2019-10-11  Jan Hubicka  <hubicka@ucw.cz>
+       * lto.c (lto_wpa_write_files): Prepare all bodies for streaming.
+
 2019-10-25  Jan Hubicka  <hubicka@ucw.cz>
 
        Backport from mainline
index be6942fce07d46e3b5d8aeea9672a305a330b273..4dde8c001e1df4f5739c8934187006e13fd5157f 100644 (file)
@@ -2448,6 +2448,13 @@ lto_wpa_write_files (void)
 
   ggc_trim ();
 
+  cgraph_node *node;
+  /* Do body modifications needed for streaming before we fork out
+     worker processes.  */
+  FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
+    if (!node->clone_of && gimple_has_body_p (node->decl))
+      lto_prepare_function_for_streaming (node);
+
   /* Generate a prefix for the LTRANS unit files.  */
   blen = strlen (ltrans_output_list);
   temp_filename = (char *) xmalloc (blen + sizeof ("2147483648.o"));
index 092dafbd4881c125ca1b5993c11a74fc7e18036f..e071a878301e63cc2ea134a421f2462b2dbf55fd 100644 (file)
@@ -2719,20 +2719,12 @@ ipa_write_summaries (void)
     {
       struct cgraph_node *node = order[i];
 
-      if (gimple_has_body_p (node->decl))
+      if (node->definition && node->need_lto_streaming)
        {
-         /* When streaming out references to statements as part of some IPA
-            pass summary, the statements need to have uids assigned and the
-            following does that for all the IPA passes here. Naturally, this
-            ordering then matches the one IPA-passes get in their stmt_fixup
-            hooks.  */
-
-         push_cfun (DECL_STRUCT_FUNCTION (node->decl));
-         renumber_gimple_stmt_uids ();
-         pop_cfun ();
+         if (gimple_has_body_p (node->decl))
+           lto_prepare_function_for_streaming (node);
+         lto_set_symtab_encoder_in_partition (encoder, node);
        }
-      if (node->definition && node->need_lto_streaming)
-        lto_set_symtab_encoder_in_partition (encoder, node);
     }
 
   FOR_EACH_DEFINED_FUNCTION (node)
@@ -2800,28 +2792,13 @@ void
 ipa_write_optimization_summaries (lto_symtab_encoder_t encoder)
 {
   struct lto_out_decl_state *state = lto_new_out_decl_state ();
-  lto_symtab_encoder_iterator lsei;
   state->symtab_node_encoder = encoder;
 
   lto_output_init_mode_table ();
   lto_push_out_decl_state (state);
-  for (lsei = lsei_start_function_in_partition (encoder);
-       !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei))
-    {
-      struct cgraph_node *node = lsei_cgraph_node (lsei);
-      /* When streaming out references to statements as part of some IPA
-        pass summary, the statements need to have uids assigned.
-
-        For functions newly born at WPA stage we need to initialize
-        the uids here.  */
-      if (node->definition
-         && gimple_has_body_p (node->decl))
-       {
-         push_cfun (DECL_STRUCT_FUNCTION (node->decl));
-         renumber_gimple_stmt_uids ();
-         pop_cfun ();
-       }
-    }
+
+  /* Be sure that we did not forget to renumber stmt uids.  */
+  gcc_checking_assert (flag_wpa);
 
   gcc_assert (flag_wpa);
   pass_manager *passes = g->get_passes ();
index 9ba627c90b54fb6f76d0171ff16e5aa4d7f06026..64991ba92fa7bf4eea1ab7d121e088b4208dffba 100644 (file)
@@ -61,23 +61,23 @@ static void collect_dfa_stats (struct dfa_stats_d *);
 /* Renumber all of the gimple stmt uids.  */
 
 void
-renumber_gimple_stmt_uids (void)
+renumber_gimple_stmt_uids (struct function *fun)
 {
   basic_block bb;
 
-  set_gimple_stmt_max_uid (cfun, 0);
-  FOR_ALL_BB_FN (bb, cfun)
+  set_gimple_stmt_max_uid (fun, 0);
+  FOR_ALL_BB_FN (bb, fun)
     {
       gimple_stmt_iterator bsi;
       for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
        {
          gimple *stmt = gsi_stmt (bsi);
-         gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
+         gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun));
        }
       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
        {
          gimple *stmt = gsi_stmt (bsi);
-         gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
+         gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun));
        }
     }
 }
index 98810080c6570ae39da4f7f035be7767a4bfbf4a..aa4ab7eb9462640cfa8d8cf2bede653e30d7a875 100644 (file)
@@ -20,7 +20,7 @@ along with GCC; see the file COPYING3.  If not see
 #ifndef GCC_TREE_DFA_H
 #define GCC_TREE_DFA_H
 
-extern void renumber_gimple_stmt_uids (void);
+extern void renumber_gimple_stmt_uids (struct function *);
 extern void renumber_gimple_stmt_uids_in_blocks (basic_block *, int);
 extern void dump_variable (FILE *, tree);
 extern void debug_variable (tree);
index aa998f416c76eda8f327255d3c00bffc6ddb632c..efe5b31cc0af78b0674a6575cde48f13b5b598fd 100644 (file)
@@ -984,7 +984,7 @@ pass_dse::execute (function *fun)
 {
   need_eh_cleanup = BITMAP_ALLOC (NULL);
 
-  renumber_gimple_stmt_uids ();
+  renumber_gimple_stmt_uids (cfun);
 
   /* We might consider making this a property of each pass so that it
      can be [re]computed on an as-needed basis.  Particularly since
index b7bbde4e40288c1a3f93e06273652454f7ed0899..bf9466b417f7dc99744d94ddd01c307d37b75e48 100644 (file)
@@ -3840,7 +3840,7 @@ pass_optimize_widening_mul::execute (function *fun)
 
   memset (&widen_mul_stats, 0, sizeof (widen_mul_stats));
   calculate_dominance_info (CDI_DOMINATORS);
-  renumber_gimple_stmt_uids ();
+  renumber_gimple_stmt_uids (cfun);
 
   math_opts_dom_walker (&cfg_changed).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));