passes.def (pass_split_crit_edges): Remove instance before PRE.
authorRichard Biener <rguenther@suse.de>
Thu, 7 Sep 2017 07:44:43 +0000 (07:44 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 7 Sep 2017 07:44:43 +0000 (07:44 +0000)
2017-09-07  Richard Biener  <rguenther@suse.de>

* passes.def (pass_split_crit_edges): Remove instance before PRE.
* tree-ssa-pre.c (pass_pre::execute): Instead manually split
critical edges here, after loop init.
(pass_data_pre): Remove PROP_no_crit_edges flags.
* tree-ssa-sccvn.c (vn_reference_lookup_3): Use vn_valueize
for valueization of call args to avoid leaking VN_TOP.
(visit_use): Assert we do not visit default defs.
(init_scc_vn): Use build_decl for VN_TOP to make name nicer.
Use error_mark_node to more easily detect leaking VN_TOP.
All default-defs are varying, not VN_TOP.  Mark them visited.
(run_scc_vn): Make code match comment.

* gcc.dg/tree-ssa/ssa-thread-12.c: XFAIL third FSM threading
opportunity.

From-SVN: r251833

gcc/ChangeLog
gcc/passes.def
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-12.c
gcc/tree-ssa-pre.c
gcc/tree-ssa-sccvn.c

index 6213a2aad571b2b99c4aaec61cf172a4f1a60a09..8e614f675a8c8295f334077f534929c9722e1098 100644 (file)
@@ -1,3 +1,17 @@
+2017-09-07  Richard Biener  <rguenther@suse.de>
+
+       * passes.def (pass_split_crit_edges): Remove instance before PRE.
+       * tree-ssa-pre.c (pass_pre::execute): Instead manually split
+       critical edges here, after loop init.
+       (pass_data_pre): Remove PROP_no_crit_edges flags.
+       * tree-ssa-sccvn.c (vn_reference_lookup_3): Use vn_valueize
+       for valueization of call args to avoid leaking VN_TOP.
+       (visit_use): Assert we do not visit default defs.
+       (init_scc_vn): Use build_decl for VN_TOP to make name nicer.
+       Use error_mark_node to more easily detect leaking VN_TOP.
+       All default-defs are varying, not VN_TOP.  Mark them visited.
+       (run_scc_vn): Make code match comment.
+
 2017-09-07  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * config/rs6000/rs6000-cpus.def (OTHER_VSX_VECTOR_MASKS): Delete
index 81b6e62f60226ea2f1c799e7a0c31097787dafa2..00e75d2b55a86e1079d0c8f437cb46a28223b531 100644 (file)
@@ -255,7 +255,6 @@ along with GCC; see the file COPYING3.  If not see
       NEXT_PASS (pass_optimize_bswap);
       NEXT_PASS (pass_laddress);
       NEXT_PASS (pass_lim);
-      NEXT_PASS (pass_split_crit_edges);
       NEXT_PASS (pass_walloca, false);
       NEXT_PASS (pass_pre);
       NEXT_PASS (pass_sink_code);
index 7edf509b554f26e0a62724a49be2522184f89704..59af0f7b7261159b7730047259ad45bac3e44f57 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-07  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/ssa-thread-12.c: XFAIL third FSM threading
+       opportunity.
+
 2017-09-07  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/float128-1.c: Update options to know that
index fa6da7bfd999799aaf1bfa343180bb84b99d9ac7..d829b04d177da7b12a6e5d7ffeb27f1bf7fbfdd2 100644 (file)
@@ -2,7 +2,7 @@
 /* { dg-options "-O2 -fdump-tree-thread2-details -fdump-tree-thread3-details -fdump-tree-thread4-details" } */
 /* { dg-final { scan-tree-dump "FSM" "thread2" } } */
 /* { dg-final { scan-tree-dump "FSM" "thread3" } } */
-/* { dg-final { scan-tree-dump "FSM" "thread4" } } */
+/* { dg-final { scan-tree-dump "FSM" "thread4" { xfail *-*-* } } } */
 
 typedef struct bitmap_head_def *bitmap;
 typedef const struct bitmap_head_def *const_bitmap;
index 1ca68d44d22374eec714a7f5d3e583cc3c67f361..6f9fac5b9a0ea5731a2c3c0d99363fad4b67790a 100644 (file)
@@ -5006,11 +5006,9 @@ const pass_data pass_data_pre =
   "pre", /* name */
   OPTGROUP_NONE, /* optinfo_flags */
   TV_TREE_PRE, /* tv_id */
-  /* PROP_no_crit_edges is ensured by placing pass_split_crit_edges before
-     pass_pre.  */
-  ( PROP_no_crit_edges | PROP_cfg | PROP_ssa ), /* properties_required */
+  ( PROP_cfg | PROP_ssa ), /* properties_required */
   0, /* properties_provided */
-  PROP_no_crit_edges, /* properties_destroyed */
+  0, /* properties_destroyed */
   TODO_rebuild_alias, /* todo_flags_start */
   0, /* todo_flags_finish */
 };
