Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /MLRISC/trunk/gc-safety/gc-liveness.sml
ViewVC logotype

Diff of /MLRISC/trunk/gc-safety/gc-liveness.sml

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

revision 475, Wed Nov 10 22:59:58 1999 UTC revision 498, Tue Dec 7 15:44:50 1999 UTC
# Line 27  Line 27 
27            val  forward = false            val  forward = false
28            val  bot     = R.empty            val  bot     = R.empty
29            val  ==      = R.==            val  ==      = R.==
30            val join     = R.meets            val join     = R.joins
31            type dataflow_info =            type dataflow_info =
32                  (C.cell -> GC.gctype) *                  (C.cell -> GC.gctype) *
33                  (C.cell -> C.cell) *                  (C.cell -> C.cell) *
# Line 35  Line 35 
35            fun mk(gcmap,regmap,regs) =            fun mk(gcmap,regmap,regs) =
36                R.fromList(map (fn r => (regmap r,gcmap r)) regs)                R.fromList(map (fn r => (regmap r,gcmap r)) regs)
37    
38            fun liveOut(gcmap,regmap,b) =            fun liveOut(gcmap,regmap,b as CFG.BLOCK{id,...}) =
39            let val cellset = CFG.liveOut(b)            let val cellset = CFG.liveOut(b)
40                val regs    = C.cellsetToCells cellset                val regs    = C.cellsetToCells cellset
41            in  mk(gcmap,regmap,regs)            in  mk(gcmap,regmap,regs)
# Line 49  Line 49 
49                  | loop(i::is,def,use) =                  | loop(i::is,def,use) =
50                    let val (d1,u1) = defUseR i                    let val (d1,u1) = defUseR i
51                        val (d2,u2) = defUseF i                        val (d2,u2) = defUseF i
52                        val d' = mk(gcmap,regmap,d1 @ d2)                        val d = mk(gcmap,regmap,d1 @ d2)
53                        val u' = mk(gcmap,regmap,u1 @ u2)                        val u = mk(gcmap,regmap,u1 @ u2)
54                        val use = R.gen(R.kill(use,d'),u')                        (* val _ = print("d="^R.toString d^" ")
55                        val def = R.kill(R.gen(def,d'),u')                        val _ = print("u="^R.toString u^"\n")
56                          val _ = print("use-d="^R.toString(R.kill(use,d))^"\n")*)
57                          val use = R.gen(R.kill(use,d),u)
58                          val def = R.kill(R.gen(def,d),u)
59                          (*val _ = print("def="^R.toString def^" ")
60                          val _ = print("use="^R.toString use^"\n") *)
61                    in  loop(is,def,use)                    in  loop(is,def,use)
62                    end                    end
63            in  loop(!insns,R.empty,R.empty) end            in  loop(!insns,R.empty,R.empty) end
# Line 60  Line 65 
65            fun prologue (_,(gcmap,regmap,_)) (b,b') =            fun prologue (_,(gcmap,regmap,_)) (b,b') =
66            let val (def,use) = scan(gcmap,regmap,b')            let val (def,use) = scan(gcmap,regmap,b')
67                val liveOut   = liveOut(gcmap,regmap,b')                val liveOut   = liveOut(gcmap,regmap,b')
68            in  { input    = liveOut,            in  (* print("Liveout("^Int.toString b^")="^R.toString liveOut^"\n");
69                  print("def("^Int.toString b^")="^R.toString def^"\n");
70                  print("use("^Int.toString b^")="^R.toString use^"\n"); *)
71                  { input    = liveOut,
72                  output   = R.gen(R.kill(liveOut,def),use),                  output   = R.gen(R.kill(liveOut,def),use),
73                  transfer = fn liveOut => R.gen(R.kill(liveOut,def),use)                  transfer = fn liveOut => R.gen(R.kill(liveOut,def),use)
74                }                }
75            end            end
76            fun epilogue (_,(_,_,table))            fun epilogue (_,(_,_,table))
77                {node=(b,_), input=liveOut, output=liveIn } =                {node=(b,_), input=liveOut, output=liveIn } =
78                   ((* print("Livein("^Int.toString b^")="^R.toString liveIn^"\n");
79                    print("Liveout("^Int.toString b^")="^R.toString liveOut^"\n");*)
80                  A.update(table,b,{liveIn=liveIn,liveOut=liveOut})                  A.update(table,b,{liveIn=liveIn,liveOut=liveOut})
81           )           )
82             )
83    
84    fun liveness (IR as G.GRAPH cfg) =    fun liveness (IR as G.GRAPH cfg) =
85    let val an = CFG.getAnnotations IR    let val an = CFG.getAnnotations IR

Legend:
Removed from v.475  
changed lines
  Added in v.498

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