slige/compiler/middle/elim_blocks.ts

60 lines
1.5 KiB
TypeScript
Raw Normal View History

2025-01-03 01:15:05 +01:00
import { createCfg } from "./cfg.ts";
import { Block, Mir } from "./mir.ts";
export function eliminateOnlyChildsBlocks(mir: Mir) {
for (const fn of mir.fns) {
const cfg = createCfg(fn);
const candidates: { parent: Block; child: Block }[] = [];
for (const block of fn.blocks) {
const children = cfg.children(block);
if (children.length !== 1) {
continue;
}
if (cfg.parents(children[0]).length !== 1) {
continue;
}
candidates.push({ parent: block, child: children[0] });
}
const elimIndices: number[] = [];
for (const { parent, child } of candidates) {
parent.ops.push(...child.ops);
parent.ter = child.ter;
elimIndices.push(cfg.index(child));
}
for (const i of elimIndices.toReversed()) {
fn.blocks.splice(i, 1);
}
}
}
export function eliminateUnreachableBlocks(mir: Mir) {
for (const fn of mir.fns) {
const cfg = createCfg(fn);
const candidates: Block[] = [];
for (const block of fn.blocks) {
if (block.id === fn.entry) {
continue;
}
if (cfg.parents(block).length !== 0) {
continue;
}
candidates.push(block);
}
for (
const i of candidates
.map((block) => cfg.index(block))
.toReversed()
) {
fn.blocks.splice(i, 1);
}
}
}