|
Postscript, | Luc Maranget | Le poly |
|
|
|
|
|
Spill.spill_fun
réécrit le code et alloue des cases
dans le frame (zone des locaux).
val spill_fun : Ass.temp Smallset.set -> Spim.procedure -> Spim.procedure |
|
|
|
|
|
|
|
|
|
(* Contenu des noeud du graphe d'interférence *) type interference = { temp : temp; (* un temporaire *) (* Les champs suivants sont utiles pour l'allocation de registres *) mutable color : temp option ; mutable degree : int ; mutable elem : ((interference Sgraph.node) Partition.elem) option ; mutable occurs : int ; } |
|
type 'a t (* type des sous-ensembles de la partition *) type 'a elem (* type des éléments *) val make : int -> 'a t array (* make n créer un vecteur de partitions *) val create : 'a t -> 'a -> 'a elem (* « create s e » créer un élément e dans le sous-ensemble s *) val info : 'a elem -> 'a (* « info e » retourne les informations sur l'élément e *) val belong : 'a elem -> 'a t -> bool (* test d'appartenance *) val move : 'a elem -> 'a t -> unit (* changement de sous-ensemble *) val pick : 'a t -> 'a elem option (* « pick s » renvoie un élément de s, None si s est vide *) |
|
let sets = Partition.make 4 let precolored = sets.(0) and low = sets.(1) and high = sets.(2) and removed = sets.(3) module Mach = Spim (* Mach.registers est la liste des registres machines *) let colors = Smallset.of_list Mach.registers and ncolors = List.length Mach.registers |
|
let build_partition ig = Sgraph.iter ig (fun n -> let i = Sgraph.info ig n in let e = match i.color with | Some r -> Partition.create precolored n | None -> if i.degree < ncolors then Partition.create low n else Partition.create high n in i.elem <- Some e) |
|
let rec colorize ig = match Partition.pick low with | Some e -> (* prendre un sommet de faible degré *) remove ig e ; (* « l'enlever » *) if colorize ig then begin (* colorier le reste du graphe *) let c = choose_color ig e in (* colorier le sommet enlevé *) put_color ig e c ; true end else false | None -> (* low est vide *) match Partition.pick high with | Some _ -> false | None -> true |
|
|
|
let rec colorize ig = match Partition.pick low with | Some e -> (* prendre un sommet de faible degré *) remove ig e ; (* « l'enlever » *) colorize ig ; (* colorier le reste du graphe *) begin choose_color ig e with (* choisir une couleur *) | Some c -> (* colorier *) put_color ig e (Some c) ; Partition.move e colored | None -> (* spiller *) Partition.move e spilled end | None -> (* low est vide *) match select_spill ig with (* selectionner un spill potentiel *) | Some e -> Partition.move e low ; colorize ig (* « l'enlever », continuer *) | None -> () (* graphe vide, c'est fini *) |
|
|
|
let cost ig e = let n = Partition.info e in let i = Sgraph.info ig n in (float i.occurs) /. (float i.degree) +. (if Gen.is_ephemere i.temp then 100.0 else 0.0) let select_spill ig = Partition.pick_lowest (cost ig) high |
|
Ce document a été traduit de LATEX par HEVEA.