aboutsummaryrefslogtreecommitdiffstats
path: root/lib/stdlib/info
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2009-12-11 22:25:51 +0100
committerBjörn Gustavsson <[email protected]>2009-12-11 22:43:39 +0100
commit88efa63b733b627934fb7eec6236c71d7acfe082 (patch)
treeda691cf124f127927e85b7f30d8dd597a8e67235 /lib/stdlib/info
parentaf198c489a7ab431fd1e2b52d16e8e13525915f7 (diff)
downloadotp-88efa63b733b627934fb7eec6236c71d7acfe082.tar.gz
otp-88efa63b733b627934fb7eec6236c71d7acfe082.tar.bz2
otp-88efa63b733b627934fb7eec6236c71d7acfe082.zip
beam_bool: Fix generation of code that does not validate
The following code (by Simon Cornish) bad(XDo1, XDo2, Do3) -> Do1 = (XDo1 =/= []), Do2 = (XDo2 =/= []), CH1 = if Do1 == true; Do1 == false,Do2==false,Do3 == blah -> ch1; true -> no end, CH2 = if Do1 == true; Do1 == false,Do2==false,Do3 == xx -> ch2; true -> no end, {CH1,CH2}. is optimized by beam_bool even though the optimization is not safe. The trouble is that an assignment to {y,0} no longer occurs on all paths leading to its use. The bug is in dst_regs/2 which is supposed to return a set of all registers assigned in a code block, but it ignores registers assigned in 'move' instructions. Fix the bug by taking 'move' instructions into account. This change is safe since it can only cause more registers to be added to the MustBeKilled and MustBeUnused sets in ensure_opt_safe/6, which means that it can only cause the optimization to be turned off for code that used to be optimized.
Diffstat (limited to 'lib/stdlib/info')
0 files changed, 0 insertions, 0 deletions