@@ -729,7 +729,7 @@ end = struct
729
729
| Apply { f; args; exact } -> Apply { f = s f; args = List. map args ~f: s; exact }
730
730
| Block (n , a , k , mut ) -> Block (n, Array. map a ~f: s, k, mut)
731
731
| Field (x , n , typ ) -> Field (s x, n, typ)
732
- | Closure (l , pc , loc ) -> Closure (List. map l ~f: s , subst_cont s pc, loc)
732
+ | Closure (l , pc , loc ) -> Closure (l , subst_cont s pc, loc)
733
733
| Special _ -> e
734
734
| Prim (p , l ) ->
735
735
Prim
@@ -783,15 +783,15 @@ end = struct
783
783
in
784
784
block s d blk
785
785
786
- let i_equal a b =
786
+ let instr_equal a b =
787
787
match a, b with
788
788
| Event _ , Event _ -> true
789
789
| Event _ , _ | _ , Event _ -> false
790
790
| a , b -> Poly. equal a b
791
791
792
792
let equal a b =
793
793
List. equal ~eq: Var. equal a.params b.params
794
- && List. equal ~eq: i_equal a.body b.body
794
+ && List. equal ~eq: instr_equal a.body b.body
795
795
&& Poly. equal a.branch b.branch
796
796
797
797
let hash (x : block ) = Hashtbl. hash x
@@ -816,11 +816,12 @@ let eval_branch blocks update_branch info l =
816
816
incr update_branch;
817
817
Branch cont
818
818
| None ->
819
- let t = SBT. create 18 in
819
+ let t = SBT. create 0 in
820
+ let seen_pc = Addr.Hashtbl. create 0 in
820
821
Switch
821
822
( x
822
823
, Array. map a ~f: (function
823
- | pc , [] -> (
824
+ | pc , [] when not ( Addr.Hashtbl. mem seen_pc pc) -> (
824
825
let block = Code.Addr.Map. find pc blocks in
825
826
let sb = Simple_block. make block in
826
827
match SBT. find_opt t sb with
@@ -829,6 +830,7 @@ let eval_branch blocks update_branch info l =
829
830
pc', []
830
831
| Some _ | None ->
831
832
SBT. add t sb pc;
833
+ Addr.Hashtbl. add seen_pc pc () ;
832
834
pc, [] )
833
835
| cont -> cont) ))
834
836
| cont -> cont
0 commit comments