https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103200
--- Comment #3 from Jan Hubicka <hubicka at gcc dot gnu.org> --- Sorry, I managed to include last minute change that was wrong. Currently modref does not track if function is deterministic so we can not detect looping pure/consts. I am testing. diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c index 72006251f29..4da5284c94f 100644 --- a/gcc/ipa-modref.c +++ b/gcc/ipa-modref.c @@ -2790,9 +2790,10 @@ analyze_function (function *f, bool ipa) if (!ipa && flag_ipa_pure_const) { - if (!summary->stores->every_base && !summary->stores->bases) + if (!summary->stores->every_base && !summary->stores->bases + && !summary->side_effects) { - if (!summary->loads->every_base && !summary->loads->bases) + if (!summary->loads->every_base && !summary->loads->bases fixup_cfg = ipa_make_function_const (cgraph_node::get (current_function_decl), summary->side_effects, true); @@ -4380,7 +4381,8 @@ modref_propagate_in_scc (cgraph_node *component_node) modref_summary_lto *summary_lto = summaries_lto ? summaries_lto->get (cur) : NULL; - if (summary && !summary->stores->every_base && !summary->stores->bases) + if (summary && !summary->stores->every_base && !summary->stores->bases + && !summary->side_effects) { if (!summary->loads->every_base && !summary->loads->bases) pureconst |= ipa_make_function_const @@ -4390,7 +4392,7 @@ modref_propagate_in_scc (cgraph_node *component_node) (cur, summary->side_effects, false); } if (summary_lto && !summary_lto->stores->every_base - && !summary_lto->stores->bases) + && !summary_lto->stores->bases && !summary->side_effects) { if (!summary_lto->loads->every_base && !summary_lto->loads->bases) pureconst |= ipa_make_function_const