1 //===- llvm/Analysis/Interval.h - Interval Class Declaration ----*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains the declaration of the Interval class, which
10 // represents a set of CFG nodes and is a portion of an interval partition.
12 // Intervals have some interesting and useful properties, including the
14 // 1. The header node of an interval dominates all of the elements of the
17 //===----------------------------------------------------------------------===//
19 #ifndef LLVM_ANALYSIS_INTERVAL_H
20 #define LLVM_ANALYSIS_INTERVAL_H
22 #include "llvm/ADT/GraphTraits.h"
30 //===----------------------------------------------------------------------===//
32 /// Interval Class - An Interval is a set of nodes defined such that every node
33 /// in the interval has all of its predecessors in the interval (except for the
37 /// HeaderNode - The header BasicBlock, which dominates all BasicBlocks in this
38 /// interval. Also, any loops in this interval must go through the HeaderNode.
40 BasicBlock
*HeaderNode
;
43 using succ_iterator
= std::vector
<BasicBlock
*>::iterator
;
44 using pred_iterator
= std::vector
<BasicBlock
*>::iterator
;
45 using node_iterator
= std::vector
<BasicBlock
*>::iterator
;
47 inline Interval(BasicBlock
*Header
) : HeaderNode(Header
) {
48 Nodes
.push_back(Header
);
51 inline BasicBlock
*getHeaderNode() const { return HeaderNode
; }
53 /// Nodes - The basic blocks in this interval.
54 std::vector
<BasicBlock
*> Nodes
;
56 /// Successors - List of BasicBlocks that are reachable directly from nodes in
57 /// this interval, but are not in the interval themselves.
58 /// These nodes necessarily must be header nodes for other intervals.
59 std::vector
<BasicBlock
*> Successors
;
61 /// Predecessors - List of BasicBlocks that have this Interval's header block
62 /// as one of their successors.
63 std::vector
<BasicBlock
*> Predecessors
;
65 /// contains - Find out if a basic block is in this interval
66 inline bool contains(BasicBlock
*BB
) const {
67 for (BasicBlock
*Node
: Nodes
)
71 // I don't want the dependency on <algorithm>
72 //return find(Nodes.begin(), Nodes.end(), BB) != Nodes.end();
75 /// isSuccessor - find out if a basic block is a successor of this Interval
76 inline bool isSuccessor(BasicBlock
*BB
) const {
77 for (BasicBlock
*Successor
: Successors
)
81 // I don't want the dependency on <algorithm>
82 //return find(Successors.begin(), Successors.end(), BB) != Successors.end();
85 /// Equality operator. It is only valid to compare two intervals from the
86 /// same partition, because of this, all we have to check is the header node
88 inline bool operator==(const Interval
&I
) const {
89 return HeaderNode
== I
.HeaderNode
;
92 /// isLoop - Find out if there is a back edge in this interval...
95 /// print - Show contents in human readable format...
96 void print(raw_ostream
&O
) const;
99 /// succ_begin/succ_end - define methods so that Intervals may be used
100 /// just like BasicBlocks can with the succ_* functions, and *::succ_iterator.
102 inline Interval::succ_iterator
succ_begin(Interval
*I
) {
103 return I
->Successors
.begin();
105 inline Interval::succ_iterator
succ_end(Interval
*I
) {
106 return I
->Successors
.end();
109 /// pred_begin/pred_end - define methods so that Intervals may be used
110 /// just like BasicBlocks can with the pred_* functions, and *::pred_iterator.
112 inline Interval::pred_iterator
pred_begin(Interval
*I
) {
113 return I
->Predecessors
.begin();
115 inline Interval::pred_iterator
pred_end(Interval
*I
) {
116 return I
->Predecessors
.end();
119 template <> struct GraphTraits
<Interval
*> {
120 using NodeRef
= Interval
*;
121 using ChildIteratorType
= Interval::succ_iterator
;
123 static NodeRef
getEntryNode(Interval
*I
) { return I
; }
125 /// nodes_iterator/begin/end - Allow iteration over all nodes in the graph
126 static ChildIteratorType
child_begin(NodeRef N
) { return succ_begin(N
); }
127 static ChildIteratorType
child_end(NodeRef N
) { return succ_end(N
); }
130 template <> struct GraphTraits
<Inverse
<Interval
*>> {
131 using NodeRef
= Interval
*;
132 using ChildIteratorType
= Interval::pred_iterator
;
134 static NodeRef
getEntryNode(Inverse
<Interval
*> G
) { return G
.Graph
; }
135 static ChildIteratorType
child_begin(NodeRef N
) { return pred_begin(N
); }
136 static ChildIteratorType
child_end(NodeRef N
) { return pred_end(N
); }
139 } // end namespace llvm
141 #endif // LLVM_ANALYSIS_INTERVAL_H