aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2009-08-16 12:39:37 +0000
committerxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2009-08-16 12:39:37 +0000
commit40e4daa2287891f9ee1b0e6d811a2b54c567f95d (patch)
tree563301c54a9747d1de742c744dc5f1901fdccafc
parentbdc7b815d033f84e5538a1c8db87d3c061b1ca4c (diff)
downloadcompcert-kvx-40e4daa2287891f9ee1b0e6d811a2b54c567f95d.tar.gz
compcert-kvx-40e4daa2287891f9ee1b0e6d811a2b54c567f95d.zip
Update spill costs when coalescing
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1121 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
-rw-r--r--backend/Coloringaux.ml5
1 files changed, 3 insertions, 2 deletions
diff --git a/backend/Coloringaux.ml b/backend/Coloringaux.ml
index 19efe434..7b61645e 100644
--- a/backend/Coloringaux.ml
+++ b/backend/Coloringaux.ml
@@ -39,7 +39,7 @@ type node =
{ ident: reg; (*r register identifier *)
typ: typ; (*r its type *)
regclass: int; (*r identifier of register class *)
- spillcost: float; (*r estimated cost of spilling *)
+ mutable spillcost: float; (*r estimated cost of spilling *)
mutable adjlist: node list; (*r all nodes it interferes with *)
mutable degree: int; (*r number of adjacent nodes *)
mutable movelist: move list; (*r list of moves it is involved in *)
@@ -427,7 +427,7 @@ let canConservativelyCoalesce n1 n2 =
let consider n =
if not (Regset.mem n.ident !seen) then begin
seen := Regset.add n.ident !seen;
- if n.degree >= k then incr c
+ if n.degree >= k || n.nstate = Colored then incr c
end in
iterAdjacent consider n1;
iterAdjacent consider n2;
@@ -455,6 +455,7 @@ let combine u v =
else DLinkNode.move v spillWorklist coalescedNodes;
v.alias <- Some u;
u.movelist <- u.movelist @ v.movelist;
+ u.spillcost <- u.spillcost +. v.spillcost;
iterAdjacent (combineEdge u) v; (*r original code using [decrementDegree] is buggy *)
enableMoves v; (*r added as per Appel's book erratum *)
if u.degree >= num_available_registers.(u.regclass)