diff options
author | Erlang/OTP <[email protected]> | 2018-06-29 14:30:27 +0200 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2018-06-29 14:30:27 +0200 |
commit | 5e3e6747ac924b3d7956630de501316567a15cad (patch) | |
tree | 1a27eb69aa1d071b38bf61e6e17699d54f41d1cf /lib | |
parent | a32b35f2cd9ea997ab36bd250aebdb0961b25d0a (diff) | |
parent | d10fd4596270d7f8503dc46a0a7c229ad08795d2 (diff) | |
download | otp-5e3e6747ac924b3d7956630de501316567a15cad.tar.gz otp-5e3e6747ac924b3d7956630de501316567a15cad.tar.bz2 otp-5e3e6747ac924b3d7956630de501316567a15cad.zip |
Merge branch 'bjorn/compiler/fix-beam_jump-crash/ERL-660/OTP-15166' into maint-21
* bjorn/compiler/fix-beam_jump-crash/ERL-660/OTP-15166:
Eliminate a crash in the beam_jump pass
Diffstat (limited to 'lib')
-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 ff587c4982..3bb671f034 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 360dcc1e84..8fd4a4c68b 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) -> @@ -550,5 +552,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. |