[be] Move buildAliasSets to DisjointSet

This commit is contained in:
Sathya Gunasekaran
2022-12-12 20:35:23 +00:00
parent 3c976a24b3
commit e2e5e389af
4 changed files with 24 additions and 28 deletions
+22
View File
@@ -84,6 +84,28 @@ export default class DisjointSet<T> {
}
}
buildSets(): Array<Set<T>> {
const ids: Map<T, number> = new Map();
const sets: Map<number, Set<T>> = new Map();
this.forEach((identifier, groupIdentifier) => {
let id = ids.get(groupIdentifier);
if (id == null) {
id = ids.size;
ids.set(groupIdentifier, id);
}
let set = sets.get(id);
if (set === undefined) {
set = new Set();
sets.set(id, set);
}
set.add(identifier);
});
return [...sets.values()];
}
get size(): number {
return this.#entries.size;
}
-24
View File
@@ -15,30 +15,6 @@ type AbstractPrimitive = {
export type AliasSet = Set<Identifier>;
export function buildAliasSets(
aliases: DisjointSet<Identifier>
): Array<AliasSet> {
const aliasIds: Map<Identifier, number> = new Map();
const aliasSets: Map<number, Set<Identifier>> = new Map();
aliases.forEach((identifier, groupIdentifier) => {
let aliasId = aliasIds.get(groupIdentifier);
if (aliasId == null) {
aliasId = aliasIds.size;
aliasIds.set(groupIdentifier, aliasId);
}
let aliasSet = aliasSets.get(aliasId);
if (aliasSet === undefined) {
aliasSet = new Set();
aliasSets.set(aliasId, aliasSet);
}
aliasSet.add(identifier);
});
return [...aliasSets.values()];
}
class AbstractState {
aliases = new DisjointSet<Identifier>();
// NOTE(gsn): Should this be a part of AbstractObject? No, because this has
@@ -1,9 +1,8 @@
import DisjointSet from "./DisjointSet";
import { Identifier, InstructionId } from "./HIR";
import { buildAliasSets } from "./InferAlias";
export function inferMutableRangesForAlias(aliases: DisjointSet<Identifier>) {
const aliasSets = buildAliasSets(aliases);
const aliasSets = aliases.buildSets();
for (const aliasSet of aliasSets) {
// Update mutableRange.end only if the identifiers have actually been
// mutated.
+1 -2
View File
@@ -23,7 +23,6 @@ import {
SourceLocation,
Terminal,
} from "./HIR";
import { buildAliasSets } from "./InferAlias";
import { eachReactiveScope } from "./visitors";
export type Options = {
@@ -335,7 +334,7 @@ export function printSourceLocation(loc: SourceLocation): string {
}
export function printAliases(aliases: DisjointSet<Identifier>): string {
const aliasSets = buildAliasSets(aliases);
const aliasSets = aliases.buildSets();
const items = [];
for (const aliasSet of aliasSets) {