diff options
author | Björn Gustavsson <[email protected]> | 2019-05-25 10:23:20 +0200 |
---|---|---|
committer | John Högberg <[email protected]> | 2019-05-28 10:35:37 +0200 |
commit | a034ff64abab5f5cbf5c6aa38762044c968fe377 (patch) | |
tree | 6055ccc07bc571870ff25af7d064347451c8efde /lib/compiler/src | |
parent | d32991afaf3fc5f9f73e3e2448672bb9a1b80101 (diff) | |
download | otp-a034ff64abab5f5cbf5c6aa38762044c968fe377.tar.gz otp-a034ff64abab5f5cbf5c6aa38762044c968fe377.tar.bz2 otp-a034ff64abab5f5cbf5c6aa38762044c968fe377.zip |
Fix unsafe optimizations where guard tests could be removed
A repeated test could be optimized away. Example:
bar(A) ->
if is_bitstring(A) ->
if is_binary(A) ->
binary;
true ->
bitstring
end;
true ->
other
end.
In the example, the `is_binary/1` test would be optimized away,
basically turning the example into:
bar(A) ->
if is_bitstring(A) ->
bitstring;
true ->
other
end.
Thanks user Marcus Kruse in the Elixir forum for noticing this bug.
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/beam_ssa_dead.erl | 12 |
1 files changed, 2 insertions, 10 deletions
diff --git a/lib/compiler/src/beam_ssa_dead.erl b/lib/compiler/src/beam_ssa_dead.erl index bb43a550ae..e220a89ded 100644 --- a/lib/compiler/src/beam_ssa_dead.erl +++ b/lib/compiler/src/beam_ssa_dead.erl @@ -680,11 +680,8 @@ will_succeed_test(is_list, is_nonempty_list) -> maybe; will_succeed_test(is_nonempty_list, is_list) -> yes; -will_succeed_test(T1, T2) -> - case is_numeric_test(T1) andalso is_numeric_test(T2) of - true -> maybe; - false -> no - end. +will_succeed_test(_T1, _T2) -> + maybe. will_succeed_1('=:=', A, '<', B) -> if @@ -769,11 +766,6 @@ will_succeed_vars('==', Val1, '/=', Val2) when Val1 == Val2 -> no; will_succeed_vars(_, _, _, _) -> maybe. -is_numeric_test(is_float) -> true; -is_numeric_test(is_integer) -> true; -is_numeric_test(is_number) -> true; -is_numeric_test(_) -> false. - eval_type_test(Test, Arg) -> case eval_type_test_1(Test, Arg) of true -> yes; |