mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[g-arc-opts] Refactor ARCBBState from GlobalARCSequenceDataflow.cpp -> *.h.
Swift SVN r18690
This commit is contained in:
@@ -41,92 +41,6 @@ static bool isAutoreleasePoolCall(SILInstruction &I) {
|
|||||||
.Default(false);
|
.Default(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
// Basic Block State
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
/// \brief Per-BasicBlock state.
|
|
||||||
class ARCBBState {
|
|
||||||
public:
|
|
||||||
using TopDownMapTy = BlotMapVector<SILValue, TopDownRefCountState>;
|
|
||||||
using BottomUpMapTy = BlotMapVector<SILValue, BottomUpRefCountState>;
|
|
||||||
private:
|
|
||||||
/// The basic block that this bbstate corresponds to.
|
|
||||||
SILBasicBlock &BB;
|
|
||||||
|
|
||||||
/// The top-down traversal uses this to record information known about a
|
|
||||||
/// pointer at the bottom of each block.
|
|
||||||
TopDownMapTy PtrToTopDownState;
|
|
||||||
|
|
||||||
/// The bottom-up traversal uses this to record information known about a
|
|
||||||
/// pointer at the top of each block.
|
|
||||||
BottomUpMapTy PtrToBottomUpState;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ARCBBState(SILBasicBlock &BB) : BB(BB) {}
|
|
||||||
|
|
||||||
/// Top Down Iterators
|
|
||||||
using topdown_iterator = TopDownMapTy::iterator;
|
|
||||||
using topdown_const_iterator = TopDownMapTy::const_iterator;
|
|
||||||
topdown_iterator topdown_begin() { return PtrToTopDownState.begin(); }
|
|
||||||
topdown_iterator topdown_end() { return PtrToTopDownState.end(); }
|
|
||||||
topdown_const_iterator topdown_begin() const {
|
|
||||||
return PtrToTopDownState.begin();
|
|
||||||
}
|
|
||||||
topdown_const_iterator topdown_end() const {
|
|
||||||
return PtrToTopDownState.end();
|
|
||||||
}
|
|
||||||
Range<topdown_iterator> getTopDownStates() {
|
|
||||||
return make_range(topdown_begin(), topdown_end());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Bottom up iteration.
|
|
||||||
using bottomup_iterator = BottomUpMapTy::iterator;
|
|
||||||
using bottomup_const_iterator = BottomUpMapTy::const_iterator;
|
|
||||||
bottomup_iterator bottomup_begin() { return PtrToBottomUpState.begin(); }
|
|
||||||
bottomup_iterator bottomup_end() { return PtrToBottomUpState.end(); }
|
|
||||||
bottomup_const_iterator bottomup_begin() const {
|
|
||||||
return PtrToBottomUpState.begin();
|
|
||||||
}
|
|
||||||
bottomup_const_iterator bottomup_end() const {
|
|
||||||
return PtrToBottomUpState.end();
|
|
||||||
}
|
|
||||||
Range<bottomup_iterator> getBottomupStates() {
|
|
||||||
return make_range(bottomup_begin(), bottomup_end());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Attempt to find the PtrState object describing the top down state for
|
|
||||||
/// pointer Arg. Return a new initialized PtrState describing the top down
|
|
||||||
/// state for Arg if we do not find one.
|
|
||||||
TopDownRefCountState &getTopDownRefCountState(SILValue Ptr) {
|
|
||||||
return PtrToTopDownState[Ptr];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Attempt to find the PtrState object describing the bottom up state for
|
|
||||||
/// pointer Arg. Return a new initialized PtrState describing the bottom up
|
|
||||||
/// state for Arg if we do not find one.
|
|
||||||
BottomUpRefCountState & getBottomUpRefCountState(SILValue Ptr) {
|
|
||||||
return PtrToBottomUpState[Ptr];
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearTopDownState() {
|
|
||||||
PtrToTopDownState.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearBottomUpState() {
|
|
||||||
PtrToBottomUpState.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear() {
|
|
||||||
clearTopDownState();
|
|
||||||
clearBottomUpState();
|
|
||||||
}
|
|
||||||
|
|
||||||
SILBasicBlock &getBB() const { return BB; }
|
|
||||||
};
|
|
||||||
} // end anonymous namespace
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Top Down Dataflow
|
// Top Down Dataflow
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@@ -398,7 +312,7 @@ bool swift::arc::performARCSequenceDataflow(
|
|||||||
for (auto &BB : F) {
|
for (auto &BB : F) {
|
||||||
DEBUG(llvm::dbgs() << "\n<<< Processing New BB! >>>\n");
|
DEBUG(llvm::dbgs() << "\n<<< Processing New BB! >>>\n");
|
||||||
|
|
||||||
ARCBBState state(BB);
|
ARCBBState state(&BB);
|
||||||
|
|
||||||
// Perform the bottom up and then top down dataflow.
|
// Perform the bottom up and then top down dataflow.
|
||||||
NestingDetected |= processBBBottomUp(state, IncToDecStateMap, AA);
|
NestingDetected |= processBBBottomUp(state, IncToDecStateMap, AA);
|
||||||
|
|||||||
@@ -23,6 +23,104 @@ class AliasAnalysis;
|
|||||||
namespace swift {
|
namespace swift {
|
||||||
namespace arc {
|
namespace arc {
|
||||||
|
|
||||||
|
/// \brief Per-BasicBlock state.
|
||||||
|
class ARCBBState {
|
||||||
|
public:
|
||||||
|
using TopDownMapTy = BlotMapVector<SILValue, TopDownRefCountState>;
|
||||||
|
using BottomUpMapTy = BlotMapVector<SILValue, BottomUpRefCountState>;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// The basic block that this bbstate corresponds to.
|
||||||
|
SILBasicBlock *BB;
|
||||||
|
|
||||||
|
/// The top-down traversal uses this to record information known about a
|
||||||
|
/// pointer at the bottom of each block.
|
||||||
|
TopDownMapTy PtrToTopDownState;
|
||||||
|
|
||||||
|
/// The bottom-up traversal uses this to record information known about a
|
||||||
|
/// pointer at the top of each block.
|
||||||
|
BottomUpMapTy PtrToBottomUpState;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ARCBBState() : BB() {}
|
||||||
|
ARCBBState(SILBasicBlock *BB) : BB(BB) {}
|
||||||
|
|
||||||
|
void init(SILBasicBlock *NewBB) {
|
||||||
|
assert(NewBB && "Cannot set NewBB to a nullptr.");
|
||||||
|
BB = NewBB;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Top Down Iterators
|
||||||
|
using topdown_iterator = TopDownMapTy::iterator;
|
||||||
|
using topdown_const_iterator = TopDownMapTy::const_iterator;
|
||||||
|
topdown_iterator topdown_begin() { return PtrToTopDownState.begin(); }
|
||||||
|
topdown_iterator topdown_end() { return PtrToTopDownState.end(); }
|
||||||
|
topdown_const_iterator topdown_begin() const {
|
||||||
|
return PtrToTopDownState.begin();
|
||||||
|
}
|
||||||
|
topdown_const_iterator topdown_end() const { return PtrToTopDownState.end(); }
|
||||||
|
Range<topdown_iterator> getTopDownStates() {
|
||||||
|
return make_range(topdown_begin(), topdown_end());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Bottom up iteration.
|
||||||
|
using bottomup_iterator = BottomUpMapTy::iterator;
|
||||||
|
using bottomup_const_iterator = BottomUpMapTy::const_iterator;
|
||||||
|
bottomup_iterator bottomup_begin() { return PtrToBottomUpState.begin(); }
|
||||||
|
bottomup_iterator bottomup_end() { return PtrToBottomUpState.end(); }
|
||||||
|
bottomup_const_iterator bottomup_begin() const {
|
||||||
|
return PtrToBottomUpState.begin();
|
||||||
|
}
|
||||||
|
bottomup_const_iterator bottomup_end() const {
|
||||||
|
return PtrToBottomUpState.end();
|
||||||
|
}
|
||||||
|
Range<bottomup_iterator> getBottomupStates() {
|
||||||
|
return make_range(bottomup_begin(), bottomup_end());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Attempt to find the PtrState object describing the top down state for
|
||||||
|
/// pointer Arg. Return a new initialized PtrState describing the top down
|
||||||
|
/// state for Arg if we do not find one.
|
||||||
|
TopDownRefCountState &getTopDownRefCountState(SILValue Ptr) {
|
||||||
|
return PtrToTopDownState[Ptr];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Attempt to find the PtrState object describing the bottom up state for
|
||||||
|
/// pointer Arg. Return a new initialized PtrState describing the bottom up
|
||||||
|
/// state for Arg if we do not find one.
|
||||||
|
BottomUpRefCountState &getBottomUpRefCountState(SILValue Ptr) {
|
||||||
|
return PtrToBottomUpState[Ptr];
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearTopDownState() { PtrToTopDownState.clear(); }
|
||||||
|
|
||||||
|
void clearBottomUpState() { PtrToBottomUpState.clear(); }
|
||||||
|
|
||||||
|
/// Clear both the bottom up *AND* top down state.
|
||||||
|
void clear() {
|
||||||
|
clearTopDownState();
|
||||||
|
clearBottomUpState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a reference to the basic block that we are tracking.
|
||||||
|
SILBasicBlock &getBB() const { return *BB; }
|
||||||
|
|
||||||
|
/// Merge in the state of the successor basic block. This is currently a stub.
|
||||||
|
void mergeSuccBottomUp(ARCBBState &SuccBB);
|
||||||
|
|
||||||
|
/// Initialize this BB with the state of the successor basic block. This is
|
||||||
|
/// called on a basic block's state and then any other successors states are
|
||||||
|
/// merged in. This is currently a stub.
|
||||||
|
void initSuccBottomUp(ARCBBState &SuccBB);
|
||||||
|
|
||||||
|
/// Merge in the state of the predecessor basic block. This is currently a stub.
|
||||||
|
void mergePredTopDown(ARCBBState &PredBB);
|
||||||
|
|
||||||
|
/// Initialize the state for this BB with the state of its predecessor
|
||||||
|
/// BB. Used to create an initial state before we merge in other
|
||||||
|
/// predecessors. This is currently a stub.
|
||||||
|
void initPredTopDown(ARCBBState &PredBB);
|
||||||
|
};
|
||||||
bool performARCSequenceDataflow(
|
bool performARCSequenceDataflow(
|
||||||
SILFunction &F, AliasAnalysis *AA,
|
SILFunction &F, AliasAnalysis *AA,
|
||||||
BlotMapVector<SILInstruction *, TopDownRefCountState> &DecToIncStateMap,
|
BlotMapVector<SILInstruction *, TopDownRefCountState> &DecToIncStateMap,
|
||||||
|
|||||||
Reference in New Issue
Block a user