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.  | 
