diff options
author | Michael Hayes <m.hayes@elec.canterbury.ac.nz> | 2000-01-22 02:23:14 +0000 |
---|---|---|
committer | Michael Hayes <m.hayes@gcc.gnu.org> | 2000-01-22 02:23:14 +0000 |
commit | 4cda35d4c9c295f51e6fc6a5348c8553f5e7675a (patch) | |
tree | a4cf402d42dea98c81adbc839979edee2912f926 /gcc/loop.c | |
parent | e8736c0002353a4007f35764c06dda4f68a342be (diff) | |
download | gcc-4cda35d4c9c295f51e6fc6a5348c8553f5e7675a.zip gcc-4cda35d4c9c295f51e6fc6a5348c8553f5e7675a.tar.gz gcc-4cda35d4c9c295f51e6fc6a5348c8553f5e7675a.tar.bz2 |
loop.c (loops_info): New variable.
* 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.
From-SVN: r31556
Diffstat (limited to 'gcc/loop.c')
-rw-r--r-- | gcc/loop.c | 25 |
1 files changed, 12 insertions, 13 deletions
@@ -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. */ |