On Fri, Mar 17, 2023 at 08:40:34PM +0100, Jan Hubicka wrote: > > + /* Drop the const attribute from the call type (the pure > > + attribute is not available on types). */ > > + tree fntype = gimple_call_fntype (call); > > + if (fntype && TYPE_READONLY (fntype)) > > + gimple_call_set_fntype > > + (call, build_qualified_type (fntype, (TYPE_QUALS (fntype) > > + & ~TYPE_QUAL_CONST))); > > Sorry, now I am bit confused on why Jakub's fix did not need similar > fixup. The flag is only set during the profiling stage and thus I would > expect it to still run into the problem that VOPs are missing. > Is it only becuase we do not sanity check?
My patch started from this point ignoring all TYPE_READONLY bits on all FUNCTION_TYPE/METHOD_TYPEs, while Richi's patch instead makes it explicit in the IL, TYPE_READONLY is honored as before but it shouldn't show up in any of the gimple_call_fntype types unless it is a direct call to a const function for which we don't have a body. In either case, vops are added on the update_stmt a few lines later. > Here is a testcase that shows the problem: > > include <math.h> > float c; > > __attribute__ ((const)) > float > instrument(float v) > { > return sin (v); > } > __attribute__ ((no_profile_instrument_function,const,noinline)) > float noinstrument (float v) > { > return instrument (v); > } > > m() > { > c+=instrument(c); > if (!__builtin_expect (c,1)) > { > c+=noinstrument (c); > } > c+=instrument(c); > } > main() > { > m(); > } > > Compiling > gcc -O0 t.c -fprofile-arcs -fno-early-inlining --coverage -lm -ftest-coverage > -S ; gcc t.s -ftest-coverage -lm -fprofile-arcs > makes gcov to report 3 executions on instrument while with -O3 it is 2. > > This is because the noinstrument has const flag that is not cleared and > it becoames essentially non-const because it calls instrument that gets > intrumented and partially inlined. I thought tree-profile.cc right now clears const on all const functions with body, or is that !(!node->clone_of || node->decl != node->clone_of->decl) restricting it to instrumented functions only? Jakub