summaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2013-05-27 13:22:32 +0000
committerGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2013-05-27 13:22:32 +0000
commit85c3c92d4ea73393ee67da8f3b811d221b4e06f5 (patch)
tree9484e5cff6f4fc1f36cc16351fd1d3808f6b167c /backend
parentff63a02431cb601eee8987730891ed036517e5a9 (diff)
Hunting stack overflows again:
PrintLTL: List.map -> List.rev_map IRC: @ -> List.rev_append + don't maintain "extra" lists on precolored nodes. git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2262 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'backend')
-rw-r--r--backend/IRC.ml8
-rw-r--r--backend/PrintLTL.ml2
2 files changed, 6 insertions, 4 deletions
diff --git a/backend/IRC.ml b/backend/IRC.ml
index 79d66b9..64de4e4 100644
--- a/backend/IRC.ml
+++ b/backend/IRC.ml
@@ -640,13 +640,15 @@ let combine g u v =
else DLinkNode.move v g.spillWorklist g.coalescedNodes;
v.alias <- Some u;
(* Precolored nodes often have big movelists, and if one of [u] and [v]
- is precolored, it is []u. So, append [v.movelist] to [u.movelist]
+ is precolored, it is [u]. So, append [v.movelist] to [u.movelist]
instead of the other way around. *)
u.movelist <- List.rev_append v.movelist u.movelist;
u.spillcost <- u.spillcost +. v.spillcost;
iterAdjacent (combineEdge g u) v; (*r original code using [decrementDegree] is buggy *)
- u.extra_adj <- u.extra_adj @ v.extra_adj;
- u.extra_pref <- u.extra_pref @ v.extra_pref;
+ if u.nstate <> Colored then begin
+ u.extra_adj <- List.rev_append v.extra_adj u.extra_adj;
+ u.extra_pref <- List.rev_append v.extra_pref u.extra_pref
+ end;
enableMoves g v; (*r added as per Appel's book erratum *)
if u.degree >= g.num_available_registers.(u.regclass)
&& u.nstate = FreezeWorklist
diff --git a/backend/PrintLTL.ml b/backend/PrintLTL.ml
index 1149dd0..702c213 100644
--- a/backend/PrintLTL.ml
+++ b/backend/PrintLTL.ml
@@ -117,7 +117,7 @@ let print_function pp id f =
let instrs =
List.sort
(fun (pc1, _) (pc2, _) -> Pervasives.compare pc2 pc1)
- (List.map
+ (List.rev_map
(fun (pc, i) -> (P.to_int32 pc, i))
(PTree.elements f.fn_code)) in
print_succ pp f.fn_entrypoint