summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2016-02-19 17:15:26 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2016-02-19 17:15:26 +0000
commit171313c69a1d6e881cb28ecd8a549675c150e920 (patch)
tree23c6e3ff31f325f12d472f705e57f02ee7d44729 /llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
parentd2db73ba59dcb66b7193fbcf5f1a42ab3bc5c003 (diff)
downloadbcm5719-llvm-171313c69a1d6e881cb28ecd8a549675c150e920.tar.gz
bcm5719-llvm-171313c69a1d6e881cb28ecd8a549675c150e920.zip
[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
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp19
1 files changed, 10 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
index 0a1f135e2e0..0116fdddd95 100644
--- a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
@@ -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;
}
OpenPOWER on IntegriCloud