summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/SCCP.cpp
diff options
context:
space:
mode:
authorGerolf Hoflehner <ghoflehner@apple.com>2019-06-26 21:44:37 +0000
committerGerolf Hoflehner <ghoflehner@apple.com>2019-06-26 21:44:37 +0000
commite311a4d5c4d3081d05c512f31aa9b3b354890f51 (patch)
tree31b2a2209319cd9aec1e00e0bbe7caf228af9116 /llvm/lib/Transforms/Scalar/SCCP.cpp
parentddf025e8dc467f03592deae2f4845fa3c08407eb (diff)
downloadbcm5719-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.cpp13
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())
OpenPOWER on IntegriCloud