X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/1144856ba9d6018d9922c6ede7e97779a0fe6373..5c79bb689ab446551bc7ec4497e6c9b75582837e:/optimize/optimizer.sml diff --git a/optimize/optimizer.sml b/optimize/optimizer.sml new file mode 100644 index 0000000..fba6485 --- /dev/null +++ b/optimize/optimizer.sml @@ -0,0 +1,76 @@ +signature OPTIMIZER = +sig + datatype optfunc = + IRPROG of (Tree.program -> Tree.program) | + IRFUNC of (Tree.func -> Tree.func) | + IRSTM of (Tree.stm -> Tree.stm list) | + IREXP of (Tree.exp -> Tree.exp) | + PRELIVENESS of (x86.insn list -> x86.insn list) | + FINAL of (x86.insn list -> x86.insn list) + + type optimization = { + shortname : string, + description : string, + func : optfunc + } + + val optimize_ir : optimization list -> Tree.program -> Tree.program + val optimize_preliveness : optimization list -> x86.insn list -> x86.insn list + val optimize_final : optimization list -> x86.insn list -> x86.insn list +end + +structure Optimizer :> OPTIMIZER = +struct + structure T = Tree + + datatype optfunc = + IRPROG of (Tree.program -> Tree.program) | + IRFUNC of (Tree.func -> Tree.func) | + IRSTM of (Tree.stm -> Tree.stm list) | + IREXP of (Tree.exp -> Tree.exp) | + PRELIVENESS of (x86.insn list -> x86.insn list) | + FINAL of (x86.insn list -> x86.insn list) + + type optimization = { + shortname : string, + description : string, + func : optfunc + } + + fun foldfunc f (T.FUNCTION (id, stml)) = T.FUNCTION (id, List.concat (List.map f stml)) + fun expfunc f (T.MOVE (e1, e2)) = [T.MOVE (f e1, f e2)] + | expfunc f (T.RETURN (e, s)) = [T.RETURN (f e, s)] + | expfunc f (T.EFFECT e) = [T.EFFECT (f e)] + | expfunc f (a as T.LABEL _) = [a] + | expfunc f (T.JUMPIFN (e, l)) = [T.JUMPIFN (f e, l)] + | expfunc f (a as T.JUMP _) = [a] + + fun optimize_ir ol prog = + foldr ( + fn (IRPROG f, prog) => f prog + | (IRFUNC f, prog) => List.map f prog + | (IRSTM f, prog) => List.map (foldfunc (f)) prog + | (IREXP f, prog) => List.map (foldfunc (expfunc f)) prog + | (_, prog) => prog) + prog + (map (fn (x : optimization) => #func x) ol) + + fun optimize_preliveness ol assem = + foldr ( + fn (PRELIVENESS f, assem) => f assem + | (_, assem) => assem) + assem + (map (fn (x : optimization) => #func x) ol) + + fun optimize_final ol assem = + foldr ( + fn (FINAL f, assem) => f assem + | (_, assem) => assem) + assem + (map (fn (x : optimization) => #func x) ol) +end + +signature OPTIMIZATION = +sig + val optimizer : Optimizer.optimization +end