Skip to content

Commit 721617d

Browse files
committed
[FieldSensitivePL] NFC: Added initDef(bit vector).
The new overload iterates over the contiguous ranges in the bit vector and calls through to the overload that takes a range.
1 parent d5ad045 commit 721617d

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

include/swift/SIL/FieldSensitivePrunedLiveness.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,10 @@ struct TypeTreeLeafTypeRange {
321321
SmallVectorImpl<std::pair<SILValue, TypeTreeLeafTypeRange>>
322322
&resultingProjections);
323323

324+
static void visitContiguousRanges(
325+
SmallBitVector const &bits,
326+
llvm::function_ref<void(TypeTreeLeafTypeRange)> callback);
327+
324328
bool operator==(const TypeTreeLeafTypeRange &other) const {
325329
return startEltOffset == other.startEltOffset &&
326330
endEltOffset == other.endEltOffset;
@@ -1216,6 +1220,11 @@ class FieldSensitiveMultiDefPrunedLiveRange
12161220
defBlocks.setFrozen();
12171221
}
12181222

1223+
void initializeDef(SILInstruction *def, SmallBitVector const &bits) {
1224+
TypeTreeLeafTypeRange::visitContiguousRanges(
1225+
bits, [&](auto range) { initializeDef(def, range); });
1226+
}
1227+
12191228
void initializeDef(SILValue def, TypeTreeLeafTypeRange span) {
12201229
assert(Super::isInitialized());
12211230
defs.insert(def, span);

lib/SIL/Utils/FieldSensitivePrunedLiveness.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,29 @@ void TypeTreeLeafTypeRange::constructProjectionsForNeededElements(
483483
}
484484
}
485485

486+
void TypeTreeLeafTypeRange::visitContiguousRanges(
487+
SmallBitVector const &bits,
488+
llvm::function_ref<void(TypeTreeLeafTypeRange)> callback) {
489+
if (bits.size() == 0)
490+
return;
491+
492+
Optional<unsigned> current = llvm::None;
493+
for (unsigned bit = 0, size = bits.size(); bit < size; ++bit) {
494+
auto isSet = bits.test(bit);
495+
if (current) {
496+
if (!isSet) {
497+
callback(TypeTreeLeafTypeRange(*current, bit));
498+
current = llvm::None;
499+
}
500+
} else if (isSet) {
501+
current = bit;
502+
}
503+
}
504+
if (current) {
505+
callback(TypeTreeLeafTypeRange(*current, bits.size()));
506+
}
507+
}
508+
486509
//===----------------------------------------------------------------------===//
487510
// MARK: FieldSensitivePrunedLiveBlocks
488511
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)