https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78140
Jan Hubicka <hubicka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |kuganv at linaro dot org
--- Comment #19 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
Looking into detailed mem reports we have increase in jump functions size:
ipa-prop.c:4701 (ipa_read_node_info) 0: 0.0% 47378288:
2.4% 161144168: 6.7% 20010080: 11.8% 1238962
to
ipa-prop.c:5047 (ipa_read_node_info) 0: 0.0% 74541136:
3.1% 567308480: 17.9% 13645376: 7.0% 1238212
So while we read about same number of jump functions, the memory usage almost
triples. The reason is that jump function got a lot bigger now:
/* Information about zero/non-zero bits. */
struct ipa_bits bits;
/* Information about value range, containing valid data only when vr_known is
true. */
value_range m_vr;
bool vr_known;
where
/* Information about zero/non-zero bits. */
struct GTY(()) ipa_bits
{
/* The propagated value. */
widest_int value;
/* Mask corresponding to the value.
Similar to ccp_lattice_t, if xth bit of mask is 0,
implies xth bit of value is constant. */
widest_int mask;
/* True if jump function is known. */
bool known;
};
/* Info about value ranges. */
struct GTY(()) ipa_vr
{
/* The data fields below are valid only if known is true. */
bool known;
enum value_range_type type;
wide_int min;
wide_int max;
};
I think two wide_ints and two widest_ints are major offenders. We need to find
a way to avoid allocating them for all nodes. Perhaps implement sharing of
equal ipa_bits and ipa_vr records?