Eviter les spills preventifs 'impossibles'

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1872 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Xavier Leroy 1998-02-13 16:32:32 +00:00
parent c7f9a3da96
commit 01b52f7c7f
1 changed files with 10 additions and 5 deletions

View File

@ -87,9 +87,10 @@ let add_superpressure_regs op live_regs res_regs spilled =
let lru_date = ref 1000000 and lru_reg = ref Reg.dummy in
Reg.Set.iter
(fun r ->
if Proc.register_class r = cl &
not (Reg.Set.mem r spilled) &
r.loc = Unknown then begin
if Proc.register_class r = cl &&
not (Reg.Set.mem r spilled) &&
r.loc = Unknown
then begin
try
let d = Reg.Map.find r !use_date in
if d < !lru_date then begin
@ -100,8 +101,12 @@ let add_superpressure_regs op live_regs res_regs spilled =
()
end)
live_regs;
pressure.(cl) <- pressure.(cl) - 1;
check_pressure cl (Reg.Set.add !lru_reg spilled)
if !lru_reg != Reg.dummy then begin
pressure.(cl) <- pressure.(cl) - 1;
check_pressure cl (Reg.Set.add !lru_reg spilled)
end else
(* Couldn't find any spillable register, give up for this class *)
check_pressure (cl+1) spilled
end in
check_pressure 0 spilled