aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1998-11-17 09:14:33 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1998-11-17 09:14:33 +0000
commite398aa80628423ec3d52bca83864a8fc908641c1 (patch)
tree45fcd7990e357333c692392379fd67acb255bbc9
parentbcd91ba75333ac033300f7b2f2e7d93b30a779f1 (diff)
downloadgcc-e398aa80628423ec3d52bca83864a8fc908641c1.zip
gcc-e398aa80628423ec3d52bca83864a8fc908641c1.tar.gz
gcc-e398aa80628423ec3d52bca83864a8fc908641c1.tar.bz2
* flow.c (insn_dead_p): New argument NOTES. Changed all callers.
From-SVN: r23680
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/flow.c49
2 files changed, 41 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e895e95..521f3e84 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+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>
* rs6000.c (output_mi_thunk): Improve test for local branch.
diff --git a/gcc/flow.c b/gcc/flow.c
index fa9ffa0..51be372 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -271,7 +271,7 @@ static int set_noop_p PROTO((rtx));
static int noop_move_p PROTO((rtx));
static void record_volatile_insns PROTO((rtx));
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 void mark_set_regs PROTO((regset, regset, rtx,
rtx, regset));
@@ -1749,7 +1749,7 @@ propagate_block (old, first, last, final, significant, bnum)
register int i;
rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
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! */
&& ! INSN_VOLATILE (insn));
int libcall_is_dead
@@ -1935,16 +1935,40 @@ propagate_block (old, first, last, final, significant, bnum)
(SET expressions whose destinations are registers dead 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
-insn_dead_p (x, needed, call_ok)
+insn_dead_p (x, needed, call_ok, notes)
rtx x;
regset needed;
int call_ok;
+ rtx notes ATTRIBUTE_UNUSED;
{
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,
see if that register's altered value will be live. */
@@ -2015,7 +2039,7 @@ insn_dead_p (x, needed, call_ok)
for (i--; i >= 0; i--)
if (GET_CODE (XVECEXP (x, 0, i)) != CLOBBER
&& 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 1;
@@ -2062,6 +2086,7 @@ libcall_dead_p (x, needed, note, insn)
if (GET_CODE (r) == REG)
{
rtx call = XEXP (note, 0);
+ rtx call_pat;
register int i;
/* Find the call insn. */
@@ -2075,12 +2100,12 @@ libcall_dead_p (x, needed, note, insn)
/* See if the hard reg holding the value is dead.
If this is a PARALLEL, find the call within it. */
- call = PATTERN (call);
- if (GET_CODE (call) == PARALLEL)
+ call_pat = PATTERN (call);
+ if (GET_CODE (call_pat) == PARALLEL)
{
- for (i = XVECLEN (call, 0) - 1; i >= 0; i--)
- if (GET_CODE (XVECEXP (call, 0, i)) == SET
- && GET_CODE (SET_SRC (XVECEXP (call, 0, i))) == CALL)
+ for (i = XVECLEN (call_pat, 0) - 1; i >= 0; i--)
+ if (GET_CODE (XVECEXP (call_pat, 0, i)) == SET
+ && GET_CODE (SET_SRC (XVECEXP (call_pat, 0, i))) == CALL)
break;
/* This may be a library call that is returning a value
@@ -2089,10 +2114,10 @@ libcall_dead_p (x, needed, note, insn)
if (i < 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;