mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
[LCG] Switch the parent SCC tracking from a SmallSetVector to
a SmallPtrSet. Currently, there is no need for stable iteration in this dimension, and I now thing there won't need to be going forward. If this is ever re-introduced in any form, it needs to not be a SetVector based solution because removal cannot be linear. There will be many SCCs with large numbers of parents. When encountering these, the incremental SCC update for intra-SCC edge removal was quadratic due to linear removal (kind of). I'm really hoping we can avoid having an ordering property here at all though... git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207091 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9e65c46345
commit
bcb39a444b
@ -215,7 +215,7 @@ public:
|
|||||||
friend class LazyCallGraph;
|
friend class LazyCallGraph;
|
||||||
friend class LazyCallGraph::Node;
|
friend class LazyCallGraph::Node;
|
||||||
|
|
||||||
SmallSetVector<SCC *, 1> ParentSCCs;
|
SmallPtrSet<SCC *, 1> ParentSCCs;
|
||||||
SmallVector<Node *, 1> Nodes;
|
SmallVector<Node *, 1> Nodes;
|
||||||
|
|
||||||
SCC() {}
|
SCC() {}
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
typedef SmallVectorImpl<Node *>::const_iterator iterator;
|
typedef SmallVectorImpl<Node *>::const_iterator iterator;
|
||||||
typedef pointee_iterator<SmallSetVector<SCC *, 1>::const_iterator> parent_iterator;
|
typedef pointee_iterator<SmallPtrSet<SCC *, 1>::const_iterator> parent_iterator;
|
||||||
|
|
||||||
iterator begin() const { return Nodes.begin(); }
|
iterator begin() const { return Nodes.begin(); }
|
||||||
iterator end() const { return Nodes.end(); }
|
iterator end() const { return Nodes.end(); }
|
||||||
|
@ -157,7 +157,7 @@ void LazyCallGraph::SCC::removeEdge(LazyCallGraph &G, Function &Caller,
|
|||||||
// the caller no longer a parent of the callee. Walk the other call edges
|
// the caller no longer a parent of the callee. Walk the other call edges
|
||||||
// in the caller to tell.
|
// in the caller to tell.
|
||||||
if (!HasOtherCallToCalleeC) {
|
if (!HasOtherCallToCalleeC) {
|
||||||
bool Removed = CalleeC.ParentSCCs.remove(this);
|
bool Removed = CalleeC.ParentSCCs.erase(this);
|
||||||
(void)Removed;
|
(void)Removed;
|
||||||
assert(Removed &&
|
assert(Removed &&
|
||||||
"Did not find the caller SCC in the callee SCC's parent list!");
|
"Did not find the caller SCC in the callee SCC's parent list!");
|
||||||
@ -239,7 +239,7 @@ LazyCallGraph::SCC::removeInternalEdge(LazyCallGraph &G, Node &Caller,
|
|||||||
// However, we do need to remove this SCC from its SCC's parent set.
|
// However, we do need to remove this SCC from its SCC's parent set.
|
||||||
SCC &ChildSCC = *G.SCCMap.lookup(&ChildN);
|
SCC &ChildSCC = *G.SCCMap.lookup(&ChildN);
|
||||||
if (&ChildSCC != this) {
|
if (&ChildSCC != this) {
|
||||||
ChildSCC.ParentSCCs.remove(this);
|
ChildSCC.ParentSCCs.erase(this);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user