945
945
splits([L|Ls], SavedSpillCosts) ->
946
946
Spl = splits(Ls, SavedSpillCosts),
947
947
SpillCost = hipe_spillcost:spill_cost(L, SavedSpillCosts),
948
Spl1 = lists:map(fun({Cols, NonCols, OldSpillCost}) ->
949
{[L|Cols], NonCols, OldSpillCost}
951
Spl2 = lists:map(fun({Cols, NonCols, OldSpillCost}) ->
952
{Cols, [L|NonCols], OldSpillCost + SpillCost}
948
Spl1 = [splits_1(S, L) || S <- Spl],
949
Spl2 = [splits_2(S, L, SpillCost) || S <- Spl],
954
950
spillCostOrderedMerge(Spl1, Spl2, []).
952
splits_1({Cols, NonCols, OldSpillCost}, L) ->
953
{[L|Cols], NonCols, OldSpillCost}.
955
splits_2({Cols, NonCols, OldSpillCost}, L, SpillCost) ->
956
{Cols, [L|NonCols], OldSpillCost + SpillCost}.
956
958
%% Merge two ordered sub-splits into one.
958
960
spillCostOrderedMerge(Spl1, [], Spl) ->
1866
1868
selectSpill(WorkLists, IG, SpillLimit) ->
1867
1869
[CAR|CDR] = hipe_reg_worklists:spill(WorkLists),
1869
1870
SpillCost = getCost(CAR, IG, SpillLimit),
1870
1871
M = findCheapest(CDR, IG, SpillCost, CAR, SpillLimit),
1872
1872
WorkLists1 = hipe_reg_worklists:remove_spill(M, WorkLists),
1873
WorkLists2 = hipe_reg_worklists:add_simplify(M, WorkLists1),
1873
hipe_reg_worklists:add_simplify(M, WorkLists1).
1876
1875
%%---------------------------------------------------------------------
1877
1876
%% Function: selectSpill
1953
1952
%%----------------------------------------------------------------------
1955
1954
-ifdef(COMPARE_ITERATED_OPTIMISTIC).
1956
freeze(K,WorkLists,Moves,IG,Alias) ->
1955
freeze(K, WorkLists, Moves, IG, Alias) ->
1957
1956
[U|_] = hipe_reg_worklists:freeze(WorkLists), % Smarter routine?
1958
?debug_msg("freezing node ~p~n",[U]),
1957
?debug_msg("freezing node ~p~n", [U]),
1959
1958
WorkLists0 = hipe_reg_worklists:remove_freeze(U, WorkLists),
1960
1959
%% The published algorithm adds U to the simplify worklist
1961
1960
%% before the freezeMoves() call. That breaks the worklist
1962
1961
%% invariants, which is why the order is switched here.
1963
{WorkLists1,Moves1} = freezeMoves(U,K,WorkLists0,Moves,IG,Alias),
1962
{WorkLists1, Moves1} = freezeMoves(U, K, WorkLists0, Moves, IG, Alias),
1964
1963
WorkLists2 = hipe_reg_worklists:add_simplify(U, WorkLists1),
1965
{WorkLists2,Moves1}.
1964
{WorkLists2, Moves1}.
1968
1967
%%----------------------------------------------------------------------
1986
1985
%%----------------------------------------------------------------------
1988
1987
-ifdef(COMPARE_ITERATED_OPTIMISTIC).
1989
freezeMoves(U,K,WorkLists,Moves,IG,Alias) ->
1988
freezeMoves(U, K, WorkLists, Moves, IG, Alias) ->
1990
1989
Nodes = hipe_moves:node_moves(U, Moves),
1991
freezeEm(U,Nodes,K,WorkLists,Moves,IG,Alias).
1990
freezeEm(U, Nodes, K, WorkLists, Moves, IG, Alias).
1993
1992
%% Find what the other value in a copy instruction is, return false if
1994
1993
%% the instruction isn't a move with the first argument in it.
2011
2010
true -> exit({?MODULE,moves}) % XXX: shouldn't happen
2014
freezeEm(_U,[],_K,WorkLists,Moves,_IG,_Alias) ->
2013
freezeEm(_U, [], _K, WorkLists, Moves, _IG, _Alias) ->
2015
2014
{WorkLists,Moves};
2016
freezeEm(U,[M|Ms],K,WorkLists,Moves,IG,Alias) ->
2015
freezeEm(U, [M|Ms], K, WorkLists, Moves, IG, Alias) ->
2017
2016
V = moves(U, M, Alias, Moves),
2018
{WorkLists2,Moves2} = freezeEm2(U,V,M,K,WorkLists,
2020
freezeEm(U,Ms,K,WorkLists2,Moves2,IG,Alias).
2017
{WorkLists2,Moves2} = freezeEm2(U, V, M, K, WorkLists, Moves, IG, Alias),
2018
freezeEm(U, Ms, K, WorkLists2, Moves2, IG, Alias).
2022
freezeEm2(U,V,M,K,WorkLists,Moves,IG,Alias) ->
2020
freezeEm2(U, V, M, K, WorkLists, Moves, IG, Alias) ->
2023
2021
case hipe_moves:member_active(M, Moves) of
2025
2023
Moves1 = hipe_moves:remove_active(M, Moves),
2026
freezeEm3(U,V,M,K,WorkLists,Moves1,IG,Alias);
2024
freezeEm3(U, V, M, K, WorkLists, Moves1, IG, Alias);
2028
2026
Moves1 = hipe_moves:remove_worklist(M, Moves),
2029
freezeEm3(U,V,M,K,WorkLists,Moves1,IG,Alias)
2027
freezeEm3(U, V, M, K, WorkLists, Moves1, IG, Alias)
2032
2030
freezeEm3(_U,V,_M,K,WorkLists,Moves,IG,_Alias) ->