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;
}