mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-24 10:04:27 +08:00
rtlanal.c (insn_dependant_p, [...]): New.
* rtlanal.c (insn_dependant_p, insn_dependant_p_1): New. * rtl.h (insn_dependant_p): Declare it. * loop.c (strength_reduce): Use it. From-SVN: r34010
This commit is contained in:
parent
14806ff142
commit
a8393d5dc2
@ -1,3 +1,9 @@
|
||||
2000-05-18 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* rtlanal.c (insn_dependant_p, insn_dependant_p_1): New.
|
||||
* rtl.h (insn_dependant_p): Declare it.
|
||||
* loop.c (strength_reduce): Use it.
|
||||
|
||||
2000-05-18 Alexandre Oliva <aoliva@cygnus.com>
|
||||
|
||||
* config/mn10300/mn10300.c (expand_prologue, expand_epilogue):
|
||||
|
@ -4119,10 +4119,9 @@ strength_reduce (loop, insn_count, flags)
|
||||
|
||||
for (next = NEXT_INSN (dominator); ; next = NEXT_INSN (next))
|
||||
{
|
||||
if ((INSN_P (next)
|
||||
&& (reg_mentioned_p (giv, PATTERN (next))
|
||||
|| reg_set_p (bl2->biv->src_reg, next)))
|
||||
|| GET_CODE (next) == JUMP_INSN)
|
||||
if (GET_CODE (next) == JUMP_INSN
|
||||
|| (INSN_P (next)
|
||||
&& insn_dependant_p (giv_insn, next)))
|
||||
break;
|
||||
#ifdef HAVE_cc0
|
||||
if (! INSN_P (next)
|
||||
|
@ -1212,6 +1212,7 @@ extern int modified_between_p PARAMS ((rtx, rtx, rtx));
|
||||
extern int no_labels_between_p PARAMS ((rtx, rtx));
|
||||
extern int no_jumps_between_p PARAMS ((rtx, rtx));
|
||||
extern int modified_in_p PARAMS ((rtx, rtx));
|
||||
extern int insn_dependant_p PARAMS ((rtx, rtx));
|
||||
extern int reg_set_p PARAMS ((rtx, rtx));
|
||||
extern rtx single_set PARAMS ((rtx));
|
||||
extern int multiple_sets PARAMS ((rtx));
|
||||
|
@ -26,6 +26,7 @@ Boston, MA 02111-1307, USA. */
|
||||
|
||||
static int rtx_addr_can_trap_p PARAMS ((rtx));
|
||||
static void reg_set_p_1 PARAMS ((rtx, rtx, void *));
|
||||
static void insn_dependant_p_1 PARAMS ((rtx, rtx, void *));
|
||||
static void reg_set_last_1 PARAMS ((rtx, rtx, void *));
|
||||
|
||||
|
||||
@ -687,6 +688,45 @@ modified_in_p (x, insn)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return true if anything in insn X is (anti,output,true) dependant on
|
||||
anything in insn Y. */
|
||||
|
||||
int
|
||||
insn_dependant_p (x, y)
|
||||
rtx x, y;
|
||||
{
|
||||
rtx tmp;
|
||||
|
||||
if (! INSN_P (x) || ! INSN_P (y))
|
||||
abort ();
|
||||
|
||||
tmp = PATTERN (y);
|
||||
note_stores (PATTERN (x), insn_dependant_p_1, &tmp);
|
||||
if (tmp == NULL_RTX)
|
||||
return 1;
|
||||
|
||||
tmp = PATTERN (x);
|
||||
note_stores (PATTERN (y), insn_dependant_p_1, &tmp);
|
||||
if (tmp == NULL_RTX)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* A helper routine for insn_dependant_p called through note_stores. */
|
||||
|
||||
static void
|
||||
insn_dependant_p_1 (x, pat, data)
|
||||
rtx x;
|
||||
rtx pat ATTRIBUTE_UNUSED;
|
||||
void *data;
|
||||
{
|
||||
rtx * pinsn = (rtx *) data;
|
||||
|
||||
if (*pinsn && reg_mentioned_p (x, *pinsn))
|
||||
*pinsn = NULL_RTX;
|
||||
}
|
||||
|
||||
/* Given an INSN, return a SET expression if this insn has only a single SET.
|
||||
It may also have CLOBBERs, USEs, or SET whose output
|
||||
|
Loading…
Reference in New Issue
Block a user