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

Reply via email to