diff options
author | Vladimir Azarov <avm@intermediate-node.net> | 2025-08-07 22:25:26 +0200 |
---|---|---|
committer | Vladimir Azarov <avm@intermediate-node.net> | 2025-08-07 22:25:26 +0200 |
commit | b0cb85edf2b60f6f0909355db717376f435ab312 (patch) | |
tree | f799f756ded29f2f43dbb686198e0a9c5e11a0a2 /emit.fun | |
parent | 8ecbaf49113acb9e56a3af65117c15773b0f66ac (diff) |
Removal of unused labels, basic live intervals
Diffstat (limited to 'emit.fun')
-rw-r--r-- | emit.fun | 116 |
1 files changed, 115 insertions, 1 deletions
@@ -120,10 +120,122 @@ functor Emit(I: IL) = struct D.appi f P.iniLayouts end + fun getVarsForAlloc vregs = + let + fun loop idx acc = + if idx = D.length vregs then + rev acc + else + let + val { t, ... } = D.get vregs idx + in + if t = I.RtReg then + loop (idx + 1) (idx :: acc) + else + loop (idx + 1) acc + end + in + loop 0 [] + end + + fun extendEnd (iStart, iEnd) ops labels = + let + fun loop idx iEnd = + if idx = D.length ops then + iEnd + else + let + val ins = D.get ops idx + in + case ins of + SOME (I.IrJmp lid) | SOME (I.IrJz (_, lid)) | + SOME (I.IrJnz (_, lid)) => + let + val ldest = valOf $ D.get labels lid + + val iEnd = + if ldest > iStart andalso ldest < iEnd then + idx + else + iEnd + in + loop (idx + 1) iEnd + end + | _ => loop (idx + 1) iEnd + end + in + loop iEnd iEnd + end + + fun computeIntLocal (s, e) ops labels = + let + val e = extendEnd (s, e) ops labels + in + (s, e) + end + + fun getBasicInt [] _ = raise Unreachable + | getBasicInt defs [] = (List.last defs, hd defs + 1) + | getBasicInt defs use = + let + val (firstDef, lastDef) = (List.last defs, hd defs) + val (firstUse, lastUse) = (List.last use, hd use) + + val first = if firstDef < firstUse then firstDef else firstUse - 1 + val last = if lastDef < lastUse then lastUse else lastDef + 1 + in + (first, last) + end + + fun computeInt (I.Fi { vregs, ops, localBound, labels, ... }) var = + let + val { defs, use, ... } = D.get vregs var + val (iStart, iEnd) = getBasicInt defs use + + val (iStart, iEnd) = + if var < localBound then + computeIntLocal (iStart, iEnd) ops labels + else + (iStart, iEnd) + in + (var, iStart, iEnd) + end + + fun computeInts (F as I.Fi { vregs, ... }) vars = + List.map (computeInt F) vars + + fun printInts ints = + let + val () = printfn `"\nintervals:\n" % + fun p (id, s, e) = printfn `"id: %" I id `" {" I s `", " I e `"}" % + in + List.app p ints + end + + + fun regAlloc (F as I.Fi { vregs, labels, ... }) = + let + val varsForAlloc = getVarsForAlloc vregs + val () = printfn `"for alloc: " Plist i varsForAlloc (", ", true, 0) % + + val intervals = computeInts F varsForAlloc + + val () = printInts intervals + in + raise Unimplemented + end + + fun emitFunc (F as I.Fi { vregs, ... }) = + let + val () = regAlloc F vregs + in + raise Unimplemented + end + fun openFile fname = file := SOME (TextIO.openOut fname) fun emit fname - (I.Ctx { globSyms, extSyms, objsZI, objs, strlits, ... }) = + (I.Ctx { globSyms, extSyms, objsZI, objs, strlits, funcInfos, ... }) = let val () = openFile fname @@ -134,6 +246,8 @@ functor Emit(I: IL) = struct val () = handleData objs val () = handleStrlits strlits val () = handleLocalIniLayouts () + + val () = List.app emitFunc funcInfos in () end |