loop.h (struct loop_movables): New.
* loop.h (struct loop_movables): New. (LOOP_MOVABLES): New. (struct loop_info): Add movables field. * loop.c (struct movables): Delete. Replace all uses with struct loop_movables. (the_movables): Delete. Replace all uses with movables field in loop_info. (loop_movables_add, loop_movables_free): New functions. (scan_loop): Use xmalloc instead of alloca for movables. Call loop_movables_free. From-SVN: r38573
This commit is contained in:
parent
685efa5454
commit
6ec9201068
@ -1,5 +1,18 @@
|
|||||||
2001-01-01 Michael Hayes <mhayes@redhat.com>
|
2001-01-01 Michael Hayes <mhayes@redhat.com>
|
||||||
|
|
||||||
|
* loop.h (struct loop_movables): New.
|
||||||
|
(LOOP_MOVABLES): New.
|
||||||
|
(struct loop_info): Add movables field.
|
||||||
|
* loop.c (struct movables): Delete. Replace all uses
|
||||||
|
with struct loop_movables.
|
||||||
|
(the_movables): Delete. Replace all uses with movables
|
||||||
|
field in loop_info.
|
||||||
|
(loop_movables_add, loop_movables_free): New functions.
|
||||||
|
(scan_loop): Use xmalloc instead of alloca for movables.
|
||||||
|
Call loop_movables_free.
|
||||||
|
|
||||||
|
2001-01-01 Michael Hayes <mhayes@redhat.com>
|
||||||
|
|
||||||
* loop.c (debug_loops): New.
|
* loop.c (debug_loops): New.
|
||||||
|
|
||||||
2000-12-31 Philip Blundell <philb@gnu.org>
|
2000-12-31 Philip Blundell <philb@gnu.org>
|
||||||
|
92
gcc/loop.c
92
gcc/loop.c
@ -132,17 +132,6 @@ struct movable
|
|||||||
struct movable *next;
|
struct movable *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct movables
|
|
||||||
{
|
|
||||||
/* Head of movable chain. */
|
|
||||||
struct movable *head;
|
|
||||||
/* Last movable in chain. */
|
|
||||||
struct movable *last;
|
|
||||||
/* Number of movables in the loop. */
|
|
||||||
int num;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct movables the_movables;
|
|
||||||
|
|
||||||
FILE *loop_dump_stream;
|
FILE *loop_dump_stream;
|
||||||
|
|
||||||
@ -170,15 +159,19 @@ static void replace_call_address PARAMS ((rtx, rtx, rtx));
|
|||||||
#endif
|
#endif
|
||||||
static rtx skip_consec_insns PARAMS ((rtx, int));
|
static rtx skip_consec_insns PARAMS ((rtx, int));
|
||||||
static int libcall_benefit PARAMS ((rtx));
|
static int libcall_benefit PARAMS ((rtx));
|
||||||
static void ignore_some_movables PARAMS ((struct movables *));
|
static void ignore_some_movables PARAMS ((struct loop_movables *));
|
||||||
static void force_movables PARAMS ((struct movables *));
|
static void force_movables PARAMS ((struct loop_movables *));
|
||||||
static void combine_movables PARAMS ((struct movables *, struct loop_regs *));
|
static void combine_movables PARAMS ((struct loop_movables *,
|
||||||
static int regs_match_p PARAMS ((rtx, rtx, struct movables *));
|
struct loop_regs *));
|
||||||
static int rtx_equal_for_loop_p PARAMS ((rtx, rtx, struct movables *,
|
static int regs_match_p PARAMS ((rtx, rtx, struct loop_movables *));
|
||||||
|
static int rtx_equal_for_loop_p PARAMS ((rtx, rtx, struct loop_movables *,
|
||||||
struct loop_regs *));
|
struct loop_regs *));
|
||||||
static void add_label_notes PARAMS ((rtx, rtx));
|
static void add_label_notes PARAMS ((rtx, rtx));
|
||||||
static void move_movables PARAMS ((struct loop *loop, struct movables *,
|
static void move_movables PARAMS ((struct loop *loop, struct loop_movables *,
|
||||||
int, int));
|
int, int));
|
||||||
|
static void loop_movables_add PARAMS((struct loop_movables *,
|
||||||
|
struct movable *));
|
||||||
|
static void loop_movables_free PARAMS((struct loop_movables *));
|
||||||
static int count_nonfixed_reads PARAMS ((const struct loop *, rtx));
|
static int count_nonfixed_reads PARAMS ((const struct loop *, rtx));
|
||||||
static void strength_reduce PARAMS ((struct loop *, int, int));
|
static void strength_reduce PARAMS ((struct loop *, int, int));
|
||||||
static void find_single_use_in_loop PARAMS ((rtx, rtx, varray_type));
|
static void find_single_use_in_loop PARAMS ((rtx, rtx, varray_type));
|
||||||
@ -517,7 +510,7 @@ scan_loop (loop, flags)
|
|||||||
/* The SET from an insn, if it is the only SET in the insn. */
|
/* The SET from an insn, if it is the only SET in the insn. */
|
||||||
rtx set, set1;
|
rtx set, set1;
|
||||||
/* Chain describing insns movable in current loop. */
|
/* Chain describing insns movable in current loop. */
|
||||||
struct movables *movables = &the_movables;
|
struct loop_movables *movables = LOOP_MOVABLES (loop);
|
||||||
/* Ratio of extra register life span we can justify
|
/* Ratio of extra register life span we can justify
|
||||||
for saving an instruction. More if loop doesn't call subroutines
|
for saving an instruction. More if loop doesn't call subroutines
|
||||||
since in that case saving an insn makes more difference
|
since in that case saving an insn makes more difference
|
||||||
@ -809,7 +802,7 @@ scan_loop (loop, flags)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
m = (struct movable *) alloca (sizeof (struct movable));
|
m = (struct movable *) xmalloc (sizeof (struct movable));
|
||||||
m->next = 0;
|
m->next = 0;
|
||||||
m->insn = p;
|
m->insn = p;
|
||||||
m->set_src = src;
|
m->set_src = src;
|
||||||
@ -841,11 +834,7 @@ scan_loop (loop, flags)
|
|||||||
m->savings += libcall_benefit (p);
|
m->savings += libcall_benefit (p);
|
||||||
VARRAY_INT (regs->set_in_loop, regno) = move_insn ? -2 : -1;
|
VARRAY_INT (regs->set_in_loop, regno) = move_insn ? -2 : -1;
|
||||||
/* Add M to the end of the chain MOVABLES. */
|
/* Add M to the end of the chain MOVABLES. */
|
||||||
if (movables->head == 0)
|
loop_movables_add (movables, m);
|
||||||
movables->head = m;
|
|
||||||
else
|
|
||||||
movables->last->next = m;
|
|
||||||
movables->last = m;
|
|
||||||
|
|
||||||
if (m->consec > 0)
|
if (m->consec > 0)
|
||||||
{
|
{
|
||||||
@ -950,11 +939,7 @@ scan_loop (loop, flags)
|
|||||||
m->savings = 1;
|
m->savings = 1;
|
||||||
VARRAY_INT (regs->set_in_loop, regno) = -1;
|
VARRAY_INT (regs->set_in_loop, regno) = -1;
|
||||||
/* Add M to the end of the chain MOVABLES. */
|
/* Add M to the end of the chain MOVABLES. */
|
||||||
if (movables->head == 0)
|
loop_movables_add (movables, m);
|
||||||
movables->head = m;
|
|
||||||
else
|
|
||||||
movables->last->next = m;
|
|
||||||
movables->last = m;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1057,6 +1042,10 @@ scan_loop (loop, flags)
|
|||||||
delete_insn (update_end);
|
delete_insn (update_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* The movable information is required for strength reduction. */
|
||||||
|
loop_movables_free (movables);
|
||||||
|
|
||||||
VARRAY_FREE (regs->single_usage);
|
VARRAY_FREE (regs->single_usage);
|
||||||
VARRAY_FREE (regs->set_in_loop);
|
VARRAY_FREE (regs->set_in_loop);
|
||||||
VARRAY_FREE (regs->n_times_set);
|
VARRAY_FREE (regs->n_times_set);
|
||||||
@ -1256,7 +1245,7 @@ skip_consec_insns (insn, count)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
ignore_some_movables (movables)
|
ignore_some_movables (movables)
|
||||||
struct movables *movables;
|
struct loop_movables *movables;
|
||||||
{
|
{
|
||||||
register struct movable *m, *m1;
|
register struct movable *m, *m1;
|
||||||
|
|
||||||
@ -1288,7 +1277,7 @@ ignore_some_movables (movables)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
force_movables (movables)
|
force_movables (movables)
|
||||||
struct movables *movables;
|
struct loop_movables *movables;
|
||||||
{
|
{
|
||||||
register struct movable *m, *m1;
|
register struct movable *m, *m1;
|
||||||
for (m1 = movables->head; m1; m1 = m1->next)
|
for (m1 = movables->head; m1; m1 = m1->next)
|
||||||
@ -1327,7 +1316,7 @@ force_movables (movables)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
combine_movables (movables, regs)
|
combine_movables (movables, regs)
|
||||||
struct movables *movables;
|
struct loop_movables *movables;
|
||||||
struct loop_regs *regs;
|
struct loop_regs *regs;
|
||||||
{
|
{
|
||||||
register struct movable *m;
|
register struct movable *m;
|
||||||
@ -1447,7 +1436,7 @@ combine_movables (movables, regs)
|
|||||||
static int
|
static int
|
||||||
regs_match_p (x, y, movables)
|
regs_match_p (x, y, movables)
|
||||||
rtx x, y;
|
rtx x, y;
|
||||||
struct movables *movables;
|
struct loop_movables *movables;
|
||||||
{
|
{
|
||||||
unsigned int xn = REGNO (x);
|
unsigned int xn = REGNO (x);
|
||||||
unsigned int yn = REGNO (y);
|
unsigned int yn = REGNO (y);
|
||||||
@ -1476,7 +1465,7 @@ regs_match_p (x, y, movables)
|
|||||||
static int
|
static int
|
||||||
rtx_equal_for_loop_p (x, y, movables, regs)
|
rtx_equal_for_loop_p (x, y, movables, regs)
|
||||||
rtx x, y;
|
rtx x, y;
|
||||||
struct movables *movables;
|
struct loop_movables *movables;
|
||||||
struct loop_regs *regs;
|
struct loop_regs *regs;
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
@ -1633,7 +1622,7 @@ add_label_notes (x, insns)
|
|||||||
static void
|
static void
|
||||||
move_movables (loop, movables, threshold, insn_count)
|
move_movables (loop, movables, threshold, insn_count)
|
||||||
struct loop *loop;
|
struct loop *loop;
|
||||||
struct movables *movables;
|
struct loop_movables *movables;
|
||||||
int threshold;
|
int threshold;
|
||||||
int insn_count;
|
int insn_count;
|
||||||
{
|
{
|
||||||
@ -2136,6 +2125,34 @@ move_movables (loop, movables, threshold, insn_count)
|
|||||||
free (reg_map);
|
free (reg_map);
|
||||||
free (already_moved);
|
free (already_moved);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
loop_movables_add (movables, m)
|
||||||
|
struct loop_movables *movables;
|
||||||
|
struct movable *m;
|
||||||
|
{
|
||||||
|
if (movables->head == 0)
|
||||||
|
movables->head = m;
|
||||||
|
else
|
||||||
|
movables->last->next = m;
|
||||||
|
movables->last = m;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
loop_movables_free (movables)
|
||||||
|
struct loop_movables *movables;
|
||||||
|
{
|
||||||
|
struct movable *m;
|
||||||
|
struct movable *m_next;
|
||||||
|
|
||||||
|
for (m = movables->head; m; m = m_next)
|
||||||
|
{
|
||||||
|
m_next = m->next;
|
||||||
|
free (m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* Scan X and replace the address of any MEM in it with ADDR.
|
/* Scan X and replace the address of any MEM in it with ADDR.
|
||||||
@ -6020,8 +6037,9 @@ simplify_giv_expr (loop, x, ext_val, benefit)
|
|||||||
if (loop_invariant_p (loop, x) == 1)
|
if (loop_invariant_p (loop, x) == 1)
|
||||||
{
|
{
|
||||||
struct movable *m;
|
struct movable *m;
|
||||||
|
struct loop_movables *movables = LOOP_MOVABLES (loop);
|
||||||
|
|
||||||
for (m = the_movables.head; m; m = m->next)
|
for (m = movables->head; m; m = m->next)
|
||||||
if (rtx_equal_p (x, m->set_dest))
|
if (rtx_equal_p (x, m->set_dest))
|
||||||
{
|
{
|
||||||
/* Ok, we found a match. Substitute and simplify. */
|
/* Ok, we found a match. Substitute and simplify. */
|
||||||
@ -7317,7 +7335,7 @@ check_dbra_loop (loop, insn_count)
|
|||||||
&& ! loop_info->has_volatile
|
&& ! loop_info->has_volatile
|
||||||
&& reversible_mem_store
|
&& reversible_mem_store
|
||||||
&& (bl->giv_count + bl->biv_count + loop_info->num_mem_sets
|
&& (bl->giv_count + bl->biv_count + loop_info->num_mem_sets
|
||||||
+ the_movables.num + compare_and_branch == insn_count)
|
+ LOOP_MOVABLES (loop)->num + compare_and_branch == insn_count)
|
||||||
&& (bl == ivs->loop_iv_list && bl->next == 0))
|
&& (bl == ivs->loop_iv_list && bl->next == 0))
|
||||||
|| no_use_except_counting)
|
|| no_use_except_counting)
|
||||||
{
|
{
|
||||||
|
21
gcc/loop.h
21
gcc/loop.h
@ -28,6 +28,9 @@ Boston, MA 02111-1307, USA. */
|
|||||||
/* Get the loop info pointer of a loop. */
|
/* Get the loop info pointer of a loop. */
|
||||||
#define LOOP_INFO(LOOP) ((struct loop_info *) (LOOP)->aux)
|
#define LOOP_INFO(LOOP) ((struct loop_info *) (LOOP)->aux)
|
||||||
|
|
||||||
|
/* Get a pointer to the loop movables structure. */
|
||||||
|
#define LOOP_MOVABLES(LOOP) (&LOOP_INFO (loop)->movables)
|
||||||
|
|
||||||
/* Get a pointer to the loop registers structure. */
|
/* Get a pointer to the loop registers structure. */
|
||||||
#define LOOP_REGS(LOOP) (&LOOP_INFO (loop)->regs)
|
#define LOOP_REGS(LOOP) (&LOOP_INFO (loop)->regs)
|
||||||
|
|
||||||
@ -236,12 +239,28 @@ struct loop_regs
|
|||||||
int multiple_uses;
|
int multiple_uses;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct loop_movables
|
||||||
|
{
|
||||||
|
/* Head of movable chain. */
|
||||||
|
struct movable *head;
|
||||||
|
/* Last movable in chain. */
|
||||||
|
struct movable *last;
|
||||||
|
/* Number of movables in the loop. */
|
||||||
|
int num;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Information pertaining to a loop. */
|
/* Information pertaining to a loop. */
|
||||||
|
|
||||||
struct loop_info
|
struct loop_info
|
||||||
{
|
{
|
||||||
/* Nonzero if there is a subroutine call in the current loop. */
|
/* Nonzero if there is a subroutine call in the current loop. */
|
||||||
int has_call;
|
int has_call;
|
||||||
|
/* Nonzero if there is a libcall in the current loop. */
|
||||||
|
int has_libcall;
|
||||||
|
/* Nonzero if there is a non constant call in the current loop. */
|
||||||
|
int has_nonconst_call;
|
||||||
/* Nonzero if there is a volatile memory reference in the current
|
/* Nonzero if there is a volatile memory reference in the current
|
||||||
loop. */
|
loop. */
|
||||||
int has_volatile;
|
int has_volatile;
|
||||||
@ -304,6 +323,8 @@ struct loop_info
|
|||||||
int num_mem_sets;
|
int num_mem_sets;
|
||||||
/* The insn where the first of these was found. */
|
/* The insn where the first of these was found. */
|
||||||
rtx first_loop_store_insn;
|
rtx first_loop_store_insn;
|
||||||
|
/* The chain of movable insns in loop. */
|
||||||
|
struct loop_movables movables;
|
||||||
/* The registers used the in loop. */
|
/* The registers used the in loop. */
|
||||||
struct loop_regs regs;
|
struct loop_regs regs;
|
||||||
/* The induction variable information in loop. */
|
/* The induction variable information in loop. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user