> On Wed, 8 Jan 2025, Jan Hubicka wrote:
> 
> > > On Tue, 10 Dec 2024, Jan Hubicka wrote:
> > > 
> > > > Hi,
> > > > int:
> > > > struct foo
> > > > {
> > > >   int a;
> > > >   void bar() const;
> > > >   ~foo()
> > > >   {
> > > >     if (a != 42)
> > > >       __builtin_abort ();
> > > >   }
> > > > };
> > > > __attribute__ ((noinline))
> > > > void test(const struct foo a)
> > > > {
> > > >         int b = a.a;
> > > >         a.bar();
> > > >         if (a.a != b)
> > > >           __builtin_printf ("optimize me away");
> > > > }
> > > > struct foo is passed by invisible reference. As discussed in the PR,
> > > > since it is declared const, it can not change before function test
> > > > returns.  This makes it possible to optimize out the conditional.
> > > 
> > > Doesn't this break the case where 'a' is declared mutable?
> > Hmm, good point.  declaring a mutable definitely lets me to chagne value
> > in bar.  I am adding Jason and Jonatan to CC.
> > We could probably special case types containing mutable if such code is
> > valid?
> 
> I think there should be a way to figure out already, otherwise a global
> 
> const foo x;
> 
> would fault if put into .rodata.  But maybe classes with mutable
> members are never POD and thus always runtime initialized?
C++ frontend has

/* Nonzero means that this type contains a mutable member.  */
#define CLASSTYPE_HAS_MUTABLE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_mutable)
#define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE))

but it is not exported to middle-end.

However still this is quite special situation since the object is passed
using invisible reference, so I wonder if in this sicuation a copy is
constructed so the callee can possibly overwrite the muttable fields?

Honza

Reply via email to