aboutsummaryrefslogtreecommitdiffstats
path: root/lib/stdlib/src/qlc.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2016-05-31 22:49:42 +0200
committerBjörn Gustavsson <[email protected]>2016-06-01 10:09:20 +0200
commitaab1db16d0a732823fa9e2964c6a52b109c61742 (patch)
tree3ba6111af79e023fc1476dc815a14f9f95faa69a /lib/stdlib/src/qlc.erl
parentac927e00f82b3df962abe082393f45197de49156 (diff)
downloadotp-aab1db16d0a732823fa9e2964c6a52b109c61742.tar.gz
otp-aab1db16d0a732823fa9e2964c6a52b109c61742.tar.bz2
otp-aab1db16d0a732823fa9e2964c6a52b109c61742.zip
beam_block: Eliminate crash in beam_utils
Somewhat simplified, beam_block would rewrite the target for the first instruction in this code sequence: move x(0) => y(1) gc_bif '+' 1 x(0) => y(0) move y(1) => x(1) move nil => x(0) call 2 local_function/2 The resulting code would be: move x(0) => x(1) %% Changed target. gc_bif '+' 1 x(0) => y(0) move x(1) => y(1) %% Operands swapped (see 02d6135813). move nil => x(0) call 2 local_function/2 The resulting code is not safe because the x(1) will be killed by the gc_bif instruction. 7a47b20c3a cleaned up move optimizations and would reject the optimization if the target was an X register and an allocating instruction was found. To avoid this bug, the optimization must be rejected even if the target is a Y register.
Diffstat (limited to 'lib/stdlib/src/qlc.erl')
0 files changed, 0 insertions, 0 deletions