diff options
author | Björn Gustavsson <[email protected]> | 2018-06-29 14:14:40 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2018-06-29 14:23:08 +0200 |
commit | d10fd4596270d7f8503dc46a0a7c229ad08795d2 (patch) | |
tree | 568cf6292ea1dc07e801197c386ff82ad146c9e1 | |
parent | a0ae44f324576104760a63fe6cf63e0ca31756fc (diff) | |
download | otp-d10fd4596270d7f8503dc46a0a7c229ad08795d2.tar.gz otp-d10fd4596270d7f8503dc46a0a7c229ad08795d2.tar.bz2 otp-d10fd4596270d7f8503dc46a0a7c229ad08795d2.zip |
Eliminate a crash in the beam_jump pass
https://bugs.erlang.org/browse/ERL-660
-rw-r--r-- | lib/compiler/src/beam_utils.erl | 3 | ||||
-rw-r--r-- | lib/compiler/test/beam_utils_SUITE.erl | 25 |
2 files changed, 26 insertions, 2 deletions
diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl index 5510624b2d..30b6dcac8c 100644 --- a/lib/compiler/src/beam_utils.erl +++ b/lib/compiler/src/beam_utils.erl @@ -355,6 +355,9 @@ split_even(Rs) -> split_even(Rs, [], []). %% exit BIF will raise an exception %% used - Reg is used +check_liveness({fr,_}, _, St) -> + %% Conservatively always consider the floating point register used. + {used,St}; check_liveness(R, [{block,Blk}|Is], St0) -> case check_liveness_block(R, Blk, St0) of {transparent,St1} -> diff --git a/lib/compiler/test/beam_utils_SUITE.erl b/lib/compiler/test/beam_utils_SUITE.erl index 3d35b546fc..dee7fb9cf9 100644 --- a/lib/compiler/test/beam_utils_SUITE.erl +++ b/lib/compiler/test/beam_utils_SUITE.erl @@ -25,7 +25,8 @@ is_not_killed/1,is_not_used_at/1, select/1,y_catch/1,otp_8949_b/1,liveopt/1,coverage/1, y_registers/1,user_predef/1,scan_f/1,cafu/1, - receive_label/1,read_size_file_version/1,not_used/1]). + receive_label/1,read_size_file_version/1,not_used/1, + is_used_fr/1]). -export([id/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. @@ -52,7 +53,8 @@ groups() -> scan_f, cafu, read_size_file_version, - not_used + not_used, + is_used_fr ]}]. init_per_suite(Config) -> @@ -527,5 +529,24 @@ not_used_p(_C, S, K, L) when is_record(K, k) -> id(K) end. +is_used_fr(Config) -> + 1 = is_used_fr(self(), self()), + 1 = is_used_fr(self(), other), + receive 1 -> ok end, + receive 1 -> ok end, + receive 1 -> ok end, + receive 1 -> ok end, + ok. + +is_used_fr(X, Y) -> + %% beam_utils:is_used({fr,R}, Code) would crash. + _ = 0 / (X ! 1), + _ = case Y of + X -> ok; + _ -> error + end, + X ! 1. + + %% The identity function. id(I) -> I. |