Commit 1288c070 by Richard Henderson Committed by Richard Henderson

flow.c (invalidate_mems_from_set): Split out from ...

        * flow.c (invalidate_mems_from_set): Split out from ...
        (mark_set_1): ... here.
        (try_pre_increment_1): Use it.  Use propagate_block_delete_insn
        instead of turning insn into a NOTE_INSN_DELETED.

From-SVN: r37356
parent 01702459
2000-11-09 Richard Henderson <rth@redhat.com>
* flow.c (invalidate_mems_from_set): Split out from ...
(mark_set_1): ... here.
(try_pre_increment_1): Use it. Use propagate_block_delete_insn
instead of turning insn into a NOTE_INSN_DELETED.
2000-11-10 Joseph S. Myers <jsm28@cam.ac.uk> 2000-11-10 Joseph S. Myers <jsm28@cam.ac.uk>
* extend.texi, invoke.texi: Move documentation of builtin versions * extend.texi, invoke.texi: Move documentation of builtin versions
......
...@@ -408,6 +408,8 @@ static void dump_edge_info PARAMS ((FILE *, edge, int)); ...@@ -408,6 +408,8 @@ static void dump_edge_info PARAMS ((FILE *, edge, int));
static void invalidate_mems_from_autoinc PARAMS ((struct propagate_block_info *, static void invalidate_mems_from_autoinc PARAMS ((struct propagate_block_info *,
rtx)); rtx));
static void invalidate_mems_from_set PARAMS ((struct propagate_block_info *,
rtx));
static void remove_fake_successors PARAMS ((basic_block)); static void remove_fake_successors PARAMS ((basic_block));
static void flow_nodes_print PARAMS ((const char *, const sbitmap, static void flow_nodes_print PARAMS ((const char *, const sbitmap,
FILE *)); FILE *));
...@@ -4352,6 +4354,39 @@ invalidate_mems_from_autoinc (pbi, insn) ...@@ -4352,6 +4354,39 @@ invalidate_mems_from_autoinc (pbi, insn)
} }
} }
/* EXP is either a MEM or a REG. Remove any dependant entries
from pbi->mem_set_list. */
static void
invalidate_mems_from_set (pbi, exp)
struct propagate_block_info *pbi;
rtx exp;
{
rtx temp = pbi->mem_set_list;
rtx prev = NULL_RTX;
rtx next;
while (temp)
{
next = XEXP (temp, 1);
if ((GET_CODE (exp) == MEM
&& output_dependence (XEXP (temp, 0), exp))
|| (GET_CODE (exp) == REG
&& reg_overlap_mentioned_p (exp, XEXP (temp, 0))))
{
/* Splice this entry out of the list. */
if (prev)
XEXP (prev, 1) = next;
else
pbi->mem_set_list = next;
free_EXPR_LIST_node (temp);
}
else
prev = temp;
temp = next;
}
}
/* Process the registers that are set within X. Their bits are set to /* Process the registers that are set within X. Their bits are set to
1 in the regset DEAD, because they are dead prior to this insn. 1 in the regset DEAD, because they are dead prior to this insn.
...@@ -4533,31 +4568,7 @@ mark_set_1 (pbi, code, reg, cond, insn, flags) ...@@ -4533,31 +4568,7 @@ mark_set_1 (pbi, code, reg, cond, insn, flags)
if (optimize && (flags & PROP_SCAN_DEAD_CODE)) if (optimize && (flags & PROP_SCAN_DEAD_CODE))
{ {
if (GET_CODE (reg) == MEM || GET_CODE (reg) == REG) if (GET_CODE (reg) == MEM || GET_CODE (reg) == REG)
{ invalidate_mems_from_set (pbi, reg);
rtx temp = pbi->mem_set_list;
rtx prev = NULL_RTX;
rtx next;
while (temp)
{
next = XEXP (temp, 1);
if ((GET_CODE (reg) == MEM
&& output_dependence (XEXP (temp, 0), reg))
|| (GET_CODE (reg) == REG
&& reg_overlap_mentioned_p (reg, XEXP (temp, 0))))
{
/* Splice this entry out of the list. */
if (prev)
XEXP (prev, 1) = next;
else
pbi->mem_set_list = next;
free_EXPR_LIST_node (temp);
}
else
prev = temp;
temp = next;
}
}
/* If the memory reference had embedded side effects (autoincrement /* If the memory reference had embedded side effects (autoincrement
address modes. Then we may need to kill some entries on the address modes. Then we may need to kill some entries on the
...@@ -5763,22 +5774,24 @@ try_pre_increment_1 (pbi, insn) ...@@ -5763,22 +5774,24 @@ try_pre_increment_1 (pbi, insn)
&& ! dead_or_set_p (y, SET_DEST (x)) && ! dead_or_set_p (y, SET_DEST (x))
&& try_pre_increment (y, SET_DEST (x), amount)) && try_pre_increment (y, SET_DEST (x), amount))
{ {
/* We have found a suitable auto-increment /* We have found a suitable auto-increment and already changed
and already changed insn Y to do it. insn Y to do it. So flush this increment instruction. */
So flush this increment-instruction. */ propagate_block_delete_insn (pbi->bb, insn);
PUT_CODE (insn, NOTE);
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; /* Count a reference to this reg for the increment insn we are
NOTE_SOURCE_FILE (insn) = 0; deleting. When a reg is incremented, spilling it is worse,
/* Count a reference to this reg for the increment so we want to make that less likely. */
insn we are deleting. When a reg is incremented.
spilling it is worse, so we want to make that
less likely. */
if (regno >= FIRST_PSEUDO_REGISTER) if (regno >= FIRST_PSEUDO_REGISTER)
{ {
REG_N_REFS (regno) += (optimize_size ? 1 REG_N_REFS (regno) += (optimize_size ? 1
: pbi->bb->loop_depth + 1); : pbi->bb->loop_depth + 1);
REG_N_SETS (regno)++; REG_N_SETS (regno)++;
} }
/* Flush any remembered memories depending on the value of
the incremented register. */
invalidate_mems_from_set (pbi, SET_DEST (x));
return 1; return 1;
} }
return 0; return 0;
......
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