diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2008-12-21 13:32:24 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2008-12-21 13:32:24 +0000 |
commit | dc4bed2cf06f46687225275131f411c86c773598 (patch) | |
tree | 9d99e759d906d061b6f213e0b20cb4bd53580ea6 /backend/Coloring.v | |
parent | ec6d00d94bcb1a0adc5c698367634b5e2f370c6e (diff) | |
download | compcert-dc4bed2cf06f46687225275131f411c86c773598.tar.gz compcert-dc4bed2cf06f46687225275131f411c86c773598.zip |
Revised back-end so that only 2 integer registers are reserved for reloading.
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@925 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'backend/Coloring.v')
-rw-r--r-- | backend/Coloring.v | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/backend/Coloring.v b/backend/Coloring.v index 5e91b03c..056aaa51 100644 --- a/backend/Coloring.v +++ b/backend/Coloring.v @@ -110,12 +110,26 @@ Definition add_interf_move if Reg.eq r arg then false else true) res live g. -Definition add_interf_call +Definition add_interf_destroyed (live: Regset.t) (destroyed: list mreg) (g: graph): graph := List.fold_left (fun g mr => Regset.fold graph (fun r g => add_interf_mreg r mr g) live g) destroyed g. +Definition add_interfs_indirect_call + (rfun: reg) (locs: list loc) (g: graph): graph := + List.fold_left + (fun g loc => + match loc with R mr => add_interf_mreg rfun mr g | _ => g end) + locs g. + +Definition add_interf_call + (ros: reg + ident) (locs: list loc) (g: graph): graph := + match ros with + | inl rfun => add_interfs_indirect_call rfun locs g + | inr idfun => g + end. + Fixpoint add_prefs_call (args: list reg) (locs: list loc) (g: graph) {struct args} : graph := match args, locs with @@ -157,18 +171,23 @@ Definition add_edges_instr then add_interf_op dst live g else g | Icall sig ros args res s => - add_prefs_call args (loc_arguments sig) - (add_pref_mreg res (loc_result sig) + let largs := loc_arguments sig in + let lres := loc_result sig in + add_prefs_call args largs + (add_pref_mreg res lres (add_interf_op res live - (add_interf_call - (Regset.remove res live) destroyed_at_call_regs g))) + (add_interf_call ros largs + (add_interf_destroyed + (Regset.remove res live) destroyed_at_call_regs g)))) | Itailcall sig ros args => - add_prefs_call args (loc_arguments sig) g + let largs := loc_arguments sig in + add_prefs_call args largs + (add_interf_call ros largs g) | Ialloc arg res s => add_pref_mreg arg loc_alloc_argument (add_pref_mreg res loc_alloc_result (add_interf_op res live - (add_interf_call + (add_interf_destroyed (Regset.remove res live) destroyed_at_call_regs g))) | Ireturn (Some r) => add_pref_mreg r (loc_result sig) g |