X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/6ade8b0a3251e44b34c6bdbbd9403e36d6fd6231..141a7120aec6ddf3ab097f275498d8e3a1b90401:/codegen/colororder.sml diff --git a/codegen/colororder.sml b/codegen/colororder.sml index 0f25863..f1a724b 100644 --- a/codegen/colororder.sml +++ b/codegen/colororder.sml @@ -7,7 +7,7 @@ signature COLORORDER = sig structure OperSet : ORD_SET - where type Key.ord_key = x86.oper + where type Key.ord_key = Blarg.oper structure LiveMap : ORD_MAP where type Key.ord_key = int structure TempMap : ORD_MAP @@ -22,7 +22,7 @@ end structure ColorOrder :> COLORORDER = struct structure T = Temp - structure X = x86 + structure X = Blarg structure OperSet = Igraph.OperSet structure LiveMap = Igraph.LiveMap @@ -35,15 +35,25 @@ struct let val initialWeights = TempMap.mapi (fn (t, _) => (t, 0)) graph - fun sortWeights weights = (* Sort the weights such that the largest is at left, ready to be grabbed. *) - ListMergeSort.sort (fn ((_, a), (_, b)) => a < b) weights - (* Chooses one temporary to pick, and updates the weights. *) fun orderOne (weights : (Temp.temp * int) list) : Temp.temp * (Temp.temp * int) list = let - val sorted = sortWeights weights - val (chosen, w) = List.hd sorted (* Grab the temp with the highest weight. *) - val remaining = List.tl sorted + val (chosen, w) = + foldr + (fn ((t1, w1), (t2, w2)) => + if (w2 > w1) + then (t2, w2) + else (t1, w1)) + (Temp.new "emarnus", ~9999) + weights + + fun ditchOne f nil = nil (* Special case of filter, which bails out after it removes one. *) + | ditchOne f (h::l) = + if f h + then l + else h::(ditchOne f l) + val remaining = ditchOne (fn (t, w) => Temp.eq (t, chosen)) weights + val neighbors = (* Grab all the neighbors for some given temp. *) (OperSet.listItems (valOf (TempMap.find (graph, chosen))))