It seems the only reason we have PHI_ARG_IMM_USE_NODE (and a struct
ssa_use_operand_d) in a phi node argument (struct phi_arg_d) is *just*
so we can iterate over the uses and hand back use_operand_p.
I'm talking, in particular, about:
struct phi_arg_d GTY(())
{
/* imm_use MUST be the first element in struct because we do some
pointer arithmetic with it. See phi_arg_index_from_use. */
struct ssa_use_operand_d imm_use;
}
It's not actually usfeul as an immediate use, since it doesn't actually
point to an immediate use, and because you can get the argument itself
from PHI_ARG_DEF.
This wastes like 20-30 bytes per phi argument on 64 bit platforms.
If use_operand_p were a structure, or we returned a structure in the
iterator instead of the pointer, we could do without it, because we
could make them up on the fly.
Unless you have a good reason not to do this, i'd rather change the
iterators to return structures (The first thing almost *everyone* does
is call USE_FROM_PTR anyway :P), and remove the imm_use member of phi
arg.
This should save us a noticeable amount of memory.
--Dan