mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
[StatepointLowering] Change AllocatedStackSlots to use SmallBitVector
NFCI. They key motivation here is that I'd like to use SmallBitVector::all() in a later change. Also, using a bit vector here seemed better in general. The only interesting change here is that in the failure case of allocateStackSlot, we no longer (the equivalent of) push_back(true) to AllocatedStackSlots. As far as I can tell, this is fine, since we'd never re-use those slots in the same StatepointLoweringState instance. Technically there was no need to change the operator[] type accesses to set() and test(), but I thought it'd be nice to make it obvious that we're using something other than a std::vector like thing. llvm-svn: 261337
This commit is contained in:
parent
77d7a161ac
commit
5f2f187542
@ -53,13 +53,10 @@ void StatepointLoweringState::startNewStatepoint(SelectionDAGBuilder &Builder) {
|
||||
"Trying to visit statepoint before finished processing previous one");
|
||||
Locations.clear();
|
||||
NextSlotToAllocate = 0;
|
||||
// Need to resize this on each safepoint - we need the two to stay in
|
||||
// sync and the clear patterns of a SelectionDAGBuilder have no relation
|
||||
// to FunctionLoweringInfo.
|
||||
// Need to resize this on each safepoint - we need the two to stay in sync and
|
||||
// the clear patterns of a SelectionDAGBuilder have no relation to
|
||||
// FunctionLoweringInfo. SmallBitVector::reset initializes all bits to false.
|
||||
AllocatedStackSlots.resize(Builder.FuncInfo.StatepointStackSlots.size());
|
||||
for (size_t i = 0; i < AllocatedStackSlots.size(); i++) {
|
||||
AllocatedStackSlots[i] = false;
|
||||
}
|
||||
}
|
||||
|
||||
void StatepointLoweringState::clear() {
|
||||
@ -85,11 +82,16 @@ StatepointLoweringState::allocateStackSlot(EVT ValueType,
|
||||
const size_t NumSlots = AllocatedStackSlots.size();
|
||||
assert(NextSlotToAllocate <= NumSlots && "Broken invariant");
|
||||
|
||||
// The stack slots in StatepointStackSlots beyond the first NumSlots were
|
||||
// added in this instance of StatepointLoweringState, and cannot be re-used.
|
||||
assert(NumSlots <= Builder.FuncInfo.StatepointStackSlots.size() &&
|
||||
"Broken invariant");
|
||||
|
||||
for (; NextSlotToAllocate < NumSlots; NextSlotToAllocate++) {
|
||||
if (!AllocatedStackSlots[NextSlotToAllocate] &&
|
||||
if (!AllocatedStackSlots.test(NextSlotToAllocate) &&
|
||||
MFI->getObjectSize(NextSlotToAllocate) == SpillSize) {
|
||||
const int FI = Builder.FuncInfo.StatepointStackSlots[NextSlotToAllocate];
|
||||
AllocatedStackSlots[NextSlotToAllocate] = true;
|
||||
AllocatedStackSlots.set(NextSlotToAllocate);
|
||||
return Builder.DAG.getFrameIndex(FI, ValueType);
|
||||
}
|
||||
}
|
||||
@ -104,7 +106,6 @@ StatepointLoweringState::allocateStackSlot(EVT ValueType,
|
||||
MFI->markAsStatepointSpillSlotObjectIndex(FI);
|
||||
|
||||
Builder.FuncInfo.StatepointStackSlots.push_back(FI);
|
||||
AllocatedStackSlots.push_back(true);
|
||||
return SpillSlot;
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
#define LLVM_LIB_CODEGEN_SELECTIONDAG_STATEPOINTLOWERING_H
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallBitVector.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include <vector>
|
||||
@ -84,14 +85,14 @@ public:
|
||||
void reserveStackSlot(int Offset) {
|
||||
assert(Offset >= 0 && Offset < (int)AllocatedStackSlots.size() &&
|
||||
"out of bounds");
|
||||
assert(!AllocatedStackSlots[Offset] && "already reserved!");
|
||||
assert(!AllocatedStackSlots.test(Offset) && "already reserved!");
|
||||
assert(NextSlotToAllocate <= (unsigned)Offset && "consistency!");
|
||||
AllocatedStackSlots[Offset] = true;
|
||||
AllocatedStackSlots.set(Offset);
|
||||
}
|
||||
bool isStackSlotAllocated(int Offset) {
|
||||
assert(Offset >= 0 && Offset < (int)AllocatedStackSlots.size() &&
|
||||
"out of bounds");
|
||||
return AllocatedStackSlots[Offset];
|
||||
return AllocatedStackSlots.test(Offset);
|
||||
}
|
||||
|
||||
private:
|
||||
@ -103,7 +104,7 @@ private:
|
||||
/// whether it has been used in the current statepoint. Since we try to
|
||||
/// preserve stack slots across safepoints, there can be gaps in which
|
||||
/// slots have been allocated.
|
||||
SmallVector<bool, 50> AllocatedStackSlots;
|
||||
SmallBitVector AllocatedStackSlots;
|
||||
|
||||
/// Points just beyond the last slot known to have been allocated
|
||||
unsigned NextSlotToAllocate;
|
||||
|
Loading…
x
Reference in New Issue
Block a user