aboutsummaryrefslogtreecommitdiffstats
path: root/backend
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2021-04-02 11:44:42 +0200
committerCyril SIX <cyril.six@kalray.eu>2021-04-02 11:44:42 +0200
commitb042bca17696a9cb6e2be7bbdac9f08953fff527 (patch)
treebc3e2c08de99ae355cee613041a7f17f6ad57acc /backend
parent6ee3ecb0edc17d61a515054952827c495cc03979 (diff)
downloadcompcert-kvx-b042bca17696a9cb6e2be7bbdac9f08953fff527.tar.gz
compcert-kvx-b042bca17696a9cb6e2be7bbdac9f08953fff527.zip
get_loop_headers simplification (using the new get_loop_backedges)
Diffstat (limited to 'backend')
-rw-r--r--backend/LICMaux.ml46
1 files changed, 7 insertions, 39 deletions
diff --git a/backend/LICMaux.ml b/backend/LICMaux.ml
index 96e8e8ae..b88dbc2d 100644
--- a/backend/LICMaux.ml
+++ b/backend/LICMaux.ml
@@ -41,45 +41,6 @@ let rtl_successors = function
*
* If we come accross an edge to a Processed node, it's a loop!
*)
-let get_loop_headers code entrypoint = begin
- debug "get_loop_headers\n";
- let visited = ref (PTree.map (fun n i -> Unvisited) code)
- and is_loop_header = ref (PTree.map (fun n i -> false) code)
- in let rec dfs_visit code = function
- | [] -> ()
- | node :: ln ->
- debug "ENTERING node %d, REM are %a\n" (P.to_int node) print_intlist ln;
- match (get_some @@ PTree.get node !visited) with
- | Visited -> begin
- debug "\tNode %d is already Visited, skipping\n" (P.to_int node);
- dfs_visit code ln
- end
- | Processed -> begin
- debug "Node %d is a loop header\n" (P.to_int node);
- is_loop_header := PTree.set node true !is_loop_header;
- visited := PTree.set node Visited !visited;
- dfs_visit code ln
- end
- | Unvisited -> begin
- visited := PTree.set node Processed !visited;
- debug "Node %d is Processed\n" (P.to_int node);
- (match PTree.get node code with
- | None -> failwith "No such node"
- | Some i -> let next_visits = rtl_successors i in begin
- debug "About to visit: %a\n" print_intlist next_visits;
- dfs_visit code next_visits
- end);
- debug "Node %d is Visited!\n" (P.to_int node);
- visited := PTree.set node Visited !visited;
- dfs_visit code ln
- end
- in begin
- dfs_visit code [entrypoint];
- debug "LOOP HEADERS: %a\n" print_ptree_bool !is_loop_header;
- !is_loop_header
- end
-end
-
let get_loop_backedges code entrypoint = begin
debug "get_loop_backedges\n";
let visited = ref (PTree.map (fun n i -> Unvisited) code)
@@ -120,6 +81,13 @@ let get_loop_backedges code entrypoint = begin
end
end
+let get_loop_headers code entrypoint =
+ let backedges = get_loop_backedges code entrypoint in
+ PTree.map (fun _ ob ->
+ match ob with
+ | None -> false
+ | Some _ -> true
+ ) backedges
module Dominator =
struct