Age | Commit message (Collapse) | Author | |
---|---|---|---|
2016-01-07 | beam_bool: Fix unsafe optimization | Björn Gustavsson | |
beam_bool would make the following code unsafe (which would be reported by beam_validator): scotland(Echo) -> found(case Echo of Echo when true; Echo, Echo, Echo -> Echo; echo -> [] end, Echo = placed). found(_, _) -> million. Basically, beam_bool would see that the 'case' would always return the value of Echo. Thus: scotland(Echo) -> found(Echo, Echo = placed). The only problem is that beam_bool would also remove a 'move' instruction that would save Echo to the stack. Here is the assembly code for part of the function: {allocate_zero,1,1}. {move,{x,0},{y,0}}. %% Save Echo on stack. {bif,'=:=',{f,7},[{x,0},{atom,true}],{x,1}}. {bif,'=:=',{f,7},[{x,0},{atom,true}],{x,2}}. {bif,'=:=',{f,7},[{x,0},{atom,true}],{x,3}}. {bif,'and',{f,7},[{x,2},{x,3}],{x,2}}. {bif,'and',{f,7},[{x,1},{x,2}],{x,1}}. {jump,{f,8}}. {label,7}. {move,{atom,false},{x,1}}. {label,8}. {bif,'or',{f,6},[{atom,true},{x,1}],{x,1}}. {test,is_eq_exact,{f,6},[{x,1},{atom,true}]}. %% Jump never taken. {jump,{f,5}}. {label,6}. {test,is_eq_exact,{f,9},[{x,0},{atom,echo}]}. {move,nil,{x,0}}. {jump,{f,5}}. {label,9}. {test_heap,3,0}. {put_tuple,2,{x,0}}. {put,{atom,case_clause}}. {put,{y,0}}. {line,[{location,"t.erl",5}]}. {call_ext,1,{extfunc,erlang,error,1}}. {jump,{f,5}}. {label,5}. {test,is_eq_exact,{f,12},[{atom,placed},{y,0}]}. beam_bool would see that the is_eq_exact test at label 8 would always succeed. It could therefore remove most of the code before the jump to label 5. Unfortunately it also removed the essential move of Echo to the stack: {allocate_zero,1,1}. %% Instruction incorrectly removed: {move,{x,0},{y,0}}. {jump,{f,5}}. {label,5}. {test,is_eq_exact,{f,12},[{atom,placed},{y,0}]}. The root cause of the problem is that the 'move' instruction is included in the block of 'bif' instructions before label 8. Normally the 'move' instruction would not have been discarded, but because the left operand to the 'or' BIF is 'true', the entire block with 'bif' instructions are dropped. As far as I can see, there is no gain by including 'move' instructions in the first place. There is no way that better code will be produced. In fact, the entire optimization can be given up if 'move' instructions are found in the block. Thus we can fix this bug by never including any 'move' instructions in the block of 'bif' instructions. We can also remove all the code that deals with 'move' instructions within blocks. Reported-by: Thomas Arts | |||
2015-12-15 | Update release notes | Erlang/OTP | |
2015-12-15 | Update version numbers | Erlang/OTP | |
2015-11-20 | Fix missing filename and line number in warning | Björn Gustavsson | |
When the 'bin_opt_info' is given, warnings without filenames and line numbers could sometimes be produced: no_file: Warning: INFO: matching non-variables after a previous clause matching a variable will prevent delayed sub binary optimization The reason for the missing information is that #c_alias{} records lack location information. There are several ways to fix the problem. The easiest seems to be to get the location information from the code). Noticed-by: José Valim | |||
2015-11-17 | [compiler] Correct documentation | Hans Bolinder | |
Fix mistakes found by 'xmllint'. | |||
2015-10-26 | Fix cerl_trees:label/2 bug with map K/V swap | Magnus Lång | |
2015-09-21 | Prepare release | Erlang/OTP | |
2015-09-14 | Merge branch 'bjorn/cuddle-with-tests' into maint | Björn Gustavsson | |
* bjorn/cuddle-with-tests: (23 commits) rand_SUITE: Speed up basic_stats/1 base64_SUITE: Speed up roundtrip/1 lists_SUITE: Test lists:concat/2 lists_SUITE: Test lists:split/2 lists_SUITE: Add a test case for lists:prefix/2 lists_SUITE: Add hof/1 to test all high-order functions lists_SUITE: Add test for lists:takewhile/1 lists_SUITE: Run test cases in each group in parallel lists_SUITE: Test lists:keyreplace/4 lists_SUITE: Extend flatten/1 test to also test flatlength/1 lists_SUITE: Correct test of lists:flatten/2 id_transform_SUITE: Modernize test suite io_proto_SUITE: Speed up determination of default shell io_proto_SUITE: Refactor up rtnode() and friends gen_event_SUITE: Remove unnecessary sleep calls proc_lib: Improve coverage for crash/1 proc_lib_SUITE: Eliminate compiler warnings io_SUITE: Add coverage/1 to completely cover io_lib_pretty io_SUITE: Extend coverage of code for testing printable chars io_SUITE: Speed up test for bad +pc option ... | |||
2015-09-11 | Merge branch 'c-rack/fix-typo3' into maint | Zandra | |
* c-rack/fix-typo3: Fix typo in call_last/3 spec Fix typo Fix typo: message to send is in x(1) not x(0) Fix another small typo Fix typo | |||
2015-09-10 | compile_SUITE: Add test of warnings | Björn Gustavsson | |
Make sure that all warnings produced when compiling the test suite contains filenames and line numbers. | |||
2015-09-04 | compiler: Fix get_map_elements register corruption | Björn-Egil Dahlberg | |
Instruction get_map_elements might destroy target registers when the fail-label is taken. Only seen for patterns with two, and only two, target registers. Specifically: we copy one register, and then jump. foo(A,#{a := V1, b := V2}) -> ... foo(A,#{b := V}) -> ... call foo(value, #{a=>whops, c=>42}). corresponding assembler: {test,is_map,{f,5},[{x,1}]}. {get_map_elements,{f,7},{x,1},{list,[{atom,a},{x,1},{atom,b},{x,2}]}}. %% if 'a' exists but not 'b' {x,1} is overwritten, jump {f,7} {move,{integer,1},{x,0}}. {call_only,3,{f,10}}. {label,7}. {get_map_elements,{f,8},{x,1},{list,[{atom,b},{x,2}]}}. %% {x,1} (src) is read with a corrupt value {move,{x,0},{x,1}}. {move,{integer,2},{x,0}}. {call_only,3,{f,10}}. The fix is to remove 'opt_moves' pass for get_map_elements instruction in the case of two or more destinations. Reported-by: Valery Tikhonov | |||
2015-09-04 | compiler: Add extra checks for get_map_elements in validator | Björn-Egil Dahlberg | |
2015-09-04 | compiler: Add test for corrupt register in get_map_elements | Björn-Egil Dahlberg | |
2015-08-28 | Fix typo in call_last/3 spec | Constantin Rack | |
2015-08-25 | Fix typo | Constantin Rack | |
2015-08-24 | Fix typo: message to send is in x(1) not x(0) | Constantin Rack | |
2015-08-09 | Fix another small typo | Constantin Rack | |
2015-08-09 | Fix typo | Constantin Rack | |
2015-06-23 | Prepare release | Erlang/OTP | |
2015-06-22 | fix errors caused by changed line numbers | Bruce Yinhe | |
2015-06-18 | Change license text to APLv2 | Bruce Yinhe | |
2015-06-17 | compiler: Add regressions_SUITE | Björn-Egil Dahlberg | |
regressions_SUITE will have code snippets which previously crashed the compiler. This commits includes a test for Maps crash in beam_bool. | |||
2015-06-17 | compiler: Fix beam_bool pass for get_map_elements | Björn-Egil Dahlberg | |
Before beam_split the get_map_elements instruction is still in blocks and the helper function in beam_jump did not reflect this. Reported-by: Quviq twitter account | |||
2015-06-04 | Merge branch 'bjorn/compiler/spurious-warning' | Björn Gustavsson | |
* bjorn/compiler/spurious-warning: sys_core_fold: Eliminate warnings for unused terms in effect context sys_core_fold: Eliminate warnings for unused terms | |||
2015-05-27 | Merge branch 'bjorn/compiler/doc' | Björn Gustavsson | |
* bjorn/compiler/doc: Update compiler documentation (Sneaking in OTP-12769 here which is a release note for syntax_tools. Sorry about that.) | |||
2015-05-27 | Update compiler documentation | Björn Gustavsson | |
Language cleaned up by the technical writer tmanevik from Combitech. Proofreading and corrections by Björn Gustavsson. | |||
2015-05-27 | Update application versions | Hans Bolinder | |
2015-05-26 | Merge branch 'egil/opt-compile-time/OTP-12774' | Björn-Egil Dahlberg | |
* egil/opt-compile-time/OTP-12774: stdlib: Relax erl_anno_SUITE:is_anno/1 test Update primary bootstrap compiler: Use Maps as type information compiler: Use Maps instead of dict in beam_jump compiler: Use cerl_sets instead of gb_sets in beam_type compiler: Use Maps instead of gb_trees in beam_dead compiler: Use cerl_sets instead of gb_sets in beam_jump compiler: Use cerl_sets instead of sets in v3_kernel compiler: Use cerl_sets instead of gb_sets in sys_core_fold compiler: Add cerl_sets module compiler: Scope uses gb_sets not gb_trees beam_dict: Use Maps to map function name indices beam_dict: Use Maps to map line indices beam_dict: Use Maps to map atom indices v3_codegen: Use Maps to map local functions v3_life: Refactor variable db compiler: Use lc instead of map/1 in v3_codegen stdlib: Optimize erl_anno:is_string/1 Conflicts: bootstrap/lib/kernel/ebin/inet_dns.beam bootstrap/lib/stdlib/ebin/erl_anno.beam bootstrap/lib/stdlib/ebin/erl_lint.beam | |||
2015-05-22 | sys_core_fold: Eliminate warnings for unused terms in effect context | Björn Gustavsson | |
The optimization introduced in 0a0d39d351fc could cause spurious warnings of the type: "a term is constructed, but never used". That would happen for constructs in effect context. To avoid those warnings, we will need to apply warning suppression also in effect context. | |||
2015-05-22 | Merge branch 'egil/fix-compiler-beam_bsm/OTP-12758' | Björn-Egil Dahlberg | |
* egil/fix-compiler-beam_bsm/OTP-12758: compiler: Add tests for beam_bsm get_map_elements compiler: Teach beam_bsm get_map_elements instruction | |||
2015-05-21 | compiler: Use Maps as type information | Björn-Egil Dahlberg | |
Using Maps as type information container speedups files like cow_http_hd.erl by ~500ms. Previously spent ~60% of the time in orddict:store/3. | |||
2015-05-21 | compiler: Use Maps instead of dict in beam_jump | Björn-Egil Dahlberg | |
2015-05-21 | compiler: Use cerl_sets instead of gb_sets in beam_type | Björn-Egil Dahlberg | |
2015-05-21 | compiler: Use Maps instead of gb_trees in beam_dead | Björn-Egil Dahlberg | |
2015-05-21 | compiler: Use cerl_sets instead of gb_sets in beam_jump | Björn-Egil Dahlberg | |
2015-05-21 | compiler: Use cerl_sets instead of sets in v3_kernel | Björn-Egil Dahlberg | |
2015-05-21 | compiler: Use cerl_sets instead of gb_sets in sys_core_fold | Björn-Egil Dahlberg | |
2015-05-21 | compiler: Add cerl_sets module | Björn-Egil Dahlberg | |
A sets implementation based on maps. | |||
2015-05-21 | compiler: Scope uses gb_sets not gb_trees | Björn-Egil Dahlberg | |
2015-05-21 | beam_dict: Use Maps to map function name indices | Björn-Egil Dahlberg | |
2015-05-21 | beam_dict: Use Maps to map line indices | Björn-Egil Dahlberg | |
2015-05-21 | beam_dict: Use Maps to map atom indices | Björn-Egil Dahlberg | |
2015-05-21 | v3_codegen: Use Maps to map local functions | Björn-Egil Dahlberg | |
2015-05-21 | v3_life: Refactor variable db | Björn-Egil Dahlberg | |
2015-05-21 | compiler: Use lc instead of map/1 in v3_codegen | Björn-Egil Dahlberg | |
Small speed increase for large files. | |||
2015-05-21 | Don't make 'compiler' dependent on 'tools' | Björn Gustavsson | |
In a5d724cf240a, a debug option for running eprof on a specific compiler pass was added. That commit added a direct call to the eprof module in the tools application, and therefore the test case otp_SUITE:runtime_dependencies/1 would fail because xref would find a call to the tools application, but tools is not listed as a runtime dependency in compiler.app. Since the 'eprof' option is only likely to be used by compiler maintainers, we don't want a real dependency to the tools application. Therefore, use c:appcall/4 to hide the call to the eprof module (and to report the error nicely if the tools application is missing). | |||
2015-05-21 | compiler: Add tests for beam_bsm get_map_elements | Björn-Egil Dahlberg | |
2015-05-21 | compiler: Teach beam_bsm get_map_elements instruction | Björn-Egil Dahlberg | |
Allows for 'creation of sub binary delayed' optimization if map instructions are in a clause. Reported-by: José Valim | |||
2015-05-13 | sys_core_fold: Eliminate warnings for unused terms | Björn Gustavsson | |
The optimization introduced in 0a0d39d351fc would cause spurious warnings of the type: "a term is constructed, but never used". To avoid the warning, we must mark not only tuples and lists as compiler_generated, but also each element. We must also propagate compiler_generated annotations in lets. For example, if we have: let <X -| ['compiler_generated']> = 42 in X + 1 we must propagate the compiler_generated annotation to the literal when do constant propagation: 42 -| ['compiler_generated'] + 1 | |||
2015-05-13 | Revert "Prepare release" | Henrik Nord | |
This reverts commit e09dd66dc4d89c62ddfd8c19791f9678d5d787c6. |