OSDN Git Service

2007-11-14 Sebastian Pop <sebastian.pop@amd.com>
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Nov 2007 17:36:01 +0000 (17:36 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Nov 2007 17:36:01 +0000 (17:36 +0000)
* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Remove
unused edges after loop duplication.

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

gcc/ChangeLog
gcc/tree-ssa-loop-ivcanon.c

index bff34b2..cf9b33e 100644 (file)
@@ -1,3 +1,8 @@
+2007-11-14  Sebastian Pop  <sebastian.pop@amd.com>
+
+       * tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Remove
+       unused edges after loop duplication.
+
 2007-11-14  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.h (TARGET_CPU_DEFAULT_*): Substitute with ...
index 60fc2ce..5e9e248 100644 (file)
@@ -163,7 +163,7 @@ try_unroll_loop_completely (struct loop *loop,
                            enum unroll_level ul)
 {
   unsigned HOST_WIDE_INT n_unroll, ninsns, max_unroll, unr_insns;
-  tree old_cond, cond, dont_exit, do_exit;
+  tree cond;
 
   if (loop->inner)
     return false;
@@ -207,50 +207,44 @@ try_unroll_loop_completely (struct loop *loop,
        }
     }
 
-  if (exit->flags & EDGE_TRUE_VALUE)
-    {
-      dont_exit = boolean_false_node;
-      do_exit = boolean_true_node;
-    }
-  else
-    {
-      dont_exit = boolean_true_node;
-      do_exit = boolean_false_node;
-    }
-  cond = last_stmt (exit->src);
-    
   if (n_unroll)
     {
       sbitmap wont_exit;
+      edge e;
+      unsigned i;
+      VEC (edge, heap) *to_remove = NULL;
 
-      old_cond = COND_EXPR_COND (cond);
-      COND_EXPR_COND (cond) = dont_exit;
-      update_stmt (cond);
       initialize_original_copy_tables ();
-
       wont_exit = sbitmap_alloc (n_unroll + 1);
       sbitmap_ones (wont_exit);
       RESET_BIT (wont_exit, 0);
 
       if (!tree_duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
                                               n_unroll, wont_exit,
-                                              exit, NULL,
+                                              exit, &to_remove,
                                               DLTHE_FLAG_UPDATE_FREQ
                                               | DLTHE_FLAG_COMPLETTE_PEEL))
        {
-         COND_EXPR_COND (cond) = old_cond;
-         update_stmt (cond);
           free_original_copy_tables ();
          free (wont_exit);
          return false;
        }
+
+      for (i = 0; VEC_iterate (edge, to_remove, i, e); i++)
+       {
+         bool ok = remove_path (e);
+         gcc_assert (ok);
+       }
+
+      VEC_free (edge, heap, to_remove);
       free (wont_exit);
       free_original_copy_tables ();
     }
-  
-  COND_EXPR_COND (cond) = do_exit;
-  update_stmt (cond);
 
+  cond = last_stmt (exit->src);
+  COND_EXPR_COND (cond) = (exit->flags & EDGE_TRUE_VALUE) ? boolean_true_node
+    : boolean_false_node;
+  update_stmt (cond);
   update_ssa (TODO_update_ssa);
 
   if (dump_file && (dump_flags & TDF_DETAILS))