[SCCP] Fix non-deterministic uselists of return values (DenseMap -> MapVector)
llvm-svn: 364482
This commit is contained in:
parent
ddf025e8dc
commit
e311a4d5c4
|
@ -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())
|
||||
|
|
Loading…
Reference in New Issue