From: Gerolf Hoflehner Date: Wed, 26 Jun 2019 21:44:37 +0000 (+0000) Subject: [SCCP] Fix non-deterministic uselists of return values (DenseMap -> MapVector) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d54648fc09ae6db2913b464851e15cc370a60df6;p=llvm [SCCP] Fix non-deterministic uselists of return values (DenseMap -> MapVector) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364482 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index 1d0354bd708..4093e50ce89 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -20,6 +20,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" +#include "llvm/ADT/MapVector.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallPtrSet.h" @@ -209,11 +210,11 @@ class SCCPSolver : public InstVisitor { /// TrackedRetVals - If we are tracking arguments into and the return /// value out of a function, it will have an entry in this map, indicating /// what the known return value for the function is. - DenseMap TrackedRetVals; + MapVector TrackedRetVals; /// TrackedMultipleRetVals - Same as TrackedRetVals, but used for functions /// that return multiple values. - DenseMap, LatticeVal> TrackedMultipleRetVals; + MapVector, LatticeVal> TrackedMultipleRetVals; /// MRVFunctionsTracked - Each function in TrackedMultipleRetVals is /// represented here for efficient lookup. @@ -371,7 +372,7 @@ public: } /// getTrackedRetVals - Get the inferred return value map. - const DenseMap &getTrackedRetVals() { + const MapVector &getTrackedRetVals() { return TrackedRetVals; } @@ -837,7 +838,7 @@ void SCCPSolver::visitReturnInst(ReturnInst &I) { // If we are tracking the return value of this function, merge it in. if (!TrackedRetVals.empty() && !ResultOp->getType()->isStructTy()) { - DenseMap::iterator TFRVI = + MapVector::iterator TFRVI = TrackedRetVals.find(F); if (TFRVI != TrackedRetVals.end()) { mergeInValue(TFRVI->second, F, getValueState(ResultOp)); @@ -1351,7 +1352,7 @@ CallOverdefined: mergeInValue(getStructValueState(I, i), I, TrackedMultipleRetVals[std::make_pair(F, i)]); } else { - DenseMap::iterator TFRVI = TrackedRetVals.find(F); + MapVector::iterator TFRVI = TrackedRetVals.find(F); if (TFRVI == TrackedRetVals.end()) goto CallOverdefined; // Not tracking this callee. @@ -2158,7 +2159,7 @@ bool llvm::runIPSCCP( // whether other functions are optimizable. SmallVector ReturnsToZap; - const DenseMap &RV = Solver.getTrackedRetVals(); + const MapVector &RV = Solver.getTrackedRetVals(); for (const auto &I : RV) { Function *F = I.first; if (I.second.isOverdefined() || F->getReturnType()->isVoidTy())