diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2009-08-16 12:39:37 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2009-08-16 12:39:37 +0000 |
commit | 40e4daa2287891f9ee1b0e6d811a2b54c567f95d (patch) | |
tree | 563301c54a9747d1de742c744dc5f1901fdccafc | |
parent | bdc7b815d033f84e5538a1c8db87d3c061b1ca4c (diff) |
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.ml | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/backend/Coloringaux.ml b/backend/Coloringaux.ml index 19efe43..7b61645 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) |