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 /sml/trunk/src/MLRISC/ra/liveness.sml
 [smlnj] / sml / trunk / src / MLRISC / ra / liveness.sml

# Diff of /sml/trunk/src/MLRISC/ra/liveness.sml

revision 245, Sat Apr 17 18:47:12 1999 UTC revision 429, Wed Sep 8 09:47:00 1999 UTC
# Line 26  Line 26
26    structure F  = Flowgraph    structure F  = Flowgraph
27    structure SL = SortedList    structure SL = SortedList
28
29    fun error msg = MLRiscErrorMsg.impossible ("Liveness."^msg)    fun error msg = MLRiscErrorMsg.error("Liveness",msg)
30
31    fun prList(l,msg:string) = let    fun prList(l,msg:string) = let
32        fun pr([]) = print "\n"        fun pr([]) = print "\n"
# Line 48  Line 48
48              | listNeq((x:int)::xs,y::ys) = x<>y orelse listNeq(xs,ys)              | listNeq((x:int)::xs,y::ys) = x<>y orelse listNeq(xs,ys)
49              | listNeq _ = true              | listNeq _ = true
50
51            fun uniqMap([],sl) = sl            fun uniqMap sl = SL.uniq(map regmap sl)
| uniqMap(x::xs,sl) = uniqMap(xs,SL.enter(regmap(x),sl))
52
53            fun init ~1 = ()            fun init ~1 = ()
54              | init n  = let              | init n  = let
55                  val F.BBLOCK{blknum,insns,liveIn,...} = Array.sub(blkArr,n)                  val F.BBLOCK{blknum,insns,liveIn,...} = Array.sub(blkArr,n)
56                  fun defuse(insn::insns,def,use) = let                  fun defuse(insn::insns,def,use) = let
57                        val (d,u) = defUse insn                        val (d,u) = defUse insn
58                        val u' = SL.difference(uniqMap(u,[]),def)                        val u' = SL.difference(uniqMap u,def)
59                        val use' = SL.merge(u', use)                        val use' = SL.merge(u', use)
60                        val d' = SL.difference(uniqMap(d,[]),use')                        val d' = SL.difference(uniqMap d,use')
61                      in                      in
62                        defuse(insns, SL.merge(d',def), use')                        defuse(insns, SL.merge(d',def), use')
63                      end                      end
# Line 72  Line 71
71                end                end
72
73            fun outB(F.BBLOCK{succ=ref [], ...}) = false            fun outB(F.BBLOCK{succ=ref [], ...}) = false
74              | outB(F.BBLOCK{succ=ref [F.EXIT _], ...}) = false              | outB(F.BBLOCK{succ=ref [(F.EXIT _,_)], ...}) = false
75              | outB(F.BBLOCK{succ, liveOut,...}) = let              | outB(F.BBLOCK{succ, liveOut,...}) = let
76                  fun inSuccs([], acc) = acc                  fun inSuccs([], acc) = acc
77                    | inSuccs(F.EXIT _::sl, acc) = inSuccs(sl, acc)                    | inSuccs((F.EXIT _,_)::sl, acc) = inSuccs(sl, acc)
78                    | inSuccs(F.BBLOCK{blknum,liveIn,...}::sl, acc) =                    | inSuccs((F.BBLOCK{blknum,liveIn,...},_)::sl, acc) =
79                        inSuccs(sl, SL.merge(regSet(!liveIn), acc))                        inSuccs(sl, SL.merge(regSet(!liveIn), acc))
80                  val liveout = inSuccs(!succ, [])                  val liveout = inSuccs(!succ, [])
81                  val change = listNeq(regSet(!liveOut),liveout)                  val change = listNeq(regSet(!liveOut),liveout)
# Line 98  Line 97
97                val visited = Array.array(M,false)                val visited = Array.array(M,false)
98                fun visit(n, changed) = let                fun visit(n, changed) = let
99                    fun visitSucc([],changed') = changed'                    fun visitSucc([],changed') = changed'
100                      | visitSucc(F.EXIT _::ns, changed') =                      | visitSucc((F.EXIT _,_)::ns, changed') =
101                         visitSucc(ns, changed')                         visitSucc(ns, changed')
102                      | visitSucc(F.BBLOCK{blknum=n, ...}::ns,changed') =                      | visitSucc((F.BBLOCK{blknum=n, ...},_)::ns,changed') =
103                         if Array.sub(visited,n) then visitSucc(ns,changed')                         if Array.sub(visited,n) then visitSucc(ns,changed')
104                         else visitSucc(ns,visit(n,changed'))                         else visitSucc(ns,visit(n,changed'))
105
# Line 132  Line 131
131  end  end
132
133
(*
* \$Log: liveness.sml,v \$
* Revision 1.1.1.1  1998/04/08 18:39:02  george
* Version 110.5
*
*)

Legend:
 Removed from v.245 changed lines Added in v.429