This has been on my todo list for a little while now. Over time I've written the loop to delete a jump threading path several times. It's just 3 lines of code, but I hate repeating it all over the place.

This pulls those trivial 3 lines into a function and calls it from the appropriate places.

Bootstrapped and regression tested on x86_64-unknown-linux-gnu. Applied to the trunk.

        * tree-ssa-threadupdate.h (delete_thread_path): Declare.
        * tree-ssa-threadupdate.c (delete_thread_path): New function.
        (ssa_redirect_edges, thread_block_1): Use it.
        (thread_through_loop_header, mark_threaded_blocks): Likewise.
        (thread_through_all_blocks, register_jump_thread): Likewise.
        * tree-ssa-threadedge.c (thread_across_edge): Likewise.



diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index 4cff16d..cd2b34a 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -1086,9 +1086,7 @@ thread_across_edge (gimple dummy_cond,
          }
        else
          {
-           for (unsigned int i = 0; i < path->length (); i++)
-             delete (*path)[i];
-           path->release();
+           delete_jump_thread_path (path);
          }
       }
     BITMAP_FREE (visited);
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c
index 1027191..24e7767 100644
--- a/gcc/tree-ssa-threadupdate.c
+++ b/gcc/tree-ssa-threadupdate.c
@@ -555,9 +555,7 @@ ssa_redirect_edges (struct redirection_data **slot,
 
       /* Go ahead and clear E->aux.  It's not needed anymore and failure
          to clear it will cause all kinds of unpleasant problems later.  */
-      for (unsigned int i = 0; i < path->length (); i++)
-       delete (*path)[i];
-      path->release ();
+      delete_jump_thread_path (path);
       e->aux = NULL;
 
     }
@@ -703,9 +701,7 @@ thread_block_1 (basic_block bb, bool noloop_only, bool 
joiners)
              /* Since this case is not handled by our special code
                 to thread through a loop header, we must explicitly
                 cancel the threading request here.  */
-             for (unsigned int i = 0; i < path->length (); i++)
-               delete (*path)[i];
-             path->release ();
+             delete_jump_thread_path (path);
              e->aux = NULL;
              continue;
            }
@@ -1161,9 +1157,7 @@ thread_through_loop_header (struct loop *loop, bool 
may_peel_loop_headers)
          if (e->src->loop_father != e2->dest->loop_father
              && e2->dest != loop->header)
            {
-             for (unsigned int i = 0; i < path->length (); i++)
-               delete (*path)[i];
-             path->release ();
+             delete_jump_thread_path (path);
              e->aux = NULL;
            }
        }
@@ -1213,9 +1207,7 @@ fail:
 
       if (path)
        {
-         for (unsigned int i = 0; i < path->length (); i++)
-           delete (*path)[i];
-         path->release ();
+         delete_jump_thread_path (path);
          e->aux = NULL;
        }
     }
@@ -1310,9 +1302,7 @@ mark_threaded_blocks (bitmap threaded_blocks)
 
                  if (e2 && !phi_args_equal_on_edges (e2, final_edge))
                    {
-                     for (unsigned int i = 0; i < path->length (); i++)
-                       delete (*path)[i];
-                     path->release ();
+                     delete_jump_thread_path (path);
                      e->aux = NULL;
                    }
                }
@@ -1336,9 +1326,7 @@ mark_threaded_blocks (bitmap threaded_blocks)
                  if (e->aux)
                    {
                      vec<jump_thread_edge *> *path = THREAD_PATH (e);
-                     for (unsigned int i = 0; i < path->length (); i++)
-                       delete (*path)[i];
-                     path->release ();
+                     delete_jump_thread_path (path);
                      e->aux = NULL;
                    }
                }
@@ -1395,9 +1383,7 @@ mark_threaded_blocks (bitmap threaded_blocks)
                              || (path->last ()->type
                                  == EDGE_COPY_SRC_JOINER_BLOCK))
                            {
-                             for (unsigned int i = 0; i < path->length (); i++)
-                               delete (*path)[i];
-                             path->release ();
+                             delete_jump_thread_path (path);
                              e->aux = NULL;
                            }
                          break;
@@ -1498,9 +1484,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
          {
            vec<jump_thread_edge *> *path = THREAD_PATH (e);
 
-           for (unsigned int i = 0; i < path->length (); i++)
-             delete (*path)[i];
-           path->release ();
+           delete_jump_thread_path (path);
            e->aux = NULL;
          }
     }
@@ -1520,6 +1504,17 @@ thread_through_all_blocks (bool may_peel_loop_headers)
   return retval;
 }
 
+/* Delete the jump threading path PATH.  We have to explcitly delete
+   each entry in the vector, then the container.  */
+
+void
+delete_jump_thread_path (vec<jump_thread_edge *> *path)
+{
+  for (unsigned int i = 0; i < path->length (); i++)
+    delete (*path)[i];
+  path->release();
+}
+
 /* Dump a jump threading path, including annotations about each
    edge in the path.  */
 
@@ -1565,9 +1560,7 @@ register_jump_thread (vec<jump_thread_edge *> *path)
 {
   if (!dbg_cnt (registered_jump_thread))
     {
-      for (unsigned int i = 0; i < path->length (); i++)
-       delete (*path)[i];
-      path->release ();
+      delete_jump_thread_path (path);
       return;
     }
 
@@ -1583,9 +1576,7 @@ register_jump_thread (vec<jump_thread_edge *> *path)
            dump_jump_thread_path (dump_file, *path);
          }
 
-       for (unsigned int i = 0; i < path->length (); i++)
-         delete (*path)[i];
-       path->release ();
+       delete_jump_thread_path (path);
        return;
       }
 
diff --git a/gcc/tree-ssa-threadupdate.h b/gcc/tree-ssa-threadupdate.h
index f84c02e..4617b9c 100644
--- a/gcc/tree-ssa-threadupdate.h
+++ b/gcc/tree-ssa-threadupdate.h
@@ -42,4 +42,5 @@ public:
 };
 
 extern void register_jump_thread (vec <class jump_thread_edge *> *);
+extern void delete_jump_thread_path (vec <class jump_thread_edge *> *);
 #endif

Reply via email to