import { BlockId, HIRFunction, computePostDominatorTree } from ".";
import { CompilerError } from "..";
export function computeUnconditionalBlocks(fn: HIRFunction): Set<BlockId> {
const unconditionalBlocks = new Set<BlockId>();
const dominators = computePostDominatorTree(fn, {
includeThrowsAsExitNode: false,
});
const exit = dominators.exit;
let current: BlockId | null = fn.body.entry;
while (current !== null && current !== exit) {
CompilerError.invariant(!unconditionalBlocks.has(current), {
reason:
"Internal error: non-terminating loop in ComputeUnconditionalBlocks",
loc: null,
suggestions: null,
});
unconditionalBlocks.add(current);
current = dominators.get(current);
}
return unconditionalBlocks;
}