-(* colorizer
- * Gathers tiberium, fires rockets
+(* L3 compiler
+ * colorizer
* colors a graph and returns a list of nodes with associated colors
- * Author: Chris Lu <czl@andrew>
+ * Author: Joshua Wise <jwise@andrew.cmu.edu>
+ * Author: Chris Lu <czl@andrew.cmu.edu>
*)
signature COLORIZER =
sig
- type tiberium = Temp.temp list
+ structure OperSet : ORD_SET
+ where type Key.ord_key = Blarg.oper
+ structure LiveMap : ORD_MAP
+ where type Key.ord_key = int
+ structure TempMap : ORD_MAP
+ where type Key.ord_key = Temp.temp
+
+ type temps = Temp.temp list
type colorlist = (Temp.temp * int) list
- type igraph = (Temp.temp * x86.oper list) list
+ type igraph = OperSet.set TempMap.map
- val colorize : tiberium -> igraph -> colorlist
+ val colorize : temps -> Igraph.graph -> colorlist
end
structure Colorizer :> COLORIZER =
struct
- type tiberium = Temp.temp list
+ structure OperSet = Igraph.OperSet
+ structure LiveMap = Igraph.LiveMap
+ structure TempMap = Igraph.TempMap
+
+ type temps = Temp.temp list
type colorlist = (Temp.temp * int) list
- type igraph = (Temp.temp * x86.oper list) list
+ type igraph = OperSet.set TempMap.map
- structure X = x86
+ structure X = Blarg
(* val color_single : igraph -> Temp.temp * colorlist -> colorlist
* color_single graph (temp, regs) => takes an interference graph, the temp to be colored, and the
* already-colored nodes, colors the temp, and adds it to the list
* this is a helper function for the foldr in colorize
*)
- fun color_single (graph: igraph) (temp, regs) =
+ fun color_single (graph: Igraph.graph) (temp, regs) =
let
- (* Grab the list of interfering operands from the graph *)
- val interfere = case List.find (fn (temp',_) => Temp.compare (temp', temp) = EQUAL) graph
- of SOME(_, l) => l
- | NONE => raise ErrorMsg.InternalError "Temporary not found in graph"
+ (* Grab the set of interfering operands from the graph *)
+ val interfere = case TempMap.find (graph, temp)
+ of SOME(l) => OperSet.listItems l
+ | NONE => []
+(* | NONE => raise ErrorMsg.InternalError "Temporary not found in graph" *)
(* Grab the subset of those that are already colorized *)
val colorized =
List.filter
(fn (t,_) =>
List.exists
- (fn X.TEMP t' => Temp.compare (t, t') = EQUAL
+ (fn X.TEMP t' => Temp.eq (t, t')
| _ => false)
interfere
) regs
(fn (_,i) => i)
colorized)
@ (List.map
- (fn X.REG X.EAX => 0
- | X.REG X.EDX => 3
- | _ => raise ErrorMsg.InternalError "Bad kind of specreg")
+ (fn X.REG a => X.regtonum a
+ | loss => raise ErrorMsg.InternalError ("Bad kind of specreg " ^ (X.pp_oper loss)))
fixeds)
(* Greedy-colorize -- pick the lowest number that isn't used by a neighbor *)
fun greedy i l =
else i
val newcolor = greedy 0 ints
- val () = print (" Assigned color "^(Int.toString newcolor)^" to temp "^(Temp.name temp)^"\n")
+ (* val () = print (" Assigned color "^(Int.toString newcolor)^" to temp "^(Temp.name temp)^"\n") *)
in
(temp, (greedy 0 ints)) :: regs
end
- (* val colorize : tiberium -> igraph -> colorlist
+ (* val colorize : temps -> igraph -> colorlist
* colorizes a graph given the graph representation and the order in which to color
* nodes, returns a list of nodes numbered with their respective color *)
fun colorize order graph = foldl (color_single graph) nil order