Skip to content

Commit

Permalink
Auto merge of #120024 - Mark-Simulacrum:fast-union-merge, r=cjgillot
Browse files Browse the repository at this point in the history
Merge into larger interval set

This reduces the work done while merging rows. In at least one case (#50450), we have thousands of union([range], [20,000 ranges]), which previously inserted each of the 20,000 ranges one by one. Now we only insert one range into the right hand set after copying the set over.

This cuts the runtime of the test case in #50450 from ~26 seconds to ~6 seconds locally, though it doesn't change the memory usage peak (~9.5GB).
  • Loading branch information
bors committed Jan 27, 2024
2 parents 6b4f1c5 + 1696148 commit 6351247
Showing 1 changed file with 6 additions and 0 deletions.
6 changes: 6 additions & 0 deletions compiler/rustc_index/src/interval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,12 @@ impl<I: Idx> IntervalSet<I> {
I: Step,
{
assert_eq!(self.domain, other.domain);
if self.map.len() < other.map.len() {
let backup = self.clone();
self.map.clone_from(&other.map);
return self.union(&backup);
}

let mut did_insert = false;
for range in other.iter_intervals() {
did_insert |= self.insert_range(range);
Expand Down

0 comments on commit 6351247

Please sign in to comment.