aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop.c
diff options
context:
space:
mode:
authorMichael Hayes <m.hayes@elec.canterbury.ac.nz>2000-01-22 02:23:14 +0000
committerMichael Hayes <m.hayes@gcc.gnu.org>2000-01-22 02:23:14 +0000
commit4cda35d4c9c295f51e6fc6a5348c8553f5e7675a (patch)
treea4cf402d42dea98c81adbc839979edee2912f926 /gcc/loop.c
parente8736c0002353a4007f35764c06dda4f68a342be (diff)
downloadgcc-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.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/gcc/loop.c b/gcc/loop.c
index b52b33a..833a0a9 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. */