Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/vis12/src/compiler/mid-il/mid-contract.sml
ViewVC logotype

Annotation of /branches/vis12/src/compiler/mid-il/mid-contract.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3291 - (view) (download)

1 : jhr 1640 (* mid-contract.sml
2 :     *
3 : jhr 3291 * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     *
5 :     * COPYRIGHT (c) 2015 The University of Chicago
6 : jhr 1640 * All rights reserved.
7 :     *
8 :     * Contraction phase for MidIL.
9 :     *)
10 :    
11 :     structure MidContract : sig
12 :    
13 :     val transform : MidIL.program -> MidIL.program
14 :    
15 :     end = struct
16 :    
17 :     structure IL = MidIL
18 :     structure Op = MidOps
19 : jhr 2200 structure Ty = MidILTypes
20 : jhr 1640 structure V = IL.Var
21 :     structure ST = Stats
22 :    
23 :     (********** Counters for statistics **********)
24 : jhr 2206 val cntAddNeg = ST.newCounter "mid-opt:add-neg"
25 :     val cntSubNeg = ST.newCounter "mid-opt:sub-neg"
26 :     val cntSubSame = ST.newCounter "mid-opt:sub-same"
27 :     val cntNegNeg = ST.newCounter "mid-opt:neg-neg"
28 :     val cntEigenVals = ST.newCounter "mid-opt:eigen-vals"
29 : jhr 2813 val cntIntToReal = ST.newCounter "mid-opt:int-to-real"
30 : jhr 2206 val cntUnused = ST.newCounter "mid-opt:unused"
31 : jhr 2200 val firstCounter = cntAddNeg
32 : jhr 1640 val lastCounter = cntUnused
33 :    
34 :     structure UnusedElim = UnusedElimFn (
35 : jhr 2206 structure IL = IL
36 :     val cntUnused = cntUnused)
37 : jhr 1640
38 :     fun useCount (IL.V{useCnt, ...}) = !useCnt
39 :    
40 :     (* adjust a variable's use count *)
41 :     fun incUse (IL.V{useCnt, ...}) = (useCnt := !useCnt + 1)
42 :     fun decUse (IL.V{useCnt, ...}) = (useCnt := !useCnt - 1)
43 : jhr 2200 fun use x = (incUse x; x)
44 : jhr 1640
45 : jhr 2200 fun getRHS x = (case V.binding x
46 : jhr 2813 of IL.VB_RHS(IL.VAR x') => getRHS x'
47 : jhr 2805 | IL.VB_RHS(IL.GLOBAL x') => getRHS(IL.GlobalVar.binding x')
48 : jhr 2813 | IL.VB_RHS rhs => SOME rhs
49 : jhr 2206 | _ => NONE
50 :     (* end case *))
51 : jhr 1640
52 : jhr 2813 fun getRHSOpt x = (case getRHS x
53 :     of SOME(IL.OP arg) => SOME arg
54 :     | _ => NONE
55 :     (* end case *))
56 :    
57 : jhr 2200 fun doAssign (lhs, IL.OP rhs) = (case rhs
58 : jhr 2813 of (Op.Add ty, [a, b]) => (case getRHSOpt b
59 : jhr 2206 of SOME(Op.Neg _, [c]) => (
60 :     (* rewrite to "a-c" *)
61 :     ST.tick cntAddNeg;
62 :     decUse b;
63 :     SOME[(lhs, IL.OP(Op.Sub ty, [a, use c]))])
64 :     | _ => NONE
65 :     (* end case *))
66 :     | (Op.Sub ty, [a, b]) => if IL.Var.same(a, b)
67 :     then ( (* rewrite to 0 *)
68 :     ST.tick cntSubSame;
69 :     decUse a; decUse b;
70 :     case ty
71 :     of Ty.IntTy => SOME[(lhs, IL.LIT(Literal.Int 0))]
72 :     | Ty.TensorTy[] => SOME[(lhs, IL.LIT(Literal.Float(FloatLit.zero false)))]
73 :     | _ => (incUse a; incUse b; NONE) (* FIXME: should handle arbitrary tensors *)
74 :     (* end case *))
75 : jhr 2813 else (case getRHSOpt b
76 : jhr 2206 of SOME(Op.Neg _, [c]) => (
77 :     (* rewrite to "a+c" *)
78 :     ST.tick cntSubNeg;
79 :     decUse b;
80 :     SOME[(lhs, IL.OP(Op.Add ty, [a, use c]))])
81 :     | _ => NONE
82 : jhr 2813 (* end case *))
83 :     | (Op.Neg ty, [a]) => (case getRHSOpt a
84 : jhr 2206 of SOME(Op.Neg _, [b]) => (
85 :     (* rewrite to "b" *)
86 :     ST.tick cntNegNeg;
87 :     decUse a;
88 :     SOME[(lhs, IL.VAR(use b))])
89 :     | _ => NONE
90 : jhr 2813 (* end case *))
91 :     | (Op.IntToReal, [a]) => (case getRHS a
92 :     of SOME(IL.LIT(Literal.Int n)) => (
93 :     (* rerite to a real literal *)
94 :     ST.tick cntIntToReal;
95 :     decUse a;
96 :     SOME[(lhs, IL.LIT(Literal.Float(FloatLit.fromInt n)))])
97 :     | _ => NONE
98 :     (* end case *))
99 : jhr 2206 | _ => NONE
100 :     (* end case *))
101 : jhr 2200 | doAssign _ = NONE
102 : jhr 1640
103 : jhr 2200 fun doMAssign (ys, rator, xs) = (case (ys, rator)
104 : jhr 2206 of ([vals, vecs], Op.EigenVecs2x2) =>
105 :     if (useCount vecs = 0)
106 :     then (
107 :     ST.tick cntEigenVals;
108 :     SOME[(vals, IL.OP(Op.EigenVals2x2, xs))])
109 :     else NONE
110 :     | ([vals, vecs], Op.EigenVecs3x3) =>
111 :     if (useCount vecs = 0)
112 :     then (
113 :     ST.tick cntEigenVals;
114 :     SOME[(vals, IL.OP(Op.EigenVals3x3, xs))])
115 :     else NONE
116 :     | _ => NONE
117 :     (* end case *))
118 : jhr 1640
119 : jhr 2200 structure Rewrite = RewriteFn (
120 :     struct
121 : jhr 2206 structure IL = IL
122 :     val doAssign = doAssign
123 :     val doMAssign = doMAssign
124 :     val elimUnusedVars = UnusedElim.reduce
125 : jhr 2200 end)
126 :    
127 :     val transform = Rewrite.transform
128 :    
129 : jhr 1640 end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0