On Tue, 2018-05-22 at 10:43 +0200, Richard Biener wrote:
> On Mon, 21 May 2018, Jeff Law wrote:
>
> > On 05/18/2018 07:15 AM, David Malcolm wrote:
> > > On Fri, 2018-05-18 at 13:11 +0200, Richard Biener wrote:
> > > > The following adds a simple alloc/free_flag machinery
> > > > allocating
> > > > bits from an int typed pool and applies that to bb->flags and
> > > > edge-
> > > > > flags.
> > > >
> > > > This should allow infrastructure pieces to use egde/bb flags
> > > > temporarily
> > > > without worrying that users might already use it as for example
> > > > BB_VISITED and friends. It converts one clever user to the new
> > > > interface.
> > > >
> > > > The allocation state is per CFG but we could also make it
> > > > global
> > > > or merge the two pools so one allocates a flag that can be used
> > > > for
> > > > bbs and edges at the same time.
> > > >
> > > > Thus - any opinions welcome. I'm mainly targeting cfganal
> > > > algorithms
> > > > where I want to add a few region-based ones that to be
> > > > O(region-size)
> > > > complexity may not use sbitmaps for visited sets because of the
> > > > clearing
> > > > overhead and bitmaps are probably more expensive to use than a
> > > > BB/edge
> > > > flag that needs to be cleared afterwards.
> > > >
> > > > Built on x86_64, otherwise untested.
> > > >
> > > > Any comments?
> > >
> > > Rather than putting alloc/free pairs at the usage sites, how
> > > about an
> > > RAII class? Something like this:
> >
> > Yes, please if at all possible we should be using RAII.
>
> So like the following? (see comments in the hwint.h hunk for
> extra C++ questions...)
>
> I dropped the non-RAII interface - it's very likely never needed.
>
> Better suggestions for placement of auto_flag welcome.
Do you have ideas for other uses? If not, maybe just put it in cfg.h
right in front of auto_edge_flag and auto_bb_flag, for simplicity?
> Thanks,
> Richard.
[...snip...]
The new classes are missing leading comments. I think it's worth
noting that the auto_flag (and thus their subclasses) hold a pointer
into a control_flow_graph instance, but they don't interact with the
garbage collector, so there's an implicit assumption that the auto_flag
instances are short-lived and that the underlying storage is kept alive
some other way (e.g. as cfun is kept alive by cfun being a GC root).
> +class auto_edge_flag : public auto_flag<int>
> +{
> +public:
> + auto_edge_flag (function *fun)
> + : auto_flag (&fun->cfg->edge_flags_allocated) {}
> +};
> +
> +class auto_bb_flag : public auto_flag<int>
> +{
> +public:
> + auto_bb_flag (function *fun)
> + : auto_flag (&fun->cfg->bb_flags_allocated) {}
> +};
> +
> #endif /* GCC_CFG_H */
[...snip...]
Hope this is constructive
Dave