]>
Commit | Line | Data |
---|---|---|
1 | signature OPTIMIZER = | |
2 | sig | |
3 | datatype optfunc = | |
4 | IRPROG of (Tree.program -> Tree.program) | | |
5 | IRFUNC of (Tree.func -> Tree.func) | | |
6 | IRSTM of (Tree.stm -> Tree.stm list) | | |
7 | IREXP of (Tree.exp -> Tree.exp) | | |
8 | PRELIVENESS of (x86.insn list -> x86.insn list) | | |
9 | FINAL of (x86.insn list -> x86.insn list) | |
10 | ||
11 | type optimization = { | |
12 | shortname : string, | |
13 | description : string, | |
14 | func : optfunc | |
15 | } | |
16 | ||
17 | val optimize_ir : optimization list -> Tree.program -> Tree.program | |
18 | val optimize_preliveness : optimization list -> x86.insn list -> x86.insn list | |
19 | val optimize_final : optimization list -> x86.insn list -> x86.insn list | |
20 | end | |
21 | ||
22 | structure Optimizer :> OPTIMIZER = | |
23 | struct | |
24 | structure T = Tree | |
25 | ||
26 | datatype optfunc = | |
27 | IRPROG of (Tree.program -> Tree.program) | | |
28 | IRFUNC of (Tree.func -> Tree.func) | | |
29 | IRSTM of (Tree.stm -> Tree.stm list) | | |
30 | IREXP of (Tree.exp -> Tree.exp) | | |
31 | PRELIVENESS of (x86.insn list -> x86.insn list) | | |
32 | FINAL of (x86.insn list -> x86.insn list) | |
33 | ||
34 | type optimization = { | |
35 | shortname : string, | |
36 | description : string, | |
37 | func : optfunc | |
38 | } | |
39 | ||
40 | fun foldfunc f (T.FUNCTION (id, stml)) = T.FUNCTION (id, List.concat (List.map f stml)) | |
41 | fun expfunc f (T.MOVE (e1, e2)) = [T.MOVE (f e1, f e2)] | |
42 | | expfunc f (T.RETURN (e, s)) = [T.RETURN (f e, s)] | |
43 | | expfunc f (T.EFFECT e) = [T.EFFECT (f e)] | |
44 | | expfunc f (a as T.LABEL _) = [a] | |
45 | | expfunc f (T.JUMPIFN (e, l)) = [T.JUMPIFN (f e, l)] | |
46 | | expfunc f (a as T.JUMP _) = [a] | |
47 | ||
48 | fun optimize_ir ol prog = | |
49 | foldr ( | |
50 | fn (IRPROG f, prog) => f prog | |
51 | | (IRFUNC f, prog) => List.map f prog | |
52 | | (IRSTM f, prog) => List.map (foldfunc (f)) prog | |
53 | | (IREXP f, prog) => List.map (foldfunc (expfunc f)) prog | |
54 | | (_, prog) => prog) | |
55 | prog | |
56 | (map (fn (x : optimization) => #func x) ol) | |
57 | ||
58 | fun optimize_preliveness ol assem = | |
59 | foldr ( | |
60 | fn (PRELIVENESS f, assem) => f assem | |
61 | | (_, assem) => assem) | |
62 | assem | |
63 | (map (fn (x : optimization) => #func x) ol) | |
64 | ||
65 | fun optimize_final ol assem = | |
66 | foldr ( | |
67 | fn (FINAL f, assem) => f assem | |
68 | | (_, assem) => assem) | |
69 | assem | |
70 | (map (fn (x : optimization) => #func x) ol) | |
71 | end | |
72 | ||
73 | signature OPTIMIZATION = | |
74 | sig | |
75 | val optimizer : Optimizer.optimization | |
76 | end |