OSDN Git Service

Fix PR43464: copyprop should maintain loop close phi nodes with multiple arguments.
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 31 Mar 2010 18:37:41 +0000 (18:37 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 31 Mar 2010 18:37:41 +0000 (18:37 +0000)
2010-03-30  Richard Guenther  <rguenther@suse.de>
    Zdenek Dvorak  <ook@ucw.cz>
    Sebastian Pop  <sebastian.pop@amd.com>

PR middle-end/43464
* tree-ssa-copy.c (init_copy_prop): Handle loop close phi nodes
with multiple arguments.
(execute_copy_prop): Remove call to rewrite_into_loop_closed_ssa.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157889 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog.graphite
gcc/tree-ssa-copy.c

index 3cfb29b..6ce22cb 100644 (file)
@@ -1,3 +1,12 @@
+2010-03-30  Richard Guenther  <rguenther@suse.de>
+           Zdenek Dvorak  <ook@ucw.cz>
+           Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR middle-end/43464
+       * tree-ssa-copy.c (init_copy_prop): Handle loop close phi nodes
+       with multiple arguments.
+       (execute_copy_prop): Remove call to rewrite_into_loop_closed_ssa.
+
 2010-03-23  Sebastian Pop  <sebastian.pop@amd.com>
 
        * graphite-dependences.c (print_pddr): Call print_pdr with an
index 4b8d0b9..5ee51e0 100644 (file)
@@ -749,6 +749,7 @@ init_copy_prop (void)
     {
       gimple_stmt_iterator si;
       int depth = bb->loop_depth;
+      bool loop_exit_p = false;
 
       for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
        {
@@ -786,6 +787,18 @@ init_copy_prop (void)
              cached_last_copy_of[SSA_NAME_VERSION (def)] = def;
        }
 
+      /* In loop-closed SSA form do not copy-propagate through
+        PHI nodes in blocks with a loop exit edge predecessor.  */
+      if (current_loops
+         && loops_state_satisfies_p (LOOP_CLOSED_SSA))
+       {
+         edge_iterator ei;
+         edge e;
+         FOR_EACH_EDGE (e, ei, bb->preds)
+           if (loop_exit_edge_p (e->src->loop_father, e))
+             loop_exit_p = true;
+       }
+
       for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
        {
           gimple phi = gsi_stmt (si);
@@ -793,12 +806,7 @@ init_copy_prop (void)
 
          def = gimple_phi_result (phi);
          if (!is_gimple_reg (def)
-             /* In loop-closed SSA form do not copy-propagate through
-                PHI nodes.  Technically this is only needed for loop
-                exit PHIs, but this is difficult to query.  */
-             || (current_loops
-                 && gimple_phi_num_args (phi) == 1
-                 && loops_state_satisfies_p (LOOP_CLOSED_SSA)))
+             || loop_exit_p)
             prop_set_simulate_again (phi, false);
          else
             prop_set_simulate_again (phi, true);