/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import { HIRFunction, Identifier, InstructionId } from "../HIR/HIR"; import DisjointSet from "../Utils/DisjointSet"; export function inferMutableRangesForAlias( _fn: HIRFunction, aliases: DisjointSet ): void { const aliasSets = aliases.buildSets(); for (const aliasSet of aliasSets) { /* * Update mutableRange.end only if the identifiers have actually been * mutated. */ const mutatingIdentifiers = [...aliasSet].filter( (id) => id.mutableRange.end - id.mutableRange.start > 1 ); if (mutatingIdentifiers.length > 0) { // Find final instruction which mutates this alias set. let lastMutatingInstructionId = 0; for (const id of mutatingIdentifiers) { if (id.mutableRange.end > lastMutatingInstructionId) { lastMutatingInstructionId = id.mutableRange.end; } } /* * Update mutableRange.end for all aliases in this set ending before the * last mutation. */ for (const alias of aliasSet) { if (alias.mutableRange.end < lastMutatingInstructionId) { alias.mutableRange.end = lastMutatingInstructionId as InstructionId; } } } } }