diff options
author | Björn Gustavsson <[email protected]> | 2018-04-04 15:14:54 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2018-04-04 15:34:34 +0200 |
commit | 282fb67730e1bafe722e7149a35e272398f88b34 (patch) | |
tree | 5e7882c457fc8e480e369b878ab8b43d2f0cf9af /lib/compiler/src | |
parent | f99860259ee557851acc865519a315f04d1d4d51 (diff) | |
download | otp-282fb67730e1bafe722e7149a35e272398f88b34.tar.gz otp-282fb67730e1bafe722e7149a35e272398f88b34.tar.bz2 otp-282fb67730e1bafe722e7149a35e272398f88b34.zip |
Fix unsafe optimization of record test
beam_record would make an unsafe optimization for the
not_used_p/4 function added to beam_utils_SUITE in this
commit. The bug is in beam_utils, which would falsely
report that {x,4} was unused when it in fact was used.
The bug was in the function not_used/1. The purpose of
not_used/1 is to return a 'not_used' result unless the
actual result is 'used'. Unfortunately it was not
implemented in that way. It would let a 'transparent'
result slip through, which the caller in this case would
convert to 'killed' (because the register was killed on
all other paths).
Reported-by: Richard Carlsson
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/beam_utils.erl | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl index 047cd5a569..1ddad30328 100644 --- a/lib/compiler/src/beam_utils.erl +++ b/lib/compiler/src/beam_utils.erl @@ -655,9 +655,8 @@ check_liveness_at(R, Lbl, #live{lbl=Ll,res=ResMemorized}=St0) -> {Res,St#live{res=gb_trees:insert(Lbl, Res, St#live.res)}} end. -not_used({exit_not_used,St}) -> {not_used,St}; -not_used({killed,St}) -> {not_used,St}; -not_used({_,_}=Res) -> Res. +not_used({used,_}=Res) -> Res; +not_used({_,St}) -> {not_used,St}. check_liveness_ret(R, R, St) -> {used,St}; check_liveness_ret(_, _, St) -> {killed,St}. |