fixpoint
.
Comme l'algo du poly, ce code est structuré selon une boucle.
let fixpoint g = let encore = ref true and niters = ref 0 in … while !encore do encore := false ; niters := !niters + 1 ; Pour tous les sommets de g do Calculer les In et les Out selon les formules done encore := Quelque chose a changé done ; !niters (* retourner le nombre total d'itérations effectuées *) |
(* Calcul des live-in/out par point fixe *) let fixpoint g = let encore = ref true and niters = ref 0 in (* Récupérer tous les sommets (dans l'ordre inverse de l'exécution ici) *) let nodes = List.rev (Graph.nodes g) in while !encore do (* Petit affichage déclenché par l'option « -v » *) if !verbose then begin Printf.fprintf stderr "***** Itération %d *******\n" !niters ; print_flowgraph stderr g end ; niters := !niters + 1 encore := false ; List.iter (* Pour tous les sommets *) (fun node -> let info = Graph.info g node in (* Calculer Ink+1(node) et Outk+1(node) *) let new_out = List.fold_left (fun r to_n -> union (Graph.info g to_n).live_in r) empty (Graph.succ g node) in let new_in = union info.use (diff new_out info.def) in (* Regarder si Outk+1(node) ≢ Outk(node) *) encore := !encore || not (eqset info.live_out new_out) ; info.live_in <- new_in ; info.live_out <- new_out) nodes ; done ; !niters |
Out | (i) = |
|
In(j) |
List.iter
)
procède dans l'ordre inverse de présentation des instructions (à
cause de List.rev
), ce qui accelère notabablement la
convergence.interference
).
Pas de commentaire pour le moment.Ce document a été traduit de LATEX par HEVEA.