From 5c426cf3b668d43b2f5294f70ab288654c316405 Mon Sep 17 00:00:00 2001 From: Cyril SIX Date: Tue, 8 Dec 2020 10:54:53 +0100 Subject: Fix on find_last_node_before_loop It was too permissive --- backend/Duplicateaux.ml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'backend/Duplicateaux.ml') diff --git a/backend/Duplicateaux.ml b/backend/Duplicateaux.ml index c9985dc4..dc95d5b9 100644 --- a/backend/Duplicateaux.ml +++ b/backend/Duplicateaux.ml @@ -732,10 +732,14 @@ let rec find_last_node_before_loop code node trace is_loop_header = get_some @@ PTree.get n is_loop_header && HashedSet.PSet.contains trace n) rtl_succ in match headers with | [] -> ( - let next_nodes = List.filter (fun n -> HashedSet.PSet.contains trace n) - (rtl_successors_pref @@ get_some @@ PTree.get node code) in + let next_nodes = rtl_successors_pref @@ get_some @@ PTree.get node code in match next_nodes with - | [n] -> find_last_node_before_loop code n trace is_loop_header + | [n] -> ( + (* To prevent getting out of the superblock and loop infinitely when the prediction is false *) + if HashedSet.PSet.contains trace n then + find_last_node_before_loop code n trace is_loop_header + else None + ) | _ -> None (* May happen when we predict that a loop is not taken *) ) | [h] -> Some node -- cgit