summaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/Regalloc.ml10
1 files changed, 8 insertions, 2 deletions
diff --git a/backend/Regalloc.ml b/backend/Regalloc.ml
index fe981e3..179b2cc 100644
--- a/backend/Regalloc.ml
+++ b/backend/Regalloc.ml
@@ -314,8 +314,11 @@ let dce_instr instr after k =
then instr :: k
else k
| Xparmove(srcs, dsts, itmp, ftmp) ->
- let (srcs', dsts') = dce_parmove srcs dsts after in
- Xparmove(srcs', dsts', itmp, ftmp) :: k
+ begin match dce_parmove srcs dsts after with
+ | ([], []) -> k
+ | ([src], [dst]) -> Xmove(src, dst) :: k
+ | (srcs', dsts') -> Xparmove(srcs', dsts', itmp, ftmp) :: k
+ end
| Xop(op, args, res) ->
if VSet.mem res after
then instr :: k
@@ -537,6 +540,9 @@ let find_coloring f liveness =
PTree.fold
(fun () pc blk -> ignore (add_interfs_block g blk (PMap.get pc liveness)))
f.fn_code ();
+ add_interfs_destroyed g
+ (transfer_live f f.fn_entrypoint (PMap.get f.fn_entrypoint liveness))
+ destroyed_at_function_entry;
IRC.coloring g