aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/beam_a.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2015-04-14 13:01:00 +0200
committerBjörn Gustavsson <[email protected]>2015-04-22 10:14:40 +0200
commit0971feb23d553bb51b04eb78fbf76c4bc19b4b93 (patch)
tree5cb0afafd88e42276c1518d11264dd2cf1bdf873 /lib/compiler/src/beam_a.erl
parent32b85d920529990df2aa7acb091e7d03c520ef8c (diff)
downloadotp-0971feb23d553bb51b04eb78fbf76c4bc19b4b93.tar.gz
otp-0971feb23d553bb51b04eb78fbf76c4bc19b4b93.tar.bz2
otp-0971feb23d553bb51b04eb78fbf76c4bc19b4b93.zip
v3_codegen: Reduce cost for fixing up bs_match_string instructions
Commit b76588fb5a introduced an optimization of the compile time of huge functions with many bs_match_string instructions. The optimization is done in two passes. The first pass coalesces adjacent bs_match_string instructions. To avoid copying bitstrings multiple times, the bitstrings in the instructions are combined in to a (deep) list. The second pass goes through all instructions in the function and combines the list of bitstrings to a single bitstring in all bs_match_string instructions. The second pass (fix_bs_match_string) is run on all instructions in each function, even if there are no bs_match_instructions in the function. While fix_bs_match_string is not a bottleneck (it is a linear pass), its execution time is noticeable when profiling some modules. Move the execution of the second pass to the select_binary() function so that it will only be executed for instructions that do binary matching. Also take the opportunity to optimize away uses of bs_restore2 that occour directly after a bs_save2. That optimimization is currently done in beam_block, but it can be done essentially for free in the same pass that fixes up bs_match_string instructions.
Diffstat (limited to 'lib/compiler/src/beam_a.erl')
0 files changed, 0 insertions, 0 deletions