aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Regalloc.ml
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2016-09-15 12:32:26 +0200
committerBernhard Schommer <bernhardschommer@gmail.com>2016-09-15 12:37:02 +0200
commit6f2b5713f8e378e6e074f35a537e86a497c64e35 (patch)
tree87d80f8a4dd0de1f0594fc67c48ff26a58c68056 /backend/Regalloc.ml
parent9124c9231c11effae6e32d73c6c8af7c4032f928 (diff)
downloadcompcert-kvx-6f2b5713f8e378e6e074f35a537e86a497c64e35.tar.gz
compcert-kvx-6f2b5713f8e378e6e074f35a537e86a497c64e35.zip
Add interference for indirect calls.
Avoids problems with overwritting the registe containing the function address. Bug 19779
Diffstat (limited to 'backend/Regalloc.ml')
-rw-r--r--backend/Regalloc.ml5
1 files changed, 4 insertions, 1 deletions
diff --git a/backend/Regalloc.ml b/backend/Regalloc.ml
index 0013d91a..b91bad27 100644
--- a/backend/Regalloc.ml
+++ b/backend/Regalloc.ml
@@ -657,9 +657,12 @@ let add_interfs_instr g instr live =
| Xstore(chunk, addr, args, src) ->
add_interfs_destroyed g live (destroyed_by_store chunk addr)
| Xcall(sg, vos, args, res) ->
+ begin match vos with
+ | Coq_inl v -> List.iter (fun r -> IRC.add_interf g (vmreg r) v) destroyed_at_indirect_call
+ | _ -> () end;
add_interfs_destroyed g (vset_removelist res live) destroyed_at_call
| Xtailcall(sg, Coq_inl v, args) ->
- List.iter (fun r -> IRC.add_interf g (vmreg r) v) int_callee_save_regs
+ List.iter (fun r -> IRC.add_interf g (vmreg r) v) (int_callee_save_regs @ destroyed_at_indirect_call)
| Xtailcall(sg, Coq_inr id, args) ->
()
| Xbuiltin(ef, args, res) ->