File tree Expand file tree Collapse file tree 2 files changed +32
-0
lines changed Expand file tree Collapse file tree 2 files changed +32
-0
lines changed Original file line number Diff line number Diff line change @@ -321,6 +321,10 @@ struct TypeTreeLeafTypeRange {
321
321
SmallVectorImpl<std::pair<SILValue, TypeTreeLeafTypeRange>>
322
322
&resultingProjections);
323
323
324
+ static void visitContiguousRanges (
325
+ SmallBitVector const &bits,
326
+ llvm::function_ref<void (TypeTreeLeafTypeRange)> callback);
327
+
324
328
bool operator ==(const TypeTreeLeafTypeRange &other) const {
325
329
return startEltOffset == other.startEltOffset &&
326
330
endEltOffset == other.endEltOffset ;
@@ -1216,6 +1220,11 @@ class FieldSensitiveMultiDefPrunedLiveRange
1216
1220
defBlocks.setFrozen ();
1217
1221
}
1218
1222
1223
+ void initializeDef (SILInstruction *def, SmallBitVector const &bits) {
1224
+ TypeTreeLeafTypeRange::visitContiguousRanges (
1225
+ bits, [&](auto range) { initializeDef (def, range); });
1226
+ }
1227
+
1219
1228
void initializeDef (SILValue def, TypeTreeLeafTypeRange span) {
1220
1229
assert (Super::isInitialized ());
1221
1230
defs.insert (def, span);
Original file line number Diff line number Diff line change @@ -483,6 +483,29 @@ void TypeTreeLeafTypeRange::constructProjectionsForNeededElements(
483
483
}
484
484
}
485
485
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
+
486
509
// ===----------------------------------------------------------------------===//
487
510
// MARK: FieldSensitivePrunedLiveBlocks
488
511
// ===----------------------------------------------------------------------===//
You can’t perform that action at this time.
0 commit comments