aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/beam_block.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2015-09-23 07:23:15 +0200
committerBjörn Gustavsson <[email protected]>2015-09-28 10:26:39 +0200
commitc0c5943c3a2646a3383d974c2a1afcff8c5d16d3 (patch)
treeb0e7ab5d8c7aa77aadc14944703922c9f6a6edba /lib/compiler/src/beam_block.erl
parentae125a3bc62c2165a9db028e12aa6e9f90c7d9cf (diff)
downloadotp-c0c5943c3a2646a3383d974c2a1afcff8c5d16d3.tar.gz
otp-c0c5943c3a2646a3383d974c2a1afcff8c5d16d3.tar.bz2
otp-c0c5943c3a2646a3383d974c2a1afcff8c5d16d3.zip
beam_type: Improve optimization by keeping track of integers
The ASN.1 compiler often generates code similar to: f(<<0:1,...>>) -> ...; f(<<1:1,...>>) -> .... Internally that will be rewritten to (conceptually): f(<<B:1,Tail/binary>>) -> case B of 0 -> case Tail of ... end; 1 -> case Tail of ... end; _ -> error(case_clause) end. Since B comes from a bit field of one bit, we know that the only possible values are 0 and 1. Therefore the error clause can be eliminated like this: f(<<B:1,Tail/binary>>) -> case B of 0 -> case Tail of ... end; _ -> case Tail of ... end end. Similarly, we can also a deduce the range for an integer from a 'band' operation with a literal integer. While we are at it, also add a test case to improve the coverage.
Diffstat (limited to 'lib/compiler/src/beam_block.erl')
0 files changed, 0 insertions, 0 deletions