Skip to content

Commit 4f91c6c

Browse files
committed
Speed-up empty block removal
Few blocks need to be modified on average
1 parent d72f14b commit 4f91c6c

File tree

1 file changed

+32
-18
lines changed

1 file changed

+32
-18
lines changed

compiler/lib/deadcode.ml

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)