mirror of
https://git.sfja.dk/Mikkel/slige.git
synced 2025-01-18 12:46:31 +00:00
60 lines
1.5 KiB
TypeScript
60 lines
1.5 KiB
TypeScript
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);
|
|
}
|
|
}
|
|
}
|