aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/beam_receive.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2017-10-06 09:06:24 +0200
committerBjörn Gustavsson <[email protected]>2017-10-11 09:59:41 +0200
commit34c8b06de52ac81e2938e93ed7a219d7611c16f9 (patch)
tree0ed2df8a4aa99368ee5bf483c056cf808d34fd25 /lib/compiler/src/beam_receive.erl
parent4fe3f3b8be4825726fab6d4ea7515adf5b5df1ac (diff)
downloadotp-34c8b06de52ac81e2938e93ed7a219d7611c16f9.tar.gz
otp-34c8b06de52ac81e2938e93ed7a219d7611c16f9.tar.bz2
otp-34c8b06de52ac81e2938e93ed7a219d7611c16f9.zip
Optimize try/catch that ignores the return value
If a try/catch is used to ignore the potential exception caused by some expression with a side effect such as: try side_effect() catch _Class:_Reason -> ok end, . . . the generated code will be wasteful: try YReg TryLabel %% call side_effect() here try_end Yreg jump GoodLabel TryLabel: try_case YReg %% try_case has set up registers as follows: %% x(0) -> error | exit | throw %% x(1) -> reason %% x(2) -> raw stack trace data GoodLabel: %% This code does not use any x registers. There will be two code paths that both end up at GoodLabel, and the try_case instruction will set up registers that are never used. We can do better by replacing try_case with try_end to obtain this code: try YReg TryLabel %% call side_effect() here try_end Yreg jump GoodLabel TryLabel: try_end YReg GoodLabel: The jump optimizer (beam_jump) can further optimize this code like this: try YReg TryLabel %% call side_effect() here TryLabel: try_end YReg
Diffstat (limited to 'lib/compiler/src/beam_receive.erl')
0 files changed, 0 insertions, 0 deletions