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

SCM Repository

[diderot] Diff of /branches/vis12/src/compiler/high-il/normalize.sml
ViewVC logotype

Diff of /branches/vis12/src/compiler/high-il/normalize.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2172, Sat Feb 23 13:47:05 2013 UTC revision 2173, Sat Feb 23 15:49:20 2013 UTC
# Line 17  Line 17 
17      structure ST = Stats      structure ST = Stats
18    
19    (********** Counters for statistics **********)    (********** Counters for statistics **********)
20        val cntInsideScale          = ST.newCounter "high-opt:inside-scale"
21        val cntInsideOffset         = ST.newCounter "high-opt:inside-offset"
22        val cntInsideNeg            = ST.newCounter "high-opt:inside-meg"
23        val cntInsideCurl           = ST.newCounter "high-opt:inside-curl"
24        val cntInsideDiff           = ST.newCounter "high-opt:inside-diff"
25      val cntProbeAdd             = ST.newCounter "high-opt:probe-add"      val cntProbeAdd             = ST.newCounter "high-opt:probe-add"
26      val cntProbeSub             = ST.newCounter "high-opt:probe-sub"      val cntProbeSub             = ST.newCounter "high-opt:probe-sub"
27      val cntProbeScale           = ST.newCounter "high-opt:probe-scale"      val cntProbeScale           = ST.newCounter "high-opt:probe-scale"
28        val cntProbeOffset          = ST.newCounter "high-opt:probe-offset"
29      val cntProbeNeg             = ST.newCounter "high-opt:probe-neg"      val cntProbeNeg             = ST.newCounter "high-opt:probe-neg"
30        val cntProbeCurl            = ST.newCounter "high-opt:probe-curl"
31      val cntDiffField            = ST.newCounter "high-opt:diff-field"      val cntDiffField            = ST.newCounter "high-opt:diff-field"
32      val cntDiffAdd              = ST.newCounter "high-opt:diff-add"      val cntDiffAdd              = ST.newCounter "high-opt:diff-add"
33      val cntDiffScale            = ST.newCounter "high-opt:diff-scale"      val cntDiffScale            = ST.newCounter "high-opt:diff-scale"
34        val cntDiffOffset           = ST.newCounter "high-opt:diff-offset"
35      val cntDiffNeg              = ST.newCounter "high-opt:diff-neg"      val cntDiffNeg              = ST.newCounter "high-opt:diff-neg"
36      val cntUnused               = ST.newCounter "high-opt:unused"      val cntUnused               = ST.newCounter "high-opt:unused"
37      val firstCounter            = cntProbeAdd      val firstCounter            = cntProbeAdd
# Line 56  Line 64 
64    
65    (* optimize the rhs of an assignment, returning NONE if there is no change *)    (* optimize the rhs of an assignment, returning NONE if there is no change *)
66      fun doRHS (lhs, IL.OP rhs) = (case rhs      fun doRHS (lhs, IL.OP rhs) = (case rhs
67             of (Op.Probe(domTy, rngTy), [f, pos]) => (case getRHS f             of (Op.Inside dim, [pos, f]) => (case getRHS f
68                     of SOME(Op.Field _, _) => NONE (* direct inside test does not need rewrite *)
69                      | SOME(Op.AddField, [f', g']) => raise Fail "inside(f+g)"
70                      | SOME(Op.SubField, [f', g']) => raise Fail "inside(f-g)"
71                      | SOME(Op.ScaleField, [_, f']) => (
72                          ST.tick cntInsideScale;
73                          decUse f;
74                          SOME[(lhs, IL.OP(Op.Inside dim, [pos, use f']))])
75                      | SOME(Op.OffsetField, [f', _]) => (
76                          ST.tick cntInsideOffset;
77                          decUse f;
78                          SOME[(lhs, IL.OP(Op.Inside dim, [pos, use f']))])
79                      | SOME(Op.NegField, [f']) => (
80                          ST.tick cntInsideNeg;
81                          decUse f;
82                          SOME[(lhs, IL.OP(Op.Inside dim, [pos, use f']))])
83                      | SOME(Op.CurlField _, [f']) => (
84                          ST.tick cntInsideCurl;
85                          decUse f;
86                          SOME[(lhs, IL.OP(Op.Inside dim, [pos, use f']))])
87                      | SOME(Op.DiffField, [f']) => (
88                          ST.tick cntInsideDiff;
89                          decUse f;
90                          SOME[(lhs, IL.OP(Op.Inside dim, [pos, use f']))])
91                      | _ => raise Fail(concat[
92                            "inside: bogus field binding ", V.toString f, " = ", IL.vbToString(V.binding f)
93                          ])
94                    (* end case *))
95                | (Op.Probe(domTy, rngTy), [f, pos]) => (case getRHS f
96                   of SOME(Op.Field _, _) => NONE (* direct probe does not need rewrite *)                   of SOME(Op.Field _, _) => NONE (* direct probe does not need rewrite *)
97                    | SOME(Op.AddField, [f', g']) => let                    | SOME(Op.AddField, [f', g']) => let
98                      (* rewrite to (f@pos) + (g@pos) *)                      (* rewrite to (f@pos) + (g@pos) *)
# Line 92  Line 128 
128                        in                        in
129                          ST.tick cntProbeScale;                          ST.tick cntProbeScale;
130                          decUse f;                          decUse f;
                         incUse lhs'; incUse f'; incUse s;  
131                          SOME[                          SOME[
132                              (lhs', IL.OP(Op.Probe(domTy, rngTy), [f', pos])),                              (lhs', IL.OP(Op.Probe(domTy, rngTy), [use f', pos])),
133                              (lhs, IL.OP(Op.Scale rngTy, [s, lhs']))                              (lhs, IL.OP(Op.Scale rngTy, [use s, use lhs']))
134                              ]
135                          end
136                      | SOME(Op.OffsetField, [f', s]) => let
137                        (* rewrite to (f'@pos) + s *)
138                          val lhs' = IL.Var.copy lhs
139                          in
140                            ST.tick cntProbeOffset;
141                            decUse f;
142                            SOME[
143                                (lhs', IL.OP(Op.Probe(domTy, rngTy), [use f', pos])),
144                                (lhs, IL.OP(Op.Add rngTy, [use lhs', use s]))
145                            ]                            ]
146                        end                        end
147                    | SOME(Op.NegField, [f']) => let                    | SOME(Op.NegField, [f']) => let
# Line 123  Line 169 
169                              val m10 = IL.Var.new("m_10", Ty.realTy)                              val m10 = IL.Var.new("m_10", Ty.realTy)
170                              val m01 = IL.Var.new("m_01", Ty.realTy)                              val m01 = IL.Var.new("m_01", Ty.realTy)
171                              in                              in
172                                  ST.tick cntProbeCurl;
173                                decUse f;                                decUse f;
174                                SOME[                                SOME[
175                                    (h', IL.OP(Op.Kernel(kernel, k+1), [])),                                    (h', IL.OP(Op.Kernel(kernel, k+1), [])),
# Line 164  Line 211 
211                              val lhs1 = IL.Var.new("lhs1", Ty.realTy)                              val lhs1 = IL.Var.new("lhs1", Ty.realTy)
212                              val lhs2 = IL.Var.new("lhs2", Ty.realTy)                              val lhs2 = IL.Var.new("lhs2", Ty.realTy)
213                              in                              in
214                                  ST.tick cntProbeCurl;
215                                decUse f;                                decUse f;
216                                SOME[                                SOME[
217                                    (h', IL.OP(Op.Kernel(kernel, k+1), [])),                                    (h', IL.OP(Op.Kernel(kernel, k+1), [])),
# Line 185  Line 233 
233                                  ]                                  ]
234                              end                              end
235                          | _ => raise Fail(concat[                          | _ => raise Fail(concat[
236                                "bogus field binding ", V.toString f', " = ", IL.vbToString(V.binding f')                                "curl: bogus field binding ", V.toString f', " = ", IL.vbToString(V.binding f')
237                              ])                              ])
238                        (* end case *))                        (* end case *))
239                      | SOME(Op.DiffField, _) => NONE (* need further rewriting *)
240                    | _ => raise Fail(concat[                    | _ => raise Fail(concat[
241                          "bogus field binding ", V.toString f, " = ", IL.vbToString(V.binding f)                          "probe: bogus field binding ", V.toString f, " = ", IL.vbToString(V.binding f)
242                        ])                        ])
243                  (* end case *))                  (* end case *))
244              | (Op.DiffField, [f]) => (case (getRHS f)              | (Op.DiffField, [f]) => (case (getRHS f)
# Line 219  Line 268 
268                              (lhs, IL.OP(Op.ScaleField, [s, lhs']))                              (lhs, IL.OP(Op.ScaleField, [s, lhs']))
269                            ]                            ]
270                        end                        end
271                      | SOME(Op.OffsetField, [f', s]) => (
272                        (* rewrite to (D f) *)
273                          ST.tick cntDiffOffset;
274                          decUse f;
275                          SOME[(lhs, IL.OP(Op.DiffField, [use f']))])
276                    | SOME(Op.NegField, [f']) => let                    | SOME(Op.NegField, [f']) => let
277                      (* rewrite to -(D f') *)                      (* rewrite to -(D f') *)
278                        val lhs' = IL.Var.copy lhs                        val lhs' = IL.Var.copy lhs

Legend:
Removed from v.2172  
changed lines
  Added in v.2173

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