diff options
author | Gerolf Hoflehner <ghoflehner@apple.com> | 2019-06-26 21:44:37 +0000 |
---|---|---|
committer | Gerolf Hoflehner <ghoflehner@apple.com> | 2019-06-26 21:44:37 +0000 |
commit | e311a4d5c4d3081d05c512f31aa9b3b354890f51 (patch) | |
tree | 31b2a2209319cd9aec1e00e0bbe7caf228af9116 /llvm/lib/Transforms/Scalar/SCCP.cpp | |
parent | ddf025e8dc467f03592deae2f4845fa3c08407eb (diff) | |
download | bcm5719-llvm-e311a4d5c4d3081d05c512f31aa9b3b354890f51.tar.gz bcm5719-llvm-e311a4d5c4d3081d05c512f31aa9b3b354890f51.zip |
[SCCP] Fix non-deterministic uselists of return values (DenseMap -> MapVector)
llvm-svn: 364482
Diffstat (limited to 'llvm/lib/Transforms/Scalar/SCCP.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/SCCP.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index 1d0354bd708..4093e50ce89 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/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<SCCPSolver> { /// 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<Function *, LatticeVal> TrackedRetVals; + MapVector<Function *, LatticeVal> TrackedRetVals; /// TrackedMultipleRetVals - Same as TrackedRetVals, but used for functions /// that return multiple values. - DenseMap<std::pair<Function *, unsigned>, LatticeVal> TrackedMultipleRetVals; + MapVector<std::pair<Function *, unsigned>, 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<Function*, LatticeVal> &getTrackedRetVals() { + const MapVector<Function*, LatticeVal> &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<Function*, LatticeVal>::iterator TFRVI = + MapVector<Function*, LatticeVal>::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<Function*, LatticeVal>::iterator TFRVI = TrackedRetVals.find(F); + MapVector<Function*, LatticeVal>::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<ReturnInst*, 8> ReturnsToZap; - const DenseMap<Function*, LatticeVal> &RV = Solver.getTrackedRetVals(); + const MapVector<Function*, LatticeVal> &RV = Solver.getTrackedRetVals(); for (const auto &I : RV) { Function *F = I.first; if (I.second.isOverdefined() || F->getReturnType()->isVoidTy()) |