summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2014-03-26 21:21:53 +0000
committerLang Hames <lhames@gmail.com>2014-03-26 21:21:53 +0000
commit5391ac47598a4c6e54b59af84885350deaf95b5e (patch)
tree2fc324e75248a5136652ddc1d9e8ed9467bd1f7f
parentc35c4b3ddb4279460fb9f970fce9ba286e0b3be9 (diff)
downloadbcm5719-llvm-5391ac47598a4c6e54b59af84885350deaf95b5e.tar.gz
bcm5719-llvm-5391ac47598a4c6e54b59af84885350deaf95b5e.zip
Simplify PBQP graph removeAdjEdgeId implementation.
llvm-svn: 204857
-rw-r--r--llvm/include/llvm/CodeGen/PBQP/Graph.h22
1 files changed, 10 insertions, 12 deletions
diff --git a/llvm/include/llvm/CodeGen/PBQP/Graph.h b/llvm/include/llvm/CodeGen/PBQP/Graph.h
index 030197f174f..e414c225518 100644
--- a/llvm/include/llvm/CodeGen/PBQP/Graph.h
+++ b/llvm/include/llvm/CodeGen/PBQP/Graph.h
@@ -67,16 +67,16 @@ namespace PBQP {
return Idx;
}
- // If a swap is performed, returns the new EdgeId that must be
- // updated, otherwise returns invalidEdgeId().
- EdgeId removeAdjEdgeId(AdjEdgeIdx Idx) {
- EdgeId EIdToUpdate = Graph::invalidEdgeId();
- if (Idx < AdjEdgeIds.size() - 1) {
- std::swap(AdjEdgeIds[Idx], AdjEdgeIds.back());
- EIdToUpdate = AdjEdgeIds[Idx];
- }
+ void removeAdjEdgeId(Graph &G, NodeId ThisNId, AdjEdgeIdx Idx) {
+ // Swap-and-pop for fast removal.
+ // 1) Update the adj index of the edge currently at back().
+ // 2) Swap Edge at Idx with back().
+ // 3) pop_back()
+ // If Idx == size() - 1 then the updateAdjEdgeIdx and swap are
+ // redundant, but both operations are cheap.
+ G.getEdge(AdjEdgeIds.back()).updateAdjEdgeIdx(ThisNId, Idx);
+ std::swap(AdjEdgeIds[Idx], AdjEdgeIds.back());
AdjEdgeIds.pop_back();
- return EIdToUpdate;
}
const AdjEdgeList& getAdjEdgeIds() const { return AdjEdgeIds; }
@@ -138,9 +138,7 @@ namespace PBQP {
assert(ThisEdgeAdjIdxs[NIdx] != NodeEntry::getInvalidAdjEdgeIdx() &&
"Edge not connected to NIds[NIdx].");
NodeEntry &N = G.getNode(NIds[NIdx]);
- EdgeId EIdToUpdate = N.removeAdjEdgeId(ThisEdgeAdjIdxs[NIdx]);
- if (EIdToUpdate != Graph::invalidEdgeId())
- G.getEdge(EIdToUpdate).updateAdjEdgeIdx(NIds[NIdx], ThisEdgeAdjIdxs[NIdx]);
+ N.removeAdjEdgeId(G, NIds[NIdx], ThisEdgeAdjIdxs[NIdx]);
ThisEdgeAdjIdxs[NIdx] = NodeEntry::getInvalidAdjEdgeIdx();
}
OpenPOWER on IntegriCloud