]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Put virtual operands into loop-closed SSA
authorRichard Biener <rguenther@suse.de>
Tue, 21 Jun 2022 14:17:58 +0000 (16:17 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 4 Jul 2022 08:36:09 +0000 (10:36 +0200)
When attempting to manually update SSA form after high-level loop
transforms such as loop versioning it is helpful when the loop-closed
SSA form includes virtual operands.  While we have the special
rewrite_virtuals_into_loop_closed_ssa function that doesn't
presently scale, invoking update_ssa by itself.  So the following
makes the regular loop-closed SSA form also cover virtual operands.
For users of loop_version this allows to use cheaper
TODO_update_ssa_no_phi, skipping dominance frontier compute
(for the whole function) and iterated dominance frontiers for each
copied def.

* tree-ssa-loop-manip.h
(rewrite_virtuals_into_loop_closed_ssa): Remove.
(rewrite_into_loop_closed_ssa_1): Likewise.
* tree-ssa-loop-manip.cc (rewrite_into_loop_closed_ssa_1):
Make static.
(rewrite_into_loop_closed_ssa): Remove loop overload,
always rewrite virtuals into LC SSA.
(check_loop_closed_ssa_bb): Also check virtuals.
* tree-ssa-dce.cc (remove_dead_phis): Preserve virtual
LC PHIs when in LC SSA.
* gimple-loop-jam.cc (fuse_loops): Do not rewrite into
loop-closed SSA here, but ...
(tree_loop_unroll_and_jam): ... here once.
* tree-if-conv.cc (version_loop_for_if_conversion): Use
the cheaper TODO_update_ssa_no_phi.
* tree-loop-distribution.cc (version_loop_by_alias_check):
Likewise.
* tree-ssa-loop-unswitch.cc (tree_unswitch_single_loop):
Likewise.
* tree-vect-loop-manip.cc (vect_loop_versioning): Likewise.
(tree_unswitch_outer_loop): Do not rewrite virtuals into
LC ssa.
* tree-parloops.cc (transform_to_exit_first_loop_alt):
Likewise.
(pass_parallelize_loops::execute): After finishing rewrite
into LC SSA again because we do not maintain it properly.

gcc/gimple-loop-jam.cc
gcc/tree-if-conv.cc
gcc/tree-loop-distribution.cc
gcc/tree-parloops.cc
gcc/tree-ssa-dce.cc
gcc/tree-ssa-loop-manip.cc
gcc/tree-ssa-loop-manip.h
gcc/tree-ssa-loop-unswitch.cc
gcc/tree-vect-loop-manip.cc

index 9b18b52a54ce66ed03a993be81141bc6614f6428..8cde6c7c5ce65863ccdd584f0434fc5fabcff061 100644 (file)
@@ -363,7 +363,6 @@ fuse_loops (class loop *loop)
       delete_loop (next);
       next = ln;
     }
-  rewrite_into_loop_closed_ssa_1 (NULL, 0, SSA_OP_USE, loop);
 }
 
 /* Return true if any of the access functions for dataref A
@@ -610,6 +609,7 @@ tree_loop_unroll_and_jam (void)
 
   if (todo)
     {
+      rewrite_into_loop_closed_ssa (NULL, 0);
       scev_reset ();
       free_dominance_info (CDI_DOMINATORS);
     }
index 3c659f6b5a7fd110d89b361b1b9f33aee0b174ea..1c8e1a45234b8c3565edaacd55abbee23d8ea240 100644 (file)
@@ -2934,7 +2934,7 @@ version_loop_for_if_conversion (class loop *loop, vec<gimple *> *preds)
   if (preds)
     preds->safe_push (g);
   gsi_insert_before (&gsi, g, GSI_SAME_STMT);
-  update_ssa (TODO_update_ssa);
+  update_ssa (TODO_update_ssa_no_phi);
   return new_loop;
 }
 
index 18b97fc3801a81f28c6f6bdb0e3cc9f099bb88e7..ed7f432f322d4725d6c63fdc2eec9c74f24a0748 100644 (file)
@@ -2751,7 +2751,7 @@ version_loop_by_alias_check (vec<struct partition *> *partitions,
       gimple_stmt_iterator cond_gsi = gsi_last_bb (cond_bb);
       gsi_insert_seq_before (&cond_gsi, cond_stmts, GSI_SAME_STMT);
     }
-  update_ssa (TODO_update_ssa);
+  update_ssa (TODO_update_ssa_no_phi);
 }
 
 /* Return true if loop versioning is needed to distrubute PARTITIONS.
index 2c3ef436ab77bcedbe0d3433708435203cf7c401..2d3aa78cd249b98ec2f310e89ecd4ddc7fa3fce0 100644 (file)
@@ -2355,12 +2355,6 @@ transform_to_exit_first_loop_alt (class loop *loop,
   tree control = gimple_cond_lhs (cond_stmt);
   edge e;
 
-  /* Rewriting virtuals into loop-closed ssa normal form makes this
-     transformation simpler.  It also ensures that the virtuals are in
-     loop-closed ssa normal from after the transformation, which is required by
-     create_parallel_loop.  */
-  rewrite_virtuals_into_loop_closed_ssa (loop);
-
   /* Create the new_header block.  */
   basic_block new_header = split_block_before_cond_jump (exit->src);
   edge edge_at_split = single_pred_edge (new_header);
@@ -4223,7 +4217,9 @@ pass_parallelize_loops::execute (function *fun)
 
       checking_verify_loop_structure ();
 
-      todo |= TODO_update_ssa;
+      update_ssa (TODO_update_ssa);
+      if (in_loop_pipeline)
+       rewrite_into_loop_closed_ssa (NULL, 0);
     }
 
   if (!in_loop_pipeline)
