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?