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