index 5df64922594a74024e95c5921f232723db741ebb..bc5335826732c367a4b7b1a0f2f8ea4015679e42 100644 (file)
@@ -1026,7 +1026,8 @@ remove_dead_phis (basic_block bb)
        {
          /* Virtual PHI nodes with one or identical arguments
             can be removed.  */
-         if (degenerate_phi_p (phi))
+         if (!loops_state_satisfies_p (LOOP_CLOSED_SSA)
+             && degenerate_phi_p (phi))
            {
              tree vdef = gimple_phi_result (phi);
              tree vuse = gimple_phi_arg_def (phi, 0);
index 5d435637e982f3594a147fe505d900d08b5ea33e..623d03b9d86a6a47a9671530583a293b2262f28b 100644 (file)
@@ -625,7 +625,7 @@ find_uses_to_rename_in_loop (class loop *loop, bitmap *use_blocks,
       UPDATE_FLAG is used in the call to update_ssa.  See
       TODO_update_ssa* for documentation.  */
 
-void
+static void
 rewrite_into_loop_closed_ssa_1 (bitmap changed_bbs, unsigned update_flag,
                                int use_flags, class loop *loop)
 {
@@ -686,24 +686,16 @@ rewrite_into_loop_closed_ssa_1 (bitmap changed_bbs, unsigned update_flag,
   free (use_blocks);
 }
 
-/* Rewrites the non-virtual defs and uses into a loop closed ssa form.  If
-   CHANGED_BBS is not NULL, we look for uses outside loops only in the basic
+/* Rewrites the defs and uses into a loop closed ssa form.
+   If CHANGED_BBS is not NULL, we look for uses outside loops only in the basic
    blocks in this set.  UPDATE_FLAG is used in the call to update_ssa.  See
    TODO_update_ssa* for documentation.  */
 
 void
 rewrite_into_loop_closed_ssa (bitmap changed_bbs, unsigned update_flag)
 {
-  rewrite_into_loop_closed_ssa_1 (changed_bbs, update_flag, SSA_OP_USE, NULL);
-}
-
-/* Rewrites virtual defs and uses with def in LOOP into loop closed ssa
-   form.  */
-
-void
-rewrite_virtuals_into_loop_closed_ssa (class loop *loop)
-{
-  rewrite_into_loop_closed_ssa_1 (NULL, 0, SSA_OP_VIRTUAL_USES, loop);
+  rewrite_into_loop_closed_ssa_1 (changed_bbs, update_flag,
+                                 SSA_OP_ALL_USES, NULL);
 }
 
 /* Check invariants of the loop closed ssa form for the def in DEF_BB.  */
@@ -736,8 +728,7 @@ check_loop_closed_ssa_bb (basic_block bb)
     {
       gphi *phi = bsi.phi ();
 
-      if (!virtual_operand_p (PHI_RESULT (phi)))
-       check_loop_closed_ssa_def (bb, PHI_RESULT (phi));
+      check_loop_closed_ssa_def (bb, PHI_RESULT (phi));
     }
 
   for (gimple_stmt_iterator bsi = gsi_start_nondebug_bb (bb); !gsi_end_p (bsi);
@@ -747,7 +738,7 @@ check_loop_closed_ssa_bb (basic_block bb)
       tree var;
       gimple *stmt = gsi_stmt (bsi);
 
-      FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_DEF)
+      FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_ALL_DEFS)
        check_loop_closed_ssa_def (bb, var);
     }
 }
index 00293195e80dca712d3d67e423168fb2cb3ee704..924cac0edff8eb6290f2ab5b6b2de109ddeafb4a 100644 (file)
@@ -24,10 +24,7 @@ typedef void (*transform_callback)(class loop *, void *);
 
 extern void create_iv (tree, tree, tree, class loop *, gimple_stmt_iterator *,
                       bool, tree *, tree *);
-extern void rewrite_into_loop_closed_ssa_1 (bitmap, unsigned, int,
-                                           class loop *);
 extern void rewrite_into_loop_closed_ssa (bitmap, unsigned);
-extern void rewrite_virtuals_into_loop_closed_ssa (class loop *);
 extern void verify_loop_closed_ssa (bool, class loop * = NULL);
 
 static inline void
index 3a827f2f904533ebd73f0b79ff88f0fc08d0b8bc..7d6781d15054fc6bfde8ecf1ddd29b567a860bf2 100644 (file)
@@ -980,7 +980,7 @@ tree_unswitch_single_loop (class loop *loop, dump_user_location_t loc,
       free_original_copy_tables ();
 
       /* Update the SSA form after unswitching.  */
-      update_ssa (TODO_update_ssa);
+      update_ssa (TODO_update_ssa_no_phi);
 
       /* Invoke itself on modified loops.  */
       bitmap handled_copy = BITMAP_ALLOC (NULL);
@@ -1068,8 +1068,6 @@ tree_unswitch_outer_loop (class loop *loop)
   auto_vec<gimple *> dbg_to_reset;
   while ((guard = find_loop_guard (loop, dbg_to_reset)))
     {
-      if (! changed)
-       rewrite_virtuals_into_loop_closed_ssa (loop);
       hoist_guard (loop, guard);
       for (gimple *debug_stmt : dbg_to_reset)
        {
index e81de45e07e23b184d9ffb301e6d4ee07a35d92c..47c4fe8de86885f0569cd24f39c145527d840063 100644 (file)
@@ -3696,7 +3696,7 @@ vect_loop_versioning (loop_vec_info loop_vinfo,
            }
        }
 
-      update_ssa (TODO_update_ssa);
+      update_ssa (TODO_update_ssa_no_phi);
     }
 
   /* Split the cost model check off to a separate BB.  Costing assumes