static int cc0_live;
/* During propagate_block, this contains a list of all the MEMs we are
- tracking for dead store elimination.
-
- ?!? Note we leak memory by not free-ing items on this list. We need to
- write some generic routines to operate on memory lists since cse, gcse,
- loop, sched, flow and possibly other passes all need to do basically the
- same operations on these lists. */
+ tracking for dead store elimination. */
static rtx mem_set_list;
live = ALLOCA_REG_SET ();
cc0_live = 0;
- mem_set_list = NULL_RTX;
if (flags & PROP_REG_INFO)
{
flags, insn);
/* Calls also clobber memory. */
- mem_set_list = NULL_RTX;
+ free_EXPR_LIST_list (&mem_set_list);
}
/* Update OLD for the registers used or set. */
FREE_REG_SET (dead);
FREE_REG_SET (live);
+ free_EXPR_LIST_list (&mem_set_list);
}
\f
/* Return 1 if X (the body of an insn, or part of it) is just dead stores
{
rtx temp = mem_set_list;
rtx prev = NULL_RTX;
+ rtx next;
while (temp)
{
+ next = XEXP (temp, 1);
if (reg_overlap_mentioned_p (XEXP (note, 0), XEXP (temp, 0)))
{
/* Splice temp out of list. */
if (prev)
- XEXP (prev, 1) = XEXP (temp, 1);
+ XEXP (prev, 1) = next;
else
- mem_set_list = XEXP (temp, 1);
+ mem_set_list = next;
+ free_EXPR_LIST_node (temp);
}
else
prev = temp;
- temp = XEXP (temp, 1);
+ temp = next;
}
}
}
{
rtx temp = 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
{
/* Splice this entry out of the list. */
if (prev)
- XEXP (prev, 1) = XEXP (temp, 1);
+ XEXP (prev, 1) = next;
else
- mem_set_list = XEXP (temp, 1);
+ mem_set_list = next;
+ free_EXPR_LIST_node (temp);
}
else
prev = temp;
- temp = XEXP (temp, 1);
+ temp = next;
}
}
{
rtx temp = mem_set_list;
rtx prev = NULL_RTX;
+ rtx next;
while (temp)
{
+ next = XEXP (temp, 1);
if (anti_dependence (XEXP (temp, 0), x))
{
/* Splice temp out of the list. */
if (prev)
- XEXP (prev, 1) = XEXP (temp, 1);
+ XEXP (prev, 1) = next;
else
- mem_set_list = XEXP (temp, 1);
+ mem_set_list = next;
+ free_EXPR_LIST_node (temp);
}
else
prev = temp;
- temp = XEXP (temp, 1);
+ temp = next;
}
}
So for now, just clear the memory set list and mark any regs
we can find in ASM_OPERANDS as used. */
if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
- mem_set_list = NULL_RTX;
+ free_EXPR_LIST_list (&mem_set_list);
/* For all ASM_OPERANDS, we must traverse the vector of input operands.
We can not just fall through here since then we would be confused