Don't split non-critical edges in crited
authorVladislav Ivanishin <vlad@ispras.ru>
Tue, 21 May 2019 10:45:32 +0000 (10:45 +0000)
committerVladislav Ivanishin <vlad@gcc.gnu.org>
Tue, 21 May 2019 10:45:32 +0000 (10:45 +0000)
gcc/ChangeLog:

        * tree-cfg.h (split_critical_edges): Add for_edge_insertion_p
parameter with default value false to declaration.
        (split_edges_for_insertion): New inline function.  Wrapper for
split_critical_edges with for_edge_insertion_p = true.
        * tree-cfg.c (split_critical_edges): Don't split non-critical
edges if for_edge_insertion_p is false.  Fix whitespace.
        * tree-ssa-pre.c (pass_pre::execute): Call
split_edges_for_insertion instead of split_critical_edges.
        * gcc/tree-ssa-tail-merge.c (tail_merge_optimize): Ditto.
        * gcc/tree-ssa-sink.c (pass_sink_code::execute): Ditto.
(pass_data_sink_code): Update function name in the comment.

From-SVN: r271461

gcc/ChangeLog
gcc/tree-cfg.c
gcc/tree-cfg.h
gcc/tree-ssa-pre.c
gcc/tree-ssa-sink.c
gcc/tree-ssa-tail-merge.c

index d341a64440c624ba0d4027c61d39d568cd48ab31..e9f7b1f4d3804b2dea2df2b1aa43800155230f86 100644 (file)
@@ -1,3 +1,17 @@
+2019-05-21  Vladislav Ivanishin  <vlad@ispras.ru>
+
+       * tree-cfg.h (split_critical_edges): Add for_edge_insertion_p
+       parameter with default value false to declaration.
+       (split_edges_for_insertion): New inline function.  Wrapper for
+       split_critical_edges with for_edge_insertion_p = true.
+       * tree-cfg.c (split_critical_edges): Don't split non-critical
+       edges if for_edge_insertion_p is false.  Fix whitespace.
+       * tree-ssa-pre.c (pass_pre::execute): Call
+       split_edges_for_insertion instead of split_critical_edges.
+       * gcc/tree-ssa-tail-merge.c (tail_merge_optimize): Ditto.
+       * gcc/tree-ssa-sink.c (pass_sink_code::execute): Ditto.
+       (pass_data_sink_code): Update function name in the comment.
+
 2019-05-21  Vladislav Ivanishin  <vlad@ispras.ru>
 
        * tree-ssa-uninit.c (value_sat_pred_p): This new function is a wrapper
index 4655d7f80735aaf1f6d14d9ead210fdce84e9e94..85ce204ec2645e31f3e4da1e5351ff4db38fc771 100644 (file)
@@ -8932,10 +8932,11 @@ struct cfg_hooks gimple_cfg_hooks = {
 };
 
 
-/* Split all critical edges.  */
+/* Split all critical edges.  Split some extra (not necessarily critical) edges
+   if FOR_EDGE_INSERTION_P is true.  */
 
 unsigned int
-split_critical_edges (void)
+split_critical_edges (bool for_edge_insertion_p /* = false */)
 {
   basic_block bb;
   edge e;
@@ -8958,11 +8959,12 @@ split_critical_edges (void)
             end by control flow statements, such as RESX.
             Go ahead and split them too.  This matches the logic in
             gimple_find_edge_insert_loc.  */
-         else if ((!single_pred_p (e->dest)
-                   || !gimple_seq_empty_p (phi_nodes (e->dest))
-                   || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
+         else if (for_edge_insertion_p
+                  && (!single_pred_p (e->dest)
+                      || !gimple_seq_empty_p (phi_nodes (e->dest))
+                      || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
                   && e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
-                  && !(e->flags & EDGE_ABNORMAL))
+                  && !(e->flags & EDGE_ABNORMAL))
            {
              gimple_stmt_iterator gsi;
 
index 212f5ff5919c140cd6f60d4f931ce83db5e03e71..836f8e8af51aa23367518d5d453e7ee43647c802 100644 (file)
@@ -105,7 +105,7 @@ extern void extract_true_false_edges_from_block (basic_block, edge *, edge *);
 extern tree find_case_label_for_value (const gswitch *switch_stmt, tree val);
 extern edge find_taken_edge_switch_expr (const gswitch *switch_stmt, tree val);
 extern unsigned int execute_fixup_cfg (void);
-extern unsigned int split_critical_edges (void);
+extern unsigned int split_critical_edges (bool for_edge_insertion_p = false);
 extern basic_block insert_cond_bb (basic_block, gimple *, gimple *,
                                   profile_probability);
 extern bool gimple_find_sub_bbs (gimple_seq, gimple_stmt_iterator *);
@@ -128,4 +128,11 @@ should_remove_lhs_p (tree lhs)
          && !TREE_ADDRESSABLE (TREE_TYPE (lhs)));
 }
 
+
+inline unsigned int
+split_edges_for_insertion ()
+{
+  return split_critical_edges (/*for_edge_insertion_p=*/true);
+}
+
 #endif /* _TREE_CFG_H  */
index 469199fa21321c218e4b24324f91a4afcb81e0eb..086f8c3333657d0d3098ccdf8334fc555c52e0f3 100644 (file)
@@ -4183,7 +4183,7 @@ pass_pre::execute (function *fun)
   /* This has to happen before VN runs because
      loop_optimizer_init may create new phis, etc.  */
   loop_optimizer_init (LOOPS_NORMAL);
-  split_critical_edges ();
+  split_edges_for_insertion ();
   scev_initialize ();
   calculate_dominance_info (CDI_DOMINATORS);
 
index fe762f54d96e18c0e8975a2c01062b41b9b9ff60..77abe3aa4b649e763cb05aee368fa249cf0368b8 100644 (file)
@@ -610,7 +610,7 @@ const pass_data pass_data_sink_code =
   "sink", /* name */
   OPTGROUP_NONE, /* optinfo_flags */
   TV_TREE_SINK, /* tv_id */
-  /* PROP_no_crit_edges is ensured by running split_critical_edges in
+  /* PROP_no_crit_edges is ensured by running split_edges_for_insertion in
      pass_data_sink_code::execute ().  */
   ( PROP_cfg | PROP_ssa ), /* properties_required */
   0, /* properties_provided */
@@ -636,7 +636,7 @@ unsigned int
 pass_sink_code::execute (function *fun)
 {
   loop_optimizer_init (LOOPS_NORMAL);
-  split_critical_edges ();
+  split_edges_for_insertion ();
   connect_infinite_loops_to_exit ();
   memset (&sink_stats, 0, sizeof (sink_stats));
   calculate_dominance_info (CDI_DOMINATORS);
index 3eb63b5fa6de0b49f9b1ff1daf4b63250425c34f..cbd5a277b3968d66cb8a782c143c4f920b144cae 100644 (file)
@@ -1746,7 +1746,7 @@ tail_merge_optimize (unsigned int todo)
     {
       cleanup_tree_cfg ();
       todo &= ~TODO_cleanup_cfg;
-      split_critical_edges ();
+      split_edges_for_insertion ();
     }
 
   if (!dom_info_available_p (CDI_DOMINATORS))