[llvm-dev] RFC: Making a common successor/predecessor interface
David Blaikie via llvm-dev
llvm-dev at lists.llvm.org
Mon Mar 9 16:16:54 PDT 2020
On Mon, Mar 9, 2020 at 3:57 PM Alina Sbirlea via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> As part of an ongoing work to extend the GraphDiff (this models a CFG
> view), I came across the need to have a common interface for accessing
> successors/predecessors in various IR units, such that a type such as
> `typename NodeT::succ_iterator` could be used in templated code.
I /think/ this can be achieved with the existing API by using
"decltype(succ_begin(std::declval<NodeT>()))" instead of the typename
you've got as an example (it looks like succ_begin is the extension point -
but the problem you're having is naming its return type? decltype would be
one option) - you could make a trait wrapper around that or the like if you
need this type name in a bunch of disparate places (where they can't share
Would that suffice? are there other aspects of your use case that don't
line up well with the existing non-member/overload API?
> In particular, the need arose for BasicBlocks, MachineBasicBlocks,
> VPBlockBase and clang::CFGBlock.
> The least invasive change seemed to be to use the interface already being
> used in MachineBasicBlock and clang::CFGBlock, and:
> (1) update BasicBlock to use this instead of the "global" `succ_iterator`
> in IR/CFG.h
> (2) add the same interfaces in VPBlockBase as simple wrappers over
> existing Successors/Predecessors vectors.
> I've been working on a few patches to make this happen, but I'd like the
> community's thoughts on this before deep-diving into code reviews.
> For some concrete view of what the changes look like, I uploaded two
> preliminary patches:
> (1) part 1: D75881 <https://reviews.llvm.org/D75881>: Introducing class
> specific iterators
> (2) D75882 <https://reviews.llvm.org/D75882>
> (1) part 2: pending: Cleaning up existing usages; example replacement:
> `succ_begin(BB)` with `BB->succ_begin()`.
> (1) part3/4: pending: Add class specific iterators to `Instruction` and
> clean up existing usages just as for `BasicBlock`.
> I split the above (1) just to clarify what interfaces are added versus the
> NFC cleanups that follow. But it could be done just as well in a single
> I welcome comments on this, and if there's something I missed explaining
> please let me know.
> Thank you,
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev