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

SCM Repository

[diderot] Annotation of /branches/vis15/src/compiler/low-opt/low-contract.sml
ViewVC logotype

Annotation of /branches/vis15/src/compiler/low-opt/low-contract.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3714 - (view) (download)

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

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