re PR middle-end/56461 (GCC is leaking lots of memory)
authorJakub Jelinek <jakub@redhat.com>
Tue, 5 Mar 2013 09:38:48 +0000 (10:38 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 5 Mar 2013 09:38:48 +0000 (10:38 +0100)
PR middle-end/56461
* tree-ssa-loop-niter.c (bb_queue): Remove typedef.
(discover_iteration_bound_by_body_walk): Change queues to
vec<vec<basic_block> > and queue to vec<basic_block>.  Fix up
spelling in comment.  Call safe_push on queues[bound_index] directly.
Release queues[queue_index] in every iteration unconditionally.
Release bounds vector.

From-SVN: r196454

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

index bc0500cb115e848bb6476735198ff8900e202190..3a1b71bf7bdfef3eda3916035097791c2c4d6f3e 100644 (file)
@@ -1,5 +1,13 @@
 2013-03-05  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/56461
+       * tree-ssa-loop-niter.c (bb_queue): Remove typedef.
+       (discover_iteration_bound_by_body_walk): Change queues to
+       vec<vec<basic_block> > and queue to vec<basic_block>.  Fix up
+       spelling in comment.  Call safe_push on queues[bound_index] directly.
+       Release queues[queue_index] in every iteration unconditionally.
+       Release bounds vector.
+
        PR middle-end/56461
        * tree-vect-stmts.c (free_stmt_vec_info_vec): Call
        free_stmt_vec_info on any left-over stmt_vec_info in the vector.
index 744fa71a95d47e51ec0c7ec3207152b19b82706d..ba06b0c693670cec7218e6b9f1ff59bb4fa94f9a 100644 (file)
@@ -3007,9 +3007,6 @@ bound_index (vec<double_int> bounds, double_int bound)
   gcc_unreachable ();
 }
 
-/* Used to hold vector of queues of basic blocks bellow.  */
-typedef vec<basic_block> bb_queue;
-
 /* We recorded loop bounds only for statements dominating loop latch (and thus
    executed each loop iteration).  If there are any bounds on statements not
    dominating the loop latch we can improve the estimate by walking the loop
@@ -3022,8 +3019,8 @@ discover_iteration_bound_by_body_walk (struct loop *loop)
   pointer_map_t *bb_bounds;
   struct nb_iter_bound *elt;
   vec<double_int> bounds = vNULL;
-  vec<bb_queue> queues = vNULL;
-  bb_queue queue = bb_queue();
+  vec<vec<basic_block> > queues = vNULL;
+  vec<basic_block> queue = vNULL;
   ptrdiff_t queue_index;
   ptrdiff_t latch_index = 0;
   pointer_map_t *block_priority;
@@ -3096,7 +3093,7 @@ discover_iteration_bound_by_body_walk (struct loop *loop)
      present in the path and we look for path with largest smallest bound
      on it.
 
-     To avoid the need for fibonaci heap on double ints we simply compress
+     To avoid the need for fibonacci heap on double ints we simply compress
      double ints into indexes to BOUNDS array and then represent the queue
      as arrays of queues for every index.
      Index of BOUNDS.length() means that the execution of given BB has
@@ -3162,16 +3159,11 @@ discover_iteration_bound_by_body_walk (struct loop *loop)
                    }
                    
                  if (insert)
-                   {
-                     bb_queue queue2 = queues[bound_index];
-                     queue2.safe_push (e->dest);
-                     queues[bound_index] = queue2;
-                   }
+                   queues[bound_index].safe_push (e->dest);
                }
            }
        }
-      else
-       queues[queue_index].release ();
+      queues[queue_index].release ();
     }
 
   gcc_assert (latch_index >= 0);
@@ -3187,6 +3179,7 @@ discover_iteration_bound_by_body_walk (struct loop *loop)
     }
 
   queues.release ();
+  bounds.release ();
   pointer_map_destroy (bb_bounds);
   pointer_map_destroy (block_priority);
 }