@@ -5040,6 +5038,7 @@ pass_pre::execute (function *fun)
   /* This has to happen before SCCVN runs because
      loop_optimizer_init may create new phis, etc.  */
   loop_optimizer_init (LOOPS_NORMAL);
+  split_critical_edges ();
 
   run_scc_vn (VN_WALK);
 
index 472ab0b79580e2d2f0b516e10c779192f8d469b0..93342c0248fcbfd6478f3dae0d57605bd7d61477 100644 (file)
@@ -1874,10 +1874,10 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
       for (unsigned i = 0; i < gimple_call_num_args (def_stmt); ++i)
        {
          oldargs[i] = gimple_call_arg (def_stmt, i);
-         if (TREE_CODE (oldargs[i]) == SSA_NAME
-             && VN_INFO (oldargs[i])->valnum != oldargs[i])
+         tree val = vn_valueize (oldargs[i]);
+         if (val != oldargs[i])
            {
-             gimple_call_set_arg (def_stmt, i, VN_INFO (oldargs[i])->valnum);
+             gimple_call_set_arg (def_stmt, i, val);
              valueized_anything = true;
            }
        }
@@ -3956,9 +3956,10 @@ visit_use (tree use)
 
   mark_use_processed (use);
 
-  gcc_assert (!SSA_NAME_IN_FREE_LIST (use));
-  if (dump_file && (dump_flags & TDF_DETAILS)
-      && !SSA_NAME_IS_DEFAULT_DEF (use))
+  gcc_assert (!SSA_NAME_IN_FREE_LIST (use)
+             && !SSA_NAME_IS_DEFAULT_DEF (use));
+
+  if (dump_file && (dump_flags & TDF_DETAILS))
     {
       fprintf (dump_file, "Value numbering ");
       print_generic_expr (dump_file, use);
@@ -3966,10 +3967,7 @@ visit_use (tree use)
       print_gimple_stmt (dump_file, stmt, 0);
     }
 
-  /* Handle uninitialized uses.  */
-  if (SSA_NAME_IS_DEFAULT_DEF (use))
-    changed = set_ssa_val_to (use, use);
-  else if (gimple_code (stmt) == GIMPLE_PHI)
+  if (gimple_code (stmt) == GIMPLE_PHI)
     changed = visit_phi (stmt);
   else if (gimple_has_volatile_ops (stmt))
     changed = defs_to_varying (stmt);
@@ -4554,7 +4552,8 @@ init_scc_vn (void)
 
   XDELETE (rpo_numbers_temp);
 
-  VN_TOP = create_tmp_var_raw (void_type_node, "vn_top");
+  VN_TOP = build_decl (UNKNOWN_LOCATION, VAR_DECL,
+                      get_identifier ("VN_TOP"), error_mark_node);
 
   renumber_gimple_stmt_uids ();
 
@@ -4583,7 +4582,9 @@ init_scc_vn (void)
       switch (TREE_CODE (SSA_NAME_VAR (name)))
        {
        case VAR_DECL:
-         /* Undefined vars keep TOP.  */
+         /* All undefined vars are VARYING.  */
+         VN_INFO (name)->valnum = name; 
+         VN_INFO (name)->visited = true;
          break;
 
        case PARM_DECL:
@@ -4610,12 +4611,10 @@ init_scc_vn (void)
 
        case RESULT_DECL:
          /* If the result is passed by invisible reference the default
-            def is initialized, otherwise it's uninitialized.  */
-         if (DECL_BY_REFERENCE (SSA_NAME_VAR (name)))
-           {
-             VN_INFO (name)->visited = true;
-             VN_INFO (name)->valnum = name; 
-           }
+            def is initialized, otherwise it's uninitialized.  Still
+            undefined is varying.  */
+         VN_INFO (name)->visited = true;
+         VN_INFO (name)->valnum = name; 
          break;
 
        default:
@@ -5008,14 +5007,13 @@ run_scc_vn (vn_lookup_kind default_vn_walk_kind_)
   /* Initialize the value ids and prune out remaining VN_TOPs
      from dead code.  */
   tree name;
-
   FOR_EACH_SSA_NAME (i, name, cfun)
     {
       vn_ssa_aux_t info = VN_INFO (name);
-      if (!info->visited)
-       info->valnum = name;
-      if (info->valnum == name
+      if (!info->visited
          || info->valnum == VN_TOP)
+       info->valnum = name;
+      if (info->valnum == name)
        info->value_id = get_next_value_id ();
       else if (is_gimple_min_invariant (info->valnum))
        info->value_id = get_or_alloc_constant_value_id (info->valnum);