@@ -502,16 +502,11 @@ coalesceTileLiveRanges(DenseMap<Value, LiveRange> &initialLiveRanges) {
502
502
}
503
503
504
504
// / Choose a live range to spill (via some heuristics). This picks either a live
505
- // / range from `activeRanges`, `inactiveRanges`, or the new live range
506
- // / `newRange`. Note: All live ranges in `activeRanges` and `inactiveRanges` are
507
- // / assumed to overlap with `newRange`.
508
- LiveRange *chooseSpillUsingHeuristics (ArrayRef<LiveRange *> activeRanges,
509
- ArrayRef<LiveRange *> inactiveRanges,
510
- LiveRange *newRange) {
511
- auto allOverlappingRanges =
512
- llvm::concat<LiveRange>(llvm::make_pointee_range (activeRanges),
513
- llvm::make_pointee_range (inactiveRanges));
514
-
505
+ // / range from `overlappingRanges`, or the new live range `newRange`.
506
+ template <typename OverlappingRangesIterator>
507
+ LiveRange *
508
+ chooseSpillUsingHeuristics (OverlappingRangesIterator overlappingRanges,
509
+ LiveRange *newRange) {
515
510
// Heuristic: Spill trivially copyable operations (usually free).
516
511
auto isTrivialSpill = [&](LiveRange &allocatedRange) {
517
512
return isTileTypeGreaterOrEqual (allocatedRange.getTileType (),
@@ -522,18 +517,18 @@ LiveRange *chooseSpillUsingHeuristics(ArrayRef<LiveRange *> activeRanges,
522
517
};
523
518
if (isTrivialSpill (*newRange))
524
519
return newRange;
525
- auto trivialSpill = llvm::find_if (allOverlappingRanges , isTrivialSpill);
526
- if (trivialSpill != allOverlappingRanges .end ())
520
+ auto trivialSpill = llvm::find_if (overlappingRanges , isTrivialSpill);
521
+ if (trivialSpill != overlappingRanges .end ())
527
522
return &*trivialSpill;
528
523
529
524
// Heuristic: Spill the range that ends last (with a compatible tile type).
530
525
auto isSmallerTileTypeOrEndsEarlier = [](LiveRange &a, LiveRange &b) {
531
526
return !isTileTypeGreaterOrEqual (a.getTileType (), b.getTileType ()) ||
532
527
a.end () < b.end ();
533
528
};
534
- LiveRange &latestEndingLiveRange = * std::max_element (
535
- allOverlappingRanges .begin (), allOverlappingRanges .end (),
536
- isSmallerTileTypeOrEndsEarlier);
529
+ LiveRange &latestEndingLiveRange =
530
+ * std::max_element (overlappingRanges .begin (), overlappingRanges .end (),
531
+ isSmallerTileTypeOrEndsEarlier);
537
532
if (!isSmallerTileTypeOrEndsEarlier (latestEndingLiveRange, *newRange))
538
533
return &latestEndingLiveRange;
539
534
return newRange;
@@ -604,8 +599,13 @@ void allocateTilesToLiveRanges(
604
599
if (succeeded (tileId)) {
605
600
nextRange->tileId = *tileId;
606
601
} else {
607
- LiveRange *rangeToSpill = chooseSpillUsingHeuristics (
608
- activeRanges.getArrayRef (), overlappingInactiveRanges, nextRange);
602
+ // Create an iterator over all overlapping live ranges.
603
+ auto allOverlappingRanges = llvm::concat<LiveRange>(
604
+ llvm::make_pointee_range (activeRanges.getArrayRef ()),
605
+ llvm::make_pointee_range (overlappingInactiveRanges));
606
+ // Choose an overlapping live range to spill.
607
+ LiveRange *rangeToSpill =
608
+ chooseSpillUsingHeuristics (allOverlappingRanges, nextRange);
609
609
if (rangeToSpill != nextRange) {
610
610
// Spill an (in)active live range (so release its tile ID first).
611
611
tileAllocator.releaseTileId (rangeToSpill->getTileType (),
0 commit comments