From 2185164c1845c30ebd4118ed5bc8d339b16663a9 Mon Sep 17 00:00:00 2001 From: Bernhard Schommer Date: Tue, 15 Mar 2016 12:55:31 +0100 Subject: Added back invariant checks for IRC. Since the invariant checks are not currently used and they are not exported they are renamed to include a _ to avoid warning. Bug 18394 --- backend/IRC.ml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'backend/IRC.ml') diff --git a/backend/IRC.ml b/backend/IRC.ml index 8780bce3..76f194d2 100644 --- a/backend/IRC.ml +++ b/backend/IRC.ml @@ -451,6 +451,42 @@ let initialNodePartition g = | _ -> assert false in Hashtbl.iter (fun _ a -> part_node a) g.varTable +(* Check invariants *) + +let _degreeInvariant _ n = + let c = ref 0 in + iterAdjacent (fun _ -> incr c) n; + if !c <> n.degree then + failwith("degree invariant violated by " ^ name_of_node n) + +let _simplifyWorklistInvariant g n = + if n.degree < g.num_available_registers.(n.regclass) + && not (moveRelated n) + then () + else failwith("simplify worklist invariant violated by " ^ name_of_node n) + +let _freezeWorklistInvariant g n = + if n.degree < g.num_available_registers.(n.regclass) + && moveRelated n + then () + else failwith("freeze worklist invariant violated by " ^ name_of_node n) + +let _spillWorklistInvariant g n = + if n.degree >= g.num_available_registers.(n.regclass) + then () + else failwith("spill worklist invariant violated by " ^ name_of_node n) + +let _checkInvariants g = + DLinkNode.iter + (fun n -> _degreeInvariant g n; _simplifyWorklistInvariant g n) + g.simplifyWorklist; + DLinkNode.iter + (fun n -> _degreeInvariant g n; _freezeWorklistInvariant g n) + g.freezeWorklist; + DLinkNode.iter + (fun n -> _degreeInvariant g n; _spillWorklistInvariant g n) + g.spillWorklist + (* Enable moves that have become low-degree related *) let enableMoves g n = -- cgit