diff options
author | Björn Gustavsson <[email protected]> | 2017-10-06 09:06:24 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2017-10-11 09:59:41 +0200 |
commit | 34c8b06de52ac81e2938e93ed7a219d7611c16f9 (patch) | |
tree | 0ed2df8a4aa99368ee5bf483c056cf808d34fd25 /lib/compiler/src/beam_receive.erl | |
parent | 4fe3f3b8be4825726fab6d4ea7515adf5b5df1ac (diff) | |
download | otp-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