diff options
author | Lang Hames <lhames@gmail.com> | 2014-03-26 21:21:53 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-03-26 21:21:53 +0000 |
commit | 5391ac47598a4c6e54b59af84885350deaf95b5e (patch) | |
tree | 2fc324e75248a5136652ddc1d9e8ed9467bd1f7f | |
parent | c35c4b3ddb4279460fb9f970fce9ba286e0b3be9 (diff) | |
download | bcm5719-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.h | 22 |
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(); } |