Commit e398aa80 by J"orn Rennecke Committed by Joern Rennecke

* flow.c (insn_dead_p): New argument NOTES. Changed all callers.

From-SVN: r23680
parent bcd91ba7
Tue Nov 17 17:13:53 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
* flow.c (insn_dead_p): New argument NOTES. Changed all callers.
Mon Nov 16 17:56:07 1998 David Edelsohn <edelsohn@mhpcc.edu> Mon Nov 16 17:56:07 1998 David Edelsohn <edelsohn@mhpcc.edu>
* rs6000.c (output_mi_thunk): Improve test for local branch. * rs6000.c (output_mi_thunk): Improve test for local branch.
......
...@@ -271,7 +271,7 @@ static int set_noop_p PROTO((rtx)); ...@@ -271,7 +271,7 @@ static int set_noop_p PROTO((rtx));
static int noop_move_p PROTO((rtx)); static int noop_move_p PROTO((rtx));
static void record_volatile_insns PROTO((rtx)); static void record_volatile_insns PROTO((rtx));
static void mark_regs_live_at_end PROTO((regset)); static void mark_regs_live_at_end PROTO((regset));
static int insn_dead_p PROTO((rtx, regset, int)); static int insn_dead_p PROTO((rtx, regset, int, rtx));
static int libcall_dead_p PROTO((rtx, regset, rtx, rtx)); static int libcall_dead_p PROTO((rtx, regset, rtx, rtx));
static void mark_set_regs PROTO((regset, regset, rtx, static void mark_set_regs PROTO((regset, regset, rtx,
rtx, regset)); rtx, regset));
...@@ -1749,7 +1749,7 @@ propagate_block (old, first, last, final, significant, bnum) ...@@ -1749,7 +1749,7 @@ propagate_block (old, first, last, final, significant, bnum)
register int i; register int i;
rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX); rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
int insn_is_dead int insn_is_dead
= (insn_dead_p (PATTERN (insn), old, 0) = (insn_dead_p (PATTERN (insn), old, 0, REG_NOTES (insn))
/* Don't delete something that refers to volatile storage! */ /* Don't delete something that refers to volatile storage! */
&& ! INSN_VOLATILE (insn)); && ! INSN_VOLATILE (insn));
int libcall_is_dead int libcall_is_dead
...@@ -1935,16 +1935,40 @@ propagate_block (old, first, last, final, significant, bnum) ...@@ -1935,16 +1935,40 @@ propagate_block (old, first, last, final, significant, bnum)
(SET expressions whose destinations are registers dead after the insn). (SET expressions whose destinations are registers dead after the insn).
NEEDED is the regset that says which regs are alive after the insn. NEEDED is the regset that says which regs are alive after the insn.
Unless CALL_OK is non-zero, an insn is needed if it contains a CALL. */ Unless CALL_OK is non-zero, an insn is needed if it contains a CALL.
If X is the entire body of an insn, NOTES contains the reg notes
pertaining to the insn. */
static int static int
insn_dead_p (x, needed, call_ok) insn_dead_p (x, needed, call_ok, notes)
rtx x; rtx x;
regset needed; regset needed;
int call_ok; int call_ok;
rtx notes ATTRIBUTE_UNUSED;
{ {
enum rtx_code code = GET_CODE (x); enum rtx_code code = GET_CODE (x);
#ifdef AUTO_INC_DEC
/* If flow is invoked after reload, we must take existing AUTO_INC
expresions into account. */
if (reload_completed)
{
for ( ; notes; notes = XEXP (notes, 1))
{
if (REG_NOTE_KIND (notes) == REG_INC)
{
int regno = REGNO (XEXP (notes, 0));
/* Don't delete insns to set global regs. */
if ((regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
|| REGNO_REG_SET_P (needed, regno))
return 0;
}
}
}
#endif
/* If setting something that's a reg or part of one, /* If setting something that's a reg or part of one,
see if that register's altered value will be live. */ see if that register's altered value will be live. */
...@@ -2015,7 +2039,7 @@ insn_dead_p (x, needed, call_ok) ...@@ -2015,7 +2039,7 @@ insn_dead_p (x, needed, call_ok)
for (i--; i >= 0; i--) for (i--; i >= 0; i--)
if (GET_CODE (XVECEXP (x, 0, i)) != CLOBBER if (GET_CODE (XVECEXP (x, 0, i)) != CLOBBER
&& GET_CODE (XVECEXP (x, 0, i)) != USE && GET_CODE (XVECEXP (x, 0, i)) != USE
&& ! insn_dead_p (XVECEXP (x, 0, i), needed, call_ok)) && ! insn_dead_p (XVECEXP (x, 0, i), needed, call_ok, NULL_RTX))
return 0; return 0;
return 1; return 1;
...@@ -2062,6 +2086,7 @@ libcall_dead_p (x, needed, note, insn) ...@@ -2062,6 +2086,7 @@ libcall_dead_p (x, needed, note, insn)
if (GET_CODE (r) == REG) if (GET_CODE (r) == REG)
{ {
rtx call = XEXP (note, 0); rtx call = XEXP (note, 0);
rtx call_pat;
register int i; register int i;
/* Find the call insn. */ /* Find the call insn. */
...@@ -2075,12 +2100,12 @@ libcall_dead_p (x, needed, note, insn) ...@@ -2075,12 +2100,12 @@ libcall_dead_p (x, needed, note, insn)
/* See if the hard reg holding the value is dead. /* See if the hard reg holding the value is dead.
If this is a PARALLEL, find the call within it. */ If this is a PARALLEL, find the call within it. */
call = PATTERN (call); call_pat = PATTERN (call);
if (GET_CODE (call) == PARALLEL) if (GET_CODE (call_pat) == PARALLEL)
{ {
for (i = XVECLEN (call, 0) - 1; i >= 0; i--) for (i = XVECLEN (call_pat, 0) - 1; i >= 0; i--)
if (GET_CODE (XVECEXP (call, 0, i)) == SET if (GET_CODE (XVECEXP (call_pat, 0, i)) == SET
&& GET_CODE (SET_SRC (XVECEXP (call, 0, i))) == CALL) && GET_CODE (SET_SRC (XVECEXP (call_pat, 0, i))) == CALL)
break; break;
/* This may be a library call that is returning a value /* This may be a library call that is returning a value
...@@ -2089,10 +2114,10 @@ libcall_dead_p (x, needed, note, insn) ...@@ -2089,10 +2114,10 @@ libcall_dead_p (x, needed, note, insn)
if (i < 0) if (i < 0)
return 0; return 0;
call = XVECEXP (call, 0, i); call_pat = XVECEXP (call_pat, 0, i);
} }
return insn_dead_p (call, needed, 1); return insn_dead_p (call_pat, needed, 1, REG_NOTES (call));
} }
} }
return 1; return 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment