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 3747 - (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 cntIntToReal = ST.newCounter "low-opt:int-to-real"
29 :     val cntUnused = ST.newCounter "low-opt:unused"
30 :     val firstCounter = cntAddNeg
31 :     val lastCounter = cntUnused
32 :    
33 :     structure UnusedElim = UnusedElimFn (
34 :     structure IR = IR
35 :     val cntUnused = cntUnused)
36 :    
37 :     fun useCount (IR.V{useCnt, ...}) = !useCnt
38 :    
39 :     (* adjust a variable's use count *)
40 :     fun incUse (IR.V{useCnt, ...}) = (useCnt := !useCnt + 1)
41 :     fun decUse (IR.V{useCnt, ...}) = (useCnt := !useCnt - 1)
42 :     fun use x = (incUse x; x)
43 :    
44 :     fun getRHSOpt x = (case V.getDef x
45 :     of IR.OP arg => SOME arg
46 :     | _ => NONE
47 :     (* end case *))
48 :    
49 :     (* TODO: tensor selection operations *)
50 :     fun doAssign (lhs, IR.OP rhs) = (case rhs
51 :     of (Op.IAdd, [a, b]) => (case getRHSOpt b
52 :     of SOME(Op.INeg, [c]) => (
53 :     (* rewrite to "a-c" *)
54 :     ST.tick cntAddNeg;
55 :     decUse b;
56 :     SOME[(lhs, IR.OP(Op.ISub, [a, use c]))])
57 :     | _ => NONE
58 :     (* end case *))
59 :     | (Op.ISub, [a, b]) => if IR.Var.same(a, b)
60 :     then ( (* rewrite to 0 *)
61 :     ST.tick cntSubSame;
62 :     decUse a; decUse b;
63 :     SOME[(lhs, IR.LIT(Literal.Int 0))])
64 :     else (case getRHSOpt b
65 :     of SOME(Op.INeg, [c]) => (
66 :     (* rewrite to "a+c" *)
67 :     ST.tick cntSubNeg;
68 :     decUse b;
69 :     SOME[(lhs, IR.OP(Op.IAdd, [a, use c]))])
70 :     | _ => NONE
71 :     (* end case *))
72 :     | (Op.INeg, [a]) => (case getRHSOpt a
73 :     of SOME(Op.INeg, [b]) => (
74 :     (* rewrite to "b" *)
75 :     ST.tick cntNegNeg;
76 :     decUse a;
77 :     SOME[(lhs, IR.VAR(use b))])
78 :     | _ => NONE
79 :     (* end case *))
80 :     | (Op.IntToReal, [a]) => (case V.getDef a
81 :     of IR.LIT(Literal.Int n) => (
82 :     (* rerite to a real literal *)
83 :     ST.tick cntIntToReal;
84 :     decUse a;
85 :     SOME[(lhs, IR.LIT(Literal.Real(RealLit.fromInt n)))])
86 :     | _ => NONE
87 :     (* end case *))
88 :     | _ => NONE
89 :     (* end case *))
90 :     | doAssign _ = NONE
91 :    
92 : jhr 3747 fun doMAssign _ = NONE
93 : jhr 3714
94 :     structure Rewrite = RewriteFn (
95 :     struct
96 :     structure IR = IR
97 :     val doAssign = doAssign
98 :     val doMAssign = doMAssign
99 :     val elimUnusedVars = UnusedElim.reduce
100 :     end)
101 :    
102 :     val transform = Rewrite.transform
103 :    
104 :     end

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