aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2019-12-05 12:41:59 +0100
committerCyril SIX <cyril.six@kalray.eu>2019-12-05 12:41:59 +0100
commit59e9d82827f89f71f955de299cf2bffbf2de81bf (patch)
treee8578647e2d580091b86c38bf1b2fc156f54782f
parent2863726fee9ef741a2456ded7d7bfc15bd8111b4 (diff)
downloadcompcert-kvx-59e9d82827f89f71f955de299cf2bffbf2de81bf.tar.gz
compcert-kvx-59e9d82827f89f71f955de299cf2bffbf2de81bf.zip
[BROKEN] Started BFS - does not compile
-rw-r--r--backend/Duplicateaux.ml30
1 files changed, 30 insertions, 0 deletions
diff --git a/backend/Duplicateaux.ml b/backend/Duplicateaux.ml
index 66b33a8c..4517a685 100644
--- a/backend/Duplicateaux.ml
+++ b/backend/Duplicateaux.ml
@@ -78,6 +78,36 @@ let dfs code entrypoint =
in node_dfs @ (dfs_list code ln)
in dfs_list code [entrypoint]
+let bfs code entrypoint =
+ in let visited = ref (PTree.map (fun n i -> false) code)
+ and bfs_list = ref []
+ and to_visit = Queue.create ()
+ and node = ref entrypoint
+ in begin
+ Queue.add entrypoint to_visit;
+ while not Queue.is_empty to_visit do
+ node := Queue.pop to_visit;
+ if not (get_some @@ PTree.get !node !visited) then begin
+ visited := PTree.set !node true !visited;
+ match PTree.get !node code with
+ | None -> failwith "No such node"
+ | Some ti ->
+ bfs_list := ti :: !bfs_list;
+ match ti with
+ | Tleaf i -> ( match i with
+ | Icall(_, _, _, _, n) -> Queue.add n to_visit
+ | Ibuiltin(_, _, _, n) -> Queue.add n to_visit
+ | Ijumptable(_, ln) -> List.iter (fun n -> Queue.add n to_visit) ln
+ | Itailcall _ | Ireturn _ -> ()
+ | _ -> failwith "Tleaf case not handled in bfs" )
+ | Tnext (_, i) -> ( match i with
+ | Icond (_, _, n1, n2) -> Queue.add n1 to_visit; Queue.add n2 to_visit
+ | Inop n | Iop n | Iload n | Istore n -> Queue.add n to_visit
+ | _ -> failwith "Tnext case not handled in bfs" )
+ end
+ done
+ end
+
let ptree_get_some n ptree = get_some @@ PTree.get n ptree
let rec select_unvisited_node is_visited = function