aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/erl_bifs.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2011-12-21 06:44:28 +0100
committerBjörn Gustavsson <[email protected]>2012-01-04 10:49:15 +0100
commit53bd4974a1012669fb7db09815fabac01b586c12 (patch)
treec2c1bc82febe57acf81969bee72b57af4181f308 /lib/compiler/src/erl_bifs.erl
parent8769a849dbbb70cb92733f484b2a0e1693e97eb7 (diff)
downloadotp-53bd4974a1012669fb7db09815fabac01b586c12.tar.gz
otp-53bd4974a1012669fb7db09815fabac01b586c12.tar.bz2
otp-53bd4974a1012669fb7db09815fabac01b586c12.zip
Eliminate the match_fail primop in v3_kernel and later passes
In the v3_life pass, it is assumed that a 'match_fail' primop only occur at the top-level and at the end of a function. But this code: do_split_cases(A) -> case A of x -> Z = dummy1; _ -> Z = dummy2, a=b end, Z. will be optimized by sys_core_fold to the following code: 'split_cases'/1 = fun (_cor0) -> let <_cor7,Z> = case _cor0 of <'x'> when 'true' -> < 'dummy1','dummy1' > <_cor6> when 'true' -> %% Here follows a 'match_fail' primop inside %% multiple return values: < primop 'match_fail'({'badmatch','b'}),'dummy2' > end in Z moving the 'match_fail' primop into a "values" construction. In the future, we would like to get rid of the v3_life pass (it is there for historical reasons), so in the mean-time we prefer to not add more code to it by generalizing the handling of 'match_fail'. Since the 'match_fail' primop can be simulated by erlang:error/{1,2}, the simplest solution is to translate 'match_fail' to a call to erlang:error/{1,2} in v3_kernel and remove the handling of 'match_fail' in v3_life and v3_codegen. It is tempting to get rid of 'match_fail' also in the Core Erlang format, but there are two issues: - Removing the support for 'match_fail' completely may break tools that generate Core Erlang code. We should not do that in a minor release. - There is no easy way to generate a 'function_clause' exception that will remain correct if it will be inlined into another function. (Calling "erlang:error(function_clause, Args)" is fine only if it is not inlined into another function.) A good solution probably involves introducing new instructions, which is better done in a major release. Noticed-by: Håkan Matsson Minimized-test-case-by: Erik Søe Sørensen
Diffstat (limited to 'lib/compiler/src/erl_bifs.erl')
0 files changed, 0 insertions, 0 deletions