diff options
author | Michael Hayes <mhayes@redhat.com> | 2001-01-01 00:53:38 +0000 |
---|---|---|
committer | Michael Hayes <m.hayes@gcc.gnu.org> | 2001-01-01 00:53:38 +0000 |
commit | b2735d9a75162d5e0585ea5f615a8fc5bc544841 (patch) | |
tree | e1c25afaf680978b7f613fd8fc735302e643440d /gcc/loop.c | |
parent | 14be28e5f43fa2710e15441ff8b4e54b64295303 (diff) | |
download | gcc-b2735d9a75162d5e0585ea5f615a8fc5bc544841.zip gcc-b2735d9a75162d5e0585ea5f615a8fc5bc544841.tar.gz gcc-b2735d9a75162d5e0585ea5f615a8fc5bc544841.tar.bz2 |
loop.c (loop_ivs_free): New function.
* loop.c (loop_ivs_free): New function.
(strength_reduce): Break out from...
From-SVN: r38583
Diffstat (limited to 'gcc/loop.c')
-rw-r--r-- | gcc/loop.c | 64 |
1 files changed, 38 insertions, 26 deletions
@@ -194,6 +194,7 @@ static void loop_givs_dead_check PARAMS((struct loop *, struct iv_class *)); static void loop_givs_reduce PARAMS((struct loop *, struct iv_class *)); static void loop_givs_rescan PARAMS((struct loop *, struct iv_class *, rtx *, rtx)); +static void loop_ivs_free PARAMS((struct loop *)); static void strength_reduce PARAMS ((struct loop *, int, int)); static void find_single_use_in_loop PARAMS ((rtx, rtx, varray_type)); static int valid_initial_value_p PARAMS ((rtx, rtx, int, rtx)); @@ -4250,6 +4251,40 @@ loop_giv_reduce_benefit (loop, bl, v, test_reg) } +/* Free IV structures for LOOP. */ + +static void +loop_ivs_free (loop) + struct loop *loop; +{ + struct loop_ivs *ivs = LOOP_IVS (loop); + struct iv_class *iv = ivs->list; + + free (ivs->regs); + + while (iv) + { + struct iv_class *next = iv->next; + struct induction *induction; + struct induction *next_induction; + + for (induction = iv->biv; induction; induction = next_induction) + { + next_induction = induction->next_iv; + free (induction); + } + for (induction = iv->giv; induction; induction = next_induction) + { + next_induction = induction->next_iv; + free (induction); + } + + free (iv); + iv = next; + } +} + + /* Perform strength reduction and induction variable elimination. Pseudo registers created during this function will be beyond the @@ -4312,7 +4347,8 @@ strength_reduce (loop, insn_count, flags) if (flags & LOOP_UNROLL) unroll_loop (loop, insn_count, end_insert_before, 0); - goto egress; + loop_ivs_free (loop); + return; } /* Determine how BIVS are initialised by looking through pre-header @@ -4571,31 +4607,7 @@ strength_reduce (loop, insn_count, flags) if (loop_dump_stream) fprintf (loop_dump_stream, "\n"); -egress: - free (ivs->regs); - { - struct iv_class *iv = ivs->list; - - while (iv) { - struct iv_class *next = iv->next; - struct induction *induction; - struct induction *next_induction; - - for (induction = iv->biv; induction; induction = next_induction) - { - next_induction = induction->next_iv; - free (induction); - } - for (induction = iv->giv; induction; induction = next_induction) - { - next_induction = induction->next_iv; - free (induction); - } - - free (iv); - iv = next; - } - } + loop_ivs_free (loop); if (reg_map) free (reg_map); } |