import type { Loc } from "./ir/loc"
|
|
import type { SSA } from "./ir/ssa"
|
|
|
|
export type LivenessInfo = Array<Set<Loc>>
|
|
|
|
export const liveness = (block: Array<SSA>): LivenessInfo => {
|
|
const info: LivenessInfo = []
|
|
|
|
for (let i = block.length - 1; i >= 0; --i) {
|
|
const insn = block[i]
|
|
const last = info[i + 1] || new Set()
|
|
|
|
info[i] = new Set()
|
|
|
|
if (typeof insn.source !== "number") {
|
|
info[i].add(insn.source)
|
|
}
|
|
|
|
if ("source1" in insn && typeof insn.source1 !== "number") {
|
|
info[i].add(insn.source1)
|
|
}
|
|
|
|
last.forEach(loc => {
|
|
if (loc === insn.dest) {
|
|
return
|
|
}
|
|
|
|
info[i].add(loc)
|
|
})
|
|
}
|
|
|
|
return info
|
|
}
|