aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hipe/icode/hipe_icode_liveness.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hipe/icode/hipe_icode_liveness.erl')
-rw-r--r--lib/hipe/icode/hipe_icode_liveness.erl101
1 files changed, 101 insertions, 0 deletions
diff --git a/lib/hipe/icode/hipe_icode_liveness.erl b/lib/hipe/icode/hipe_icode_liveness.erl
new file mode 100644
index 0000000000..5816e59032
--- /dev/null
+++ b/lib/hipe/icode/hipe_icode_liveness.erl
@@ -0,0 +1,101 @@
+%% -*- erlang-indent-level: 2 -*-
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% ICODE LIVENESS ANALYSIS
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-module(hipe_icode_liveness).
+
+-define(PRETTY_PRINT, true).
+
+-include("hipe_icode.hrl").
+-include("../flow/liveness.inc").
+
+%%--------------------------------------------------------------------
+%% Interface to CFG and icode.
+%%--------------------------------------------------------------------
+
+cfg_bb(CFG, L) ->
+ hipe_icode_cfg:bb(CFG, L).
+
+cfg_postorder(CFG) ->
+ hipe_icode_cfg:postorder(CFG).
+
+cfg_succ(CFG, L) ->
+ hipe_icode_cfg:succ(CFG, L).
+
+uses(Instr) ->
+ hipe_icode:uses(Instr).
+
+defines(Instr) ->
+ hipe_icode:defines(Instr).
+
+%%
+%% This is the list of registers that are live at exit from a function
+%%
+cfg_labels(CFG) ->
+ hipe_icode_cfg:labels(CFG).
+
+liveout_no_succ() ->
+ ordsets:new().
+
+pp_liveness_info(LiveList) ->
+ print_live_list(LiveList).
+
+print_live_list([]) ->
+ io:format(" none~n", []);
+print_live_list([Last]) ->
+ io:format(" ", []),
+ print_var(Last),
+ io:format("~n", []);
+print_live_list([Var|Rest]) ->
+ io:format(" ", []),
+ print_var(Var),
+ io:format(",", []),
+ print_live_list(Rest).
+
+pp_block(Label, CFG) ->
+ BB = hipe_icode_cfg:bb(CFG, Label),
+ Code = hipe_bb:code(BB),
+ hipe_icode_pp:pp_block(Code).
+
+print_var(#icode_variable{name=V, kind=Kind, annotation=T}) ->
+ case Kind of
+ var -> io:format("v~p", [V]);
+ reg -> io:format("r~p", [V]);
+ fvar -> io:format("fv~p", [V])
+ end,
+ case T of
+ [] -> ok;
+ {_,X,F} -> io:format(" (~s)", F(X))
+ end.
+
+%%
+%% The following are used only if annotation of the code is requested.
+%%
+-ifdef(DEBUG_LIVENESS).
+cfg_bb_add(CFG, L, NewBB) ->
+ hipe_icode_cfg:bb_add(CFG, L, NewBB).
+
+mk_comment(Text) ->
+ hipe_icode:mk_comment(Text).
+-endif.