@@ -369,24 +369,38 @@ let remove_empty_blocks st (p : Code.program) : Code.program =
369369 | _ -> () )
370370 p.blocks;
371371 let blocks =
372- Addr.Map. map
373- (fun block ->
374- { block with
375- branch =
376- (let branch = block.branch in
377- match branch with
378- | Branch cont -> Branch (resolve cont)
379- | Cond (x , cont1 , cont2 ) ->
380- let cont1' = resolve cont1 in
381- let cont2' = resolve cont2 in
382- if Code. cont_equal cont1' cont2'
383- then Branch cont1'
384- else Cond (x, cont1', cont2')
385- | Switch (x , a1 ) -> Switch (x, Array. map ~f: resolve a1)
386- | Pushtrap (cont1 , x , cont2 ) -> Pushtrap (resolve cont1, x, resolve cont2)
387- | Poptrap cont -> Poptrap (resolve cont)
388- | Return _ | Raise _ | Stop -> branch)
389- })
372+ Addr.Map. fold
373+ (fun pc block blocks ->
374+ if
375+ match block.branch with
376+ | Branch (pc , _ ) | Poptrap (pc , _ ) -> not (Addr.Hashtbl. mem shortcuts pc)
377+ | Cond (_ , (pc1 , _ ), (pc2 , _ )) | Pushtrap ((pc1 , _ ), _ , (pc2 , _ )) ->
378+ not (Addr.Hashtbl. mem shortcuts pc1 || Addr.Hashtbl. mem shortcuts pc2)
379+ | Switch (_ , a ) ->
380+ not (Array. exists ~f: (fun (pc , _ ) -> Addr.Hashtbl. mem shortcuts pc) a)
381+ | Return _ | Raise _ | Stop -> true
382+ then blocks
383+ else
384+ Addr.Map. add
385+ pc
386+ { block with
387+ branch =
388+ (let branch = block.branch in
389+ match branch with
390+ | Branch cont -> Branch (resolve cont)
391+ | Cond (x , cont1 , cont2 ) ->
392+ let cont1' = resolve cont1 in
393+ let cont2' = resolve cont2 in
394+ if Code. cont_equal cont1' cont2'
395+ then Branch cont1'
396+ else Cond (x, cont1', cont2')
397+ | Switch (x , a1 ) -> Switch (x, Array. map ~f: resolve a1)
398+ | Pushtrap (cont1 , x , cont2 ) -> Pushtrap (resolve cont1, x, resolve cont2)
399+ | Poptrap cont -> Poptrap (resolve cont)
400+ | Return _ | Raise _ | Stop -> assert false )
401+ }
402+ blocks)
403+ p.blocks
390404 p.blocks
391405 in
392406 { p with blocks }
0 commit comments