diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/loop.c | 25 |
2 files changed, 20 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 943dd47b70e..13bd549feac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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'. diff --git a/gcc/loop.c b/gcc/loop.c index b52b33a55e5..833a0a9a205 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -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); } /* 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. */ |