* loop.c (loops_info): New variable.
authorm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 Jan 2000 02:23:14 +0000 (02:23 +0000)
committerm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 Jan 2000 02:23:14 +0000 (02:23 +0000)
(loop_optimize): Allocate loops->array and free it on exit.
Allocate memory for loops_info and assign to each loop,
  replacing alloca.
(find_and_verify_loops): Do not allocate loops->array.

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

gcc/ChangeLog
gcc/loop.c

index 943dd47..13bd549 100644 (file)
@@ -1,3 +1,11 @@
+2000-01-22  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
+
+       * loop.c (loops_info): New variable.
+       (loop_optimize): Allocate loops->array and free it on exit.
+       Allocate memory for loops_info and assign to each loop,
+       replacing alloca.  
+       (find_and_verify_loops): Do not allocate loops->array.
+
 2000-01-21  Zack Weinberg  <zack@wolery.cumb.org>
 
        * fixinc/fixfixes.c (machine_name_fix): Don't free 'scratch'.
index b52b33a..833a0a9 100644 (file)
@@ -419,6 +419,7 @@ loop_optimize (f, dumpfile, unroll_p, bct_p)
   register int i;
   struct loops loops_data;
   struct loops *loops = &loops_data;
+  struct loop_info *loops_info;
 
   loop_dump_stream = dumpfile;
 
@@ -455,10 +456,19 @@ loop_optimize (f, dumpfile, unroll_p, bct_p)
   uid_loop = (struct loop **) xcalloc (max_uid_for_loop, 
                                       sizeof (struct loop *));
 
+  /* Allocate storage for array of loops.  */
+  loops->array = (struct loop *)
+    xcalloc (loops->num, sizeof (struct loop));
+
   /* Find and process each loop.
      First, find them, and record them in order of their beginnings.  */
   find_and_verify_loops (f, loops);
 
+  /* Allocate and initialize auxiliary loop information.  */
+  loops_info = xcalloc (loops->num, sizeof (struct loop_info));
+  for (i = 0; i < loops->num; i++)
+    loops->array[i].info = loops_info + i;
+
   /* Now find all register lifetimes.  This must be done after
      find_and_verify_loops, because it might reorder the insns in the
      function.  */
@@ -510,15 +520,6 @@ loop_optimize (f, dumpfile, unroll_p, bct_p)
      this prevents low overhead loop instructions from being used.  */
   indirect_jump_in_function = indirect_jump_in_function_p (f);
 
-  /* Allocate and initialize auxiliary loop information.  */
-  for (i = max_loop_num - 1; i >= 0; i--)
-    {
-      struct loop *loop = &loops->array[i];
-
-      loop->info = (struct loop_info *) alloca (sizeof (struct loop_info));
-      memset (loop->info, 0, sizeof (struct loop_info));
-    }
-
   /* Now scan the loops, last ones first, since this means inner ones are done
      before outer ones.  */
   for (i = max_loop_num - 1; i >= 0; i--)
@@ -539,6 +540,8 @@ loop_optimize (f, dumpfile, unroll_p, bct_p)
   free (moved_once);
   free (uid_luid);
   free (uid_loop);
+  free (loops_info);
+  free (loops->array);
 }
 \f
 /* Returns the next insn, in execution order, after INSN.  START and
@@ -2596,10 +2599,6 @@ find_and_verify_loops (f, loops)
      This also avoids writing past end of tables when there are no loops.  */
   uid_loop[0] = NULL;
 
-  loops->array = (struct loop *)
-    xmalloc (num_loops * sizeof (struct loop));
-  bzero ((char *)loops->array, num_loops * sizeof (struct loop));
-      
   /* Find boundaries of loops, mark which loops are contained within
      loops, and invalidate loops that have setjmp.  */