https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106912
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Also, the other PR is about a function being made const late when it previously wasn't, while in this case it is being made non-const after it has been const before. /* Drop pure/const flags from instrumented functions. */ if (profile_arc_flag || flag_test_coverage) FOR_EACH_DEFINED_FUNCTION (node) { if (!gimple_has_body_p (node->decl) || !(!node->clone_of || node->decl != node->clone_of->decl)) continue; /* Don't profile functions produced for builtin stuff. */ if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION) continue; node->set_const_flag (false, false); node->set_pure_flag (false, false); } just looks completely wrong to me for const, which unlike pure attribute can be on both function types and on function declarations. If we want calls to const functions to actually not be treated as const when profiling, it can be only done by ignoring const everywhere if profile_arc_flag || flag_test_coverage. It even can't be just ignored for direct calls to defined functions, because calls can be indirect at first, without vops, and then fndecl propagated and turned into direct. Or for IPA they can be defined in other TUs.