The core get and set routines move to the Instruction class. These
routines are only valid to call on instructions which are terminators.
The iterator and *generic* range based access move to CFG.h where all
the other generic successor and predecessor access lives. While moving
the iterator here, simplify it using the iterator utilities LLVM
provides and updates coding style as much as reasonable. The APIs remain
pointer-heavy when they could better use references, and retain the odd
behavior of operator* and operator-> that is common in LLVM
iterators. Adjusting this API, if desired, should be a follow-up step.
Non-generic range iteration is added for the two instructions where
there is an especially easy mechanism and where there was code
attempting to use the range accessor from a specific subclass:
indirectbr and br. In both cases, the successors are contiguous
operands and can be easily iterated via the operand list.
This is the first major patch in removing the TerminatorInst type from
the IR's instruction type hierarchy. The steps that I have planned out
(although there are likely to be some minor ones) look like the
following:
- Remove the few remaining APIs of TerminatorInst, replacing them with existing predicates in Instruction or adding new ones if needed.
- Replacing isa<TerminatorInst> and dyn_cast<TerminatorInst> with appropriate uses of isTerminator.
- Replacing TerminatorInst in parameter APIs with just Instruction and potentially an assert on isTerminator.
- Replacing TerminatorInst in the return of the remaining APIs (not updated above) with Instruction. Most notably, the getTerminator method.
- Removing TerminotarInst type completely.
- Making InvokeInst and CallInst derive from a common base class w/ most of the logic currently in CallInst.
- Replacing uses of CallSite everywhere with the common base class.
These are likely to be quite mechanical, and I suspect are probably best done
with post-commit review. Please lete me know if there are specific
patches in this series you'd like to do pre-commit review on and I'll
happily break them out. Naturally, if any end up with significant
questions in them, I'll post a review for that.
Maybe this should be a non-member friend, and works with const and non-const versions of compatible type?