From: Krzysztof Parzyszek Date: Tue, 16 Apr 2019 16:05:07 +0000 (+0000) Subject: [Hexagon] Remove indeterministic traversal order X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=286083a5c3bf144080fd4475ffff061f0f9a7bdc;p=llvm [Hexagon] Remove indeterministic traversal order Patch by Sergei Larin. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358505 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Hexagon/HexagonCommonGEP.cpp b/lib/Target/Hexagon/HexagonCommonGEP.cpp index 77b51ce2ade..cf1b0a0f7da 100644 --- a/lib/Target/Hexagon/HexagonCommonGEP.cpp +++ b/lib/Target/Hexagon/HexagonCommonGEP.cpp @@ -11,6 +11,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/GraphTraits.h" +#include "llvm/ADT/SetVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/Analysis/LoopInfo.h" @@ -70,7 +71,7 @@ namespace { using NodeToValueMap = std::map; using NodeVect = std::vector; using NodeChildrenMap = std::map; - using UseSet = std::set; + using UseSet = SetVector; using NodeToUsesMap = std::map; // Numbering map for gep nodes. Used to keep track of ordering for @@ -979,15 +980,13 @@ void HexagonCommonGEP::separateChainForNode(GepNode *Node, Use *U, assert(UF != Uses.end()); UseSet &Us = UF->second; UseSet NewUs; - for (UseSet::iterator I = Us.begin(); I != Us.end(); ) { - User *S = (*I)->getUser(); - UseSet::iterator Nx = std::next(I); - if (S == R) { - NewUs.insert(*I); - Us.erase(I); - } - I = Nx; + for (Use *U : Us) { + if (U->getUser() == R) + NewUs.insert(U); } + for (Use *U : NewUs) + Us.remove(U); // erase takes an iterator. + if (Us.empty()) { Node->Flags &= ~GepNode::Used; Uses.erase(UF);