32#ifndef LLVM_ANALYSIS_INTERVALITERATOR_H
33#define LLVM_ANALYSIS_INTERVALITERATOR_H
72 Int->Nodes.push_back(BB);
86template<
class NodeTy,
class OrigContainer_t,
class GT = GraphTraits<NodeTy *>,
87 class IGT = GraphTraits<Inverse<NodeTy *>>>
89 std::vector<std::pair<Interval *, typename Interval::succ_iterator>> IntStack;
90 std::set<BasicBlock *> Visited;
91 OrigContainer_t *OrigContainer;
102 if (!ProcessInterval(&M->front())) {
109 OrigContainer(x.OrigContainer), IOwnMem(x.IOwnMem) {
122 while (!IntStack.empty()) {
129 return IntStack == x.IntStack;
139 assert(!IntStack.empty() &&
"Attempting to use interval iterator at end!");
143 Interval::succ_iterator &SuccIt = IntStack.back().second,
144 EndIt =
succ_end(IntStack.back().first);
145 while (SuccIt != EndIt) {
148 if (
Done)
return *
this;
152 if (IOwnMem)
delete IntStack.back().first;
156 }
while (!IntStack.empty());
175 bool ProcessInterval(NodeTy *
Node) {
177 if (!Visited.insert(Header).second)
183 for (
typename GT::ChildIteratorType
I = GT::child_begin(
Node),
184 E = GT::child_end(
Node);
I !=
E; ++
I)
205 if (Visited.count(NodeHeader)) {
206 if (
Int->contains(NodeHeader)) {
209 if (!
Int->isSuccessor(NodeHeader))
210 Int->Successors.push_back(NodeHeader);
213 for (
typename IGT::ChildIteratorType
I = IGT::child_begin(
Node),
214 E = IGT::child_end(
Node);
I !=
E; ++
I) {
215 if (!
Int->contains(*
I)) {
216 if (!
Int->isSuccessor(NodeHeader))
217 Int->Successors.push_back(NodeHeader);
225 Visited.insert(NodeHeader);
227 if (
Int->isSuccessor(NodeHeader)) {
234 for (
typename GT::ChildIteratorType It = GT::child_begin(
Node),
246 bool DeleteInts =
true) {
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the little GraphTraits<X> template class that should be specialized by classes that...
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
std::pair< uint64_t, uint64_t > Interval
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LLVM Basic Block Representation.
const Interval * operator->() const
IntervalIterator & operator++()
std::forward_iterator_tag iterator_category
IntervalIterator(IntervalIterator &&x)
IntervalIterator(Function *M, bool OwnMemory)
IntervalIterator(IntervalPartition &IP, bool OwnMemory)
IntervalIterator operator++(int)
IntervalIterator()=default
const Interval * operator*() const
bool operator!=(const IntervalIterator &x) const
bool operator==(const IntervalIterator &x) const
Interval * getRootInterval()
Interval * getBlockInterval(BasicBlock *BB)
Interval Class - An Interval is a set of nodes defined such that every node in the interval has all o...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ BasicBlock
Various leaf nodes.
This is an optimization pass for GlobalISel generic memory operations.
BasicBlock * getNodeHeader(BasicBlock *BB)
Interval::succ_iterator succ_end(Interval *I)
function_interval_iterator intervals_end(Function *)
IntervalIterator< Interval, IntervalPartition > interval_part_interval_iterator
Interval::succ_iterator succ_begin(Interval *I)
succ_begin/succ_end - define methods so that Intervals may be used just like BasicBlocks can with the...
void append_range(Container &C, Range &&R)
Wrapper function to append a range to a container.
BasicBlock * getSourceGraphNode(Function *, BasicBlock *BB)
function_interval_iterator intervals_begin(Function *F, bool DeleteInts=true)
void erase_value(Container &C, ValueType V)
Wrapper function to remove a value from a container:
void addNodeToInterval(Interval *Int, BasicBlock *BB)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
IntervalIterator< BasicBlock, Function > function_interval_iterator