File tree Expand file tree Collapse file tree 2 files changed +34
-0
lines changed Expand file tree Collapse file tree 2 files changed +34
-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,31 @@ 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<std::pair<unsigned , /* isSet*/ bool >> current = llvm::None;
493
+ for (unsigned bit = 0 , size = bits.size (); bit < size; ++bit) {
494
+ auto isSet = bits.test (bit);
495
+ if (!current) {
496
+ current = {bit, isSet};
497
+ continue ;
498
+ }
499
+ if (current->second != isSet) {
500
+ if (current->second ) {
501
+ callback (TypeTreeLeafTypeRange (current->first , bit));
502
+ }
503
+ current = {bit, isSet};
504
+ }
505
+ }
506
+ if (current->second ) {
507
+ callback (TypeTreeLeafTypeRange (current->first , bits.size ()));
508
+ }
509
+ }
510
+
486
511
// ===----------------------------------------------------------------------===//
487
512
// MARK: FieldSensitivePrunedLiveBlocks
488
513
// ===----------------------------------------------------------------------===//
You can’t perform that action at this time.
0 commit comments