|
@@ -20,6 +20,7 @@
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/DenseSet.h"
|
|
#include "llvm/ADT/DenseSet.h"
|
|
|
|
+#include "llvm/ADT/MapVector.h"
|
|
#include "llvm/ADT/PointerIntPair.h"
|
|
#include "llvm/ADT/PointerIntPair.h"
|
|
#include "llvm/ADT/STLExtras.h"
|
|
#include "llvm/ADT/STLExtras.h"
|
|
#include "llvm/ADT/SmallPtrSet.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
|
|
/// TrackedRetVals - If we are tracking arguments into and the return
|
|
/// value out of a function, it will have an entry in this map, indicating
|
|
/// value out of a function, it will have an entry in this map, indicating
|
|
/// what the known return value for the function is.
|
|
/// 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
|
|
/// TrackedMultipleRetVals - Same as TrackedRetVals, but used for functions
|
|
/// that return multiple values.
|
|
/// that return multiple values.
|
|
- DenseMap<std::pair<Function *, unsigned>, LatticeVal> TrackedMultipleRetVals;
|
|
|
|
|
|
+ MapVector<std::pair<Function *, unsigned>, LatticeVal> TrackedMultipleRetVals;
|
|
|
|
|
|
/// MRVFunctionsTracked - Each function in TrackedMultipleRetVals is
|
|
/// MRVFunctionsTracked - Each function in TrackedMultipleRetVals is
|
|
/// represented here for efficient lookup.
|
|
/// represented here for efficient lookup.
|
|
@@ -371,7 +372,7 @@ public:
|
|
}
|
|
}
|
|
|
|
|
|
/// getTrackedRetVals - Get the inferred return value map.
|
|
/// getTrackedRetVals - Get the inferred return value map.
|
|
- const DenseMap<Function*, LatticeVal> &getTrackedRetVals() {
|
|
|
|
|
|
+ const MapVector<Function*, LatticeVal> &getTrackedRetVals() {
|
|
return TrackedRetVals;
|
|
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 we are tracking the return value of this function, merge it in.
|
|
if (!TrackedRetVals.empty() && !ResultOp->getType()->isStructTy()) {
|
|
if (!TrackedRetVals.empty() && !ResultOp->getType()->isStructTy()) {
|
|
- DenseMap<Function*, LatticeVal>::iterator TFRVI =
|
|
|
|
|
|
+ MapVector<Function*, LatticeVal>::iterator TFRVI =
|
|
TrackedRetVals.find(F);
|
|
TrackedRetVals.find(F);
|
|
if (TFRVI != TrackedRetVals.end()) {
|
|
if (TFRVI != TrackedRetVals.end()) {
|
|
mergeInValue(TFRVI->second, F, getValueState(ResultOp));
|
|
mergeInValue(TFRVI->second, F, getValueState(ResultOp));
|
|
@@ -1351,7 +1352,7 @@ CallOverdefined:
|
|
mergeInValue(getStructValueState(I, i), I,
|
|
mergeInValue(getStructValueState(I, i), I,
|
|
TrackedMultipleRetVals[std::make_pair(F, i)]);
|
|
TrackedMultipleRetVals[std::make_pair(F, i)]);
|
|
} else {
|
|
} else {
|
|
- DenseMap<Function*, LatticeVal>::iterator TFRVI = TrackedRetVals.find(F);
|
|
|
|
|
|
+ MapVector<Function*, LatticeVal>::iterator TFRVI = TrackedRetVals.find(F);
|
|
if (TFRVI == TrackedRetVals.end())
|
|
if (TFRVI == TrackedRetVals.end())
|
|
goto CallOverdefined; // Not tracking this callee.
|
|
goto CallOverdefined; // Not tracking this callee.
|
|
|
|
|
|
@@ -2158,7 +2159,7 @@ bool llvm::runIPSCCP(
|
|
// whether other functions are optimizable.
|
|
// whether other functions are optimizable.
|
|
SmallVector<ReturnInst*, 8> ReturnsToZap;
|
|
SmallVector<ReturnInst*, 8> ReturnsToZap;
|
|
|
|
|
|
- const DenseMap<Function*, LatticeVal> &RV = Solver.getTrackedRetVals();
|
|
|
|
|
|
+ const MapVector<Function*, LatticeVal> &RV = Solver.getTrackedRetVals();
|
|
for (const auto &I : RV) {
|
|
for (const auto &I : RV) {
|
|
Function *F = I.first;
|
|
Function *F = I.first;
|
|
if (I.second.isOverdefined() || F->getReturnType()->isVoidTy())
|
|
if (I.second.isOverdefined() || F->getReturnType()->isVoidTy())
|