diff options
author | Björn Gustavsson <[email protected]> | 2016-10-07 14:19:29 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2016-10-07 14:19:29 +0200 |
commit | 16f2daa48333cced93f4f31d9a57e5d2e3a8f9e8 (patch) | |
tree | 4ddef6b09c76b957fdd83a44e6844379f0cb64dd /lib/compiler/test | |
parent | 1f0ce3e83982c80a84e31ab16a89dd65b45157f8 (diff) | |
parent | c8fb8c177b9f74ddea36d9c002df4f9c1bf4fb27 (diff) | |
download | otp-16f2daa48333cced93f4f31d9a57e5d2e3a8f9e8.tar.gz otp-16f2daa48333cced93f4f31d9a57e5d2e3a8f9e8.tar.bz2 otp-16f2daa48333cced93f4f31d9a57e5d2e3a8f9e8.zip |
Merge branch 'maint'
* maint:
beam_bsm: Eliminate unsafe optimization
Diffstat (limited to 'lib/compiler/test')
-rw-r--r-- | lib/compiler/test/bs_match_SUITE.erl | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/compiler/test/bs_match_SUITE.erl b/lib/compiler/test/bs_match_SUITE.erl index f8af070c44..6742571b86 100644 --- a/lib/compiler/test/bs_match_SUITE.erl +++ b/lib/compiler/test/bs_match_SUITE.erl @@ -769,6 +769,11 @@ multiple_uses(Config) when is_list(Config) -> {344,62879,345,<<245,159,1,89>>} = multiple_uses_1(<<1,88,245,159,1,89>>), true = multiple_uses_2(<<0,0,197,18>>), <<42,43>> = multiple_uses_3(<<0,0,42,43>>, fun id/1), + + ok = first_after(<<>>, 42), + <<1>> = first_after(<<1,2,3>>, 0), + <<2>> = first_after(<<1,2,3>>, 1), + ok. multiple_uses_1(<<X:16,Tail/binary>>) -> @@ -790,6 +795,24 @@ multiple_uses_match(<<Y:16,Z:16>>) -> multiple_uses_cmp(<<Y:16>>, <<Y:16>>) -> true; multiple_uses_cmp(<<_:16>>, <<_:16>>) -> false. +first_after(Data, Offset) -> + case byte_size(Data) > Offset of + false -> + {First, Rest} = {ok, ok}, + ok; + true -> + <<_:Offset/binary, Rest/binary>> = Data, + %% 'Rest' saved in y(0) before the call. + {First, _} = match_first(Data, Rest), + %% When beam_bsm sees the code, the following line + %% which uses y(0) has been optimized away. + {First, Rest} = {First, Rest}, + First + end. + +match_first(_, <<First:1/binary, Rest/binary>>) -> + {First, Rest}. + zero_label(Config) when is_list(Config) -> <<"nosemouth">> = read_pols(<<"FACE","nose","mouth">>), <<"CE">> = read_pols(<<"noFACE">>), |