Simplify PBQP graph removeAdjEdgeId implementation.
authorLang Hames <lhames@gmail.com>
Wed, 26 Mar 2014 21:21:53 +0000 (21:21 +0000)
committerLang Hames <lhames@gmail.com>
Wed, 26 Mar 2014 21:21:53 +0000 (21:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204857 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/PBQP/Graph.h

index 030197f174f48c98bf9cabd566cc7447d51e82e4..e414c2255182fa47aebd1323f7bb9e46dba7af26 100644 (file)
@@ -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();
       }