annotate llvm/lib/Support/IntervalMap.cpp @ 181:df311c476dd5

CreateIdentifierInfo in ParseCbC (not yet worked)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 31 May 2020 12:30:11 +0900
parents 0572611fdcc8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- lib/Support/IntervalMap.cpp - A sorted interval map ----------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file implements the few non-templated functions in IntervalMap.
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #include "llvm/ADT/IntervalMap.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
14 #include <cassert>
150
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 namespace llvm {
anatofuz
parents:
diff changeset
17 namespace IntervalMapImpl {
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 void Path::replaceRoot(void *Root, unsigned Size, IdxPair Offsets) {
anatofuz
parents:
diff changeset
20 assert(!path.empty() && "Can't replace missing root");
anatofuz
parents:
diff changeset
21 path.front() = Entry(Root, Size, Offsets.first);
anatofuz
parents:
diff changeset
22 path.insert(path.begin() + 1, Entry(subtree(0), Offsets.second));
anatofuz
parents:
diff changeset
23 }
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 NodeRef Path::getLeftSibling(unsigned Level) const {
anatofuz
parents:
diff changeset
26 // The root has no siblings.
anatofuz
parents:
diff changeset
27 if (Level == 0)
anatofuz
parents:
diff changeset
28 return NodeRef();
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 // Go up the tree until we can go left.
anatofuz
parents:
diff changeset
31 unsigned l = Level - 1;
anatofuz
parents:
diff changeset
32 while (l && path[l].offset == 0)
anatofuz
parents:
diff changeset
33 --l;
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 // We can't go left.
anatofuz
parents:
diff changeset
36 if (path[l].offset == 0)
anatofuz
parents:
diff changeset
37 return NodeRef();
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 // NR is the subtree containing our left sibling.
anatofuz
parents:
diff changeset
40 NodeRef NR = path[l].subtree(path[l].offset - 1);
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 // Keep right all the way down.
anatofuz
parents:
diff changeset
43 for (++l; l != Level; ++l)
anatofuz
parents:
diff changeset
44 NR = NR.subtree(NR.size() - 1);
anatofuz
parents:
diff changeset
45 return NR;
anatofuz
parents:
diff changeset
46 }
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 void Path::moveLeft(unsigned Level) {
anatofuz
parents:
diff changeset
49 assert(Level != 0 && "Cannot move the root node");
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 // Go up the tree until we can go left.
anatofuz
parents:
diff changeset
52 unsigned l = 0;
anatofuz
parents:
diff changeset
53 if (valid()) {
anatofuz
parents:
diff changeset
54 l = Level - 1;
anatofuz
parents:
diff changeset
55 while (path[l].offset == 0) {
anatofuz
parents:
diff changeset
56 assert(l != 0 && "Cannot move beyond begin()");
anatofuz
parents:
diff changeset
57 --l;
anatofuz
parents:
diff changeset
58 }
anatofuz
parents:
diff changeset
59 } else if (height() < Level)
anatofuz
parents:
diff changeset
60 // end() may have created a height=0 path.
anatofuz
parents:
diff changeset
61 path.resize(Level + 1, Entry(nullptr, 0, 0));
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 // NR is the subtree containing our left sibling.
anatofuz
parents:
diff changeset
64 --path[l].offset;
anatofuz
parents:
diff changeset
65 NodeRef NR = subtree(l);
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 // Get the rightmost node in the subtree.
anatofuz
parents:
diff changeset
68 for (++l; l != Level; ++l) {
anatofuz
parents:
diff changeset
69 path[l] = Entry(NR, NR.size() - 1);
anatofuz
parents:
diff changeset
70 NR = NR.subtree(NR.size() - 1);
anatofuz
parents:
diff changeset
71 }
anatofuz
parents:
diff changeset
72 path[l] = Entry(NR, NR.size() - 1);
anatofuz
parents:
diff changeset
73 }
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 NodeRef Path::getRightSibling(unsigned Level) const {
anatofuz
parents:
diff changeset
76 // The root has no siblings.
anatofuz
parents:
diff changeset
77 if (Level == 0)
anatofuz
parents:
diff changeset
78 return NodeRef();
anatofuz
parents:
diff changeset
79
anatofuz
parents:
diff changeset
80 // Go up the tree until we can go right.
anatofuz
parents:
diff changeset
81 unsigned l = Level - 1;
anatofuz
parents:
diff changeset
82 while (l && atLastEntry(l))
anatofuz
parents:
diff changeset
83 --l;
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 // We can't go right.
anatofuz
parents:
diff changeset
86 if (atLastEntry(l))
anatofuz
parents:
diff changeset
87 return NodeRef();
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 // NR is the subtree containing our right sibling.
anatofuz
parents:
diff changeset
90 NodeRef NR = path[l].subtree(path[l].offset + 1);
anatofuz
parents:
diff changeset
91
anatofuz
parents:
diff changeset
92 // Keep left all the way down.
anatofuz
parents:
diff changeset
93 for (++l; l != Level; ++l)
anatofuz
parents:
diff changeset
94 NR = NR.subtree(0);
anatofuz
parents:
diff changeset
95 return NR;
anatofuz
parents:
diff changeset
96 }
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 void Path::moveRight(unsigned Level) {
anatofuz
parents:
diff changeset
99 assert(Level != 0 && "Cannot move the root node");
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 // Go up the tree until we can go right.
anatofuz
parents:
diff changeset
102 unsigned l = Level - 1;
anatofuz
parents:
diff changeset
103 while (l && atLastEntry(l))
anatofuz
parents:
diff changeset
104 --l;
anatofuz
parents:
diff changeset
105
anatofuz
parents:
diff changeset
106 // NR is the subtree containing our right sibling. If we hit end(), we have
anatofuz
parents:
diff changeset
107 // offset(0) == node(0).size().
anatofuz
parents:
diff changeset
108 if (++path[l].offset == path[l].size)
anatofuz
parents:
diff changeset
109 return;
anatofuz
parents:
diff changeset
110 NodeRef NR = subtree(l);
anatofuz
parents:
diff changeset
111
anatofuz
parents:
diff changeset
112 for (++l; l != Level; ++l) {
anatofuz
parents:
diff changeset
113 path[l] = Entry(NR, 0);
anatofuz
parents:
diff changeset
114 NR = NR.subtree(0);
anatofuz
parents:
diff changeset
115 }
anatofuz
parents:
diff changeset
116 path[l] = Entry(NR, 0);
anatofuz
parents:
diff changeset
117 }
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 IdxPair distribute(unsigned Nodes, unsigned Elements, unsigned Capacity,
anatofuz
parents:
diff changeset
121 const unsigned *CurSize, unsigned NewSize[],
anatofuz
parents:
diff changeset
122 unsigned Position, bool Grow) {
anatofuz
parents:
diff changeset
123 assert(Elements + Grow <= Nodes * Capacity && "Not enough room for elements");
anatofuz
parents:
diff changeset
124 assert(Position <= Elements && "Invalid position");
anatofuz
parents:
diff changeset
125 if (!Nodes)
anatofuz
parents:
diff changeset
126 return IdxPair();
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 // Trivial algorithm: left-leaning even distribution.
anatofuz
parents:
diff changeset
129 const unsigned PerNode = (Elements + Grow) / Nodes;
anatofuz
parents:
diff changeset
130 const unsigned Extra = (Elements + Grow) % Nodes;
anatofuz
parents:
diff changeset
131 IdxPair PosPair = IdxPair(Nodes, 0);
anatofuz
parents:
diff changeset
132 unsigned Sum = 0;
anatofuz
parents:
diff changeset
133 for (unsigned n = 0; n != Nodes; ++n) {
anatofuz
parents:
diff changeset
134 Sum += NewSize[n] = PerNode + (n < Extra);
anatofuz
parents:
diff changeset
135 if (PosPair.first == Nodes && Sum > Position)
anatofuz
parents:
diff changeset
136 PosPair = IdxPair(n, Position - (Sum - NewSize[n]));
anatofuz
parents:
diff changeset
137 }
anatofuz
parents:
diff changeset
138 assert(Sum == Elements + Grow && "Bad distribution sum");
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140 // Subtract the Grow element that was added.
anatofuz
parents:
diff changeset
141 if (Grow) {
anatofuz
parents:
diff changeset
142 assert(PosPair.first < Nodes && "Bad algebra");
anatofuz
parents:
diff changeset
143 assert(NewSize[PosPair.first] && "Too few elements to need Grow");
anatofuz
parents:
diff changeset
144 --NewSize[PosPair.first];
anatofuz
parents:
diff changeset
145 }
anatofuz
parents:
diff changeset
146
anatofuz
parents:
diff changeset
147 #ifndef NDEBUG
anatofuz
parents:
diff changeset
148 Sum = 0;
anatofuz
parents:
diff changeset
149 for (unsigned n = 0; n != Nodes; ++n) {
anatofuz
parents:
diff changeset
150 assert(NewSize[n] <= Capacity && "Overallocated node");
anatofuz
parents:
diff changeset
151 Sum += NewSize[n];
anatofuz
parents:
diff changeset
152 }
anatofuz
parents:
diff changeset
153 assert(Sum == Elements && "Bad distribution sum");
anatofuz
parents:
diff changeset
154 #endif
anatofuz
parents:
diff changeset
155
anatofuz
parents:
diff changeset
156 return PosPair;
anatofuz
parents:
diff changeset
157 }
anatofuz
parents:
diff changeset
158
anatofuz
parents:
diff changeset
159 } // namespace IntervalMapImpl
anatofuz
parents:
diff changeset
160 } // namespace llvm
anatofuz
parents:
diff changeset
161