aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2018-09-10 15:01:05 +0200
committerBjörn Gustavsson <[email protected]>2018-09-12 14:19:05 +0200
commit5ebd2c4e0a12af57287b0bba390fb226c7209fb1 (patch)
tree221442944e0b37c6f73c29a156b44d31eb887d02 /lib/compiler
parentb21098e88551580d8ab3a1e7502506e91a950ec4 (diff)
downloadotp-5ebd2c4e0a12af57287b0bba390fb226c7209fb1.tar.gz
otp-5ebd2c4e0a12af57287b0bba390fb226c7209fb1.tar.bz2
otp-5ebd2c4e0a12af57287b0bba390fb226c7209fb1.zip
beam_ssa: Add trim_unreachable/1
Add trim_unreachable/1 to remove unreachable blocks and adjust phi nodes.
Diffstat (limited to 'lib/compiler')
-rw-r--r--lib/compiler/src/beam_ssa.erl14
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/compiler/src/beam_ssa.erl b/lib/compiler/src/beam_ssa.erl
index 75d567ff87..b0818b1092 100644
--- a/lib/compiler/src/beam_ssa.erl
+++ b/lib/compiler/src/beam_ssa.erl
@@ -33,6 +33,7 @@
rpo/1,rpo/2,
split_blocks/3,
successors/1,successors/2,
+ trim_unreachable/1,
update_phi_labels/4,used/1]).
-export_type([b_module/0,b_function/0,b_blk/0,b_set/0,
@@ -448,6 +449,19 @@ split_blocks(P, Blocks, Count) ->
Ls = beam_ssa:rpo(Blocks),
split_blocks_1(Ls, P, Blocks, Count).
+-spec trim_unreachable(Blocks0) -> Blocks when
+ Blocks0 :: block_map(),
+ Blocks :: block_map().
+
+%% trim_unreachable(Blocks0) -> Blocks.
+%% Remove all unreachable blocks. Adjust all phi nodes so
+%% they don't refer to blocks that has been removed or no
+%% no longer branch to the phi node in question.
+
+trim_unreachable(Blocks) ->
+ %% Could perhaps be optimized if there is any need.
+ maps:from_list(linearize(Blocks)).
+
%% update_phi_labels([BlockLabel], Old, New, Blocks0) -> Blocks.
%% In the given blocks, replace label Old in with New in all
%% phi nodes. This is useful after merging or splitting