@@ -677,9 +677,9 @@ let eval_branch info l =
677677
678678exception May_raise
679679
680- let rec do_not_raise pc visited blocks =
680+ let rec do_not_raise pc visited rewrite blocks =
681681 if Addr.Set. mem pc visited
682- then visited
682+ then visited, rewrite
683683 else
684684 let visited = Addr.Set. add pc visited in
685685 let b = Addr.Map. find pc blocks in
@@ -700,46 +700,48 @@ let rec do_not_raise pc visited blocks =
700700 | Prim (_ , _ ) -> () ));
701701 match b.branch with
702702 | Raise _ -> raise May_raise
703- | Stop | Return _ | Poptrap _ -> visited
704- | Branch (pc , _ ) -> do_not_raise pc visited blocks
703+ | Stop | Return _ -> visited, rewrite
704+ | Poptrap _ -> visited, pc :: rewrite
705+ | Branch (pc , _ ) -> do_not_raise pc visited rewrite blocks
705706 | Cond (_ , (pc1 , _ ), (pc2 , _ )) ->
706- let visited = do_not_raise pc1 visited blocks in
707- let visited = do_not_raise pc2 visited blocks in
708- visited
707+ let visited, rewrite = do_not_raise pc1 visited rewrite blocks in
708+ let visited, rewrite = do_not_raise pc2 visited rewrite blocks in
709+ visited, rewrite
709710 | Switch (_ , a1 ) ->
710- let visited =
711- Array. fold_left a1 ~init: visited ~f: (fun visited (pc , _ ) ->
712- do_not_raise pc visited blocks)
711+ let visited, rewrite =
712+ Array. fold_left
713+ a1
714+ ~init: (visited, rewrite)
715+ ~f: (fun (visited , rewrite ) (pc , _ ) -> do_not_raise pc visited rewrite blocks)
713716 in
714- visited
717+ visited, rewrite
715718 | Pushtrap _ -> raise May_raise
716719
717720let drop_exception_handler drop_count blocks =
718721 Addr.Map. fold
719722 (fun pc _ blocks ->
720723 match Addr.Map. find pc blocks with
721724 | { branch = Pushtrap (((addr , _ ) as cont1 ), _x , _cont2 ); _ } as b -> (
722- try
723- let visited = do_not_raise addr Addr.Set. empty blocks in
724- incr drop_count;
725- let b = { b with branch = Branch cont1 } in
726- let blocks = Addr.Map. add pc b blocks in
727- let blocks =
728- Addr.Set. fold
729- (fun pc2 blocks ->
730- let b = Addr.Map. find pc2 blocks in
731- let branch =
732- match b.branch with
733- | Poptrap cont -> Branch cont
734- | x -> x
735- in
736- let b = { b with branch } in
737- Addr.Map. add pc2 b blocks)
738- visited
739- blocks
740- in
741- blocks
742- with May_raise -> blocks)
725+ match do_not_raise addr Addr.Set. empty [] blocks with
726+ | exception May_raise -> blocks
727+ | _visited , rewrite ->
728+ incr drop_count;
729+ let b = { b with branch = Branch cont1 } in
730+ let blocks = Addr.Map. add pc b blocks in
731+ let blocks =
732+ List. fold_left
733+ ~f: (fun blocks pc2 ->
734+ Addr.Map. update
735+ pc2
736+ (function
737+ | Some ({ branch = Poptrap cont ; _ } as b ) ->
738+ Some { b with branch = Branch cont }
739+ | None | Some _ -> assert false )
740+ blocks)
741+ rewrite
742+ ~init: blocks
743+ in
744+ blocks)
743745 | _ -> blocks)
744746 blocks
745747 blocks
0 commit comments