aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Coloring.v
diff options
context:
space:
mode:
Diffstat (limited to 'backend/Coloring.v')
-rw-r--r--backend/Coloring.v33
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