aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2010-11-26 11:47:50 +0100
committerBjörn Gustavsson <[email protected]>2010-12-02 17:12:24 +0100
commit2b03fbacf1ac0c06a84439baac90d418916a1778 (patch)
treea42ca97705f775998d0bc779db20b47b4e752816 /lib/compiler/src
parent8836ebccae92886decf5645944ae4ce8a2f99947 (diff)
downloadotp-2b03fbacf1ac0c06a84439baac90d418916a1778.tar.gz
otp-2b03fbacf1ac0c06a84439baac90d418916a1778.tar.bz2
otp-2b03fbacf1ac0c06a84439baac90d418916a1778.zip
beam_utils: Fix check_liveness/3 for receive loops
Sometimes the beam_bool pass wants to know whether an y register will be killed by the code that follows and will do (effectively): beam_utils:is_killed({y,Y}, Code, L) When asked to calculate the liveness for an y register, beam_utils:is_killed/3 will loop forever if the code includes a receive loop. Since this rarely occurs, fix the problem in the simplest and most conservative way. Reported-by: Christopher Williams
Diffstat (limited to 'lib/compiler/src')
-rw-r--r--lib/compiler/src/beam_utils.erl9
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl
index dc8079d0b7..45cdf8a659 100644
--- a/lib/compiler/src/beam_utils.erl
+++ b/lib/compiler/src/beam_utils.erl
@@ -489,10 +489,13 @@ check_liveness(R, [{bs_context_to_binary,S}|Is], St) ->
S -> {used,St};
_ -> check_liveness(R, Is, St)
end;
-check_liveness(R, [{loop_rec,{f,_},{x,0}}|Is], St) ->
+check_liveness(R, [{loop_rec,{f,_},{x,0}}|_], St) ->
case R of
- {x,_} -> {killed,St};
- _ -> check_liveness(R, Is, St)
+ {x,_} ->
+ {killed,St};
+ _ ->
+ %% y register. Rarely happens. Be very conversative.
+ {unknown,St}
end;
check_liveness(R, [{loop_rec_end,{f,Fail}}|_], St) ->
check_liveness_at(R, Fail, St);