%% -*- erlang-indent-level: 2 -*-
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions 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.