On Thu, Sep 10, 2026 at 11:56 AM Richard Sandiford
<[email protected]> wrote:
>
> Richard Biener <[email protected]> writes:
> > On Wed, Sep 9, 2026 at 3:49 PM Richard Sandiford
> > <[email protected]> wrote:
> >> I suppose the underlying problem is that recog_data shouldn't be a
> >> global variable. Copying and restoring it is a hack to get around
> >> that design decision. And that hack was borderline acceptable while
> >> the copy was simple.
> >>
> >> IMO the ideal fix would be to remove the global state and handle the
> >> cache in a different way. But that would be way too invasive. Even
> >> changing recog_data to a pointer would probably be too much churn
> >> (although I wouldn't be against it personally).
> >>
> >> So perhaps we should adopt a hack used elsewhere and make recog_data
> >> a macro that [deferences a] pointer (either global, or in crtl or
> >> something). By default the pointer points at a global recog_data_d,
> >> but backends can use an RAII class or direct pointer assignment
> >> to temporarily switch it to a temporary recog_data_d instead.
> >>
> >> It's all a bit icky, but maybe more acceptable than copying auto_vecs?
> >
> > I think this is a sound approach, not too far off existing practice in GCC.
>
> Thanks.
>
> > It sounds like this could be done separately, weeding out the save/restore
> > of recog_data_d.
> >
> > An alternative to the macro would be making it a singleton instance of
> > a class that converts to recog_data but allows the "flip" via some
> > push/pop but internally manages a stack of pointers to recog_data.
>
> It sounds like that would work for something that is accessed by pointer,
> since we could overload operator-> and operator*. But "." would always
> refer to members of the recog_data object itself, so I suppose the class
> would need to provide (say) an is_asm member that converts to bool and
> accepts bool assignments, but internally uses the top of the stack.
I originally thought of using
operator recog_data& () { return *m_recog_data; }
but I see that is not considered when seeing recog_data.<x> though.
But then you can of course stack this with a macro that does the
dereferencing.
Richard.
>
> Richard