aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hipe/regalloc/hipe_temp_map.erl
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2016-09-09 18:53:02 +0200
committerSverker Eriksson <[email protected]>2016-09-09 18:53:02 +0200
commit45bd8440673a814e068397235ce7794f22f1e3f5 (patch)
tree4525e75fff69e990ba308bf1bc7a99346ffdda4e /lib/hipe/regalloc/hipe_temp_map.erl
parent8f6c2f8fb8e3bf2c7c6ebbc77ed2b0428d40fd78 (diff)
parentea710644b198f7800f0daf2de0d152cf8e3e9bb3 (diff)
downloadotp-45bd8440673a814e068397235ce7794f22f1e3f5.tar.gz
otp-45bd8440673a814e068397235ce7794f22f1e3f5.tar.bz2
otp-45bd8440673a814e068397235ce7794f22f1e3f5.zip
Merge branch 'sverker/hipe-speedy-reg-alloc/PR-1159/OTP-13879'
* sverker/hipe-speedy-reg-alloc/PR-1159: hipe: Refactor ra callbacks to accept context arg hipe: Reuse liveness between regalloc iterations hipe: Add ra_partitioned to o1 and up hipe_regalloc_prepass: Change splitting heuristic hipe: Make sure prepass temps are below SpillLimit hipe_regalloc_prepass: Rename coloring collisions hipe_ppc: Add code rewrite RA callbacks hipe_sparc: Add code rewrite RA callbacks hipe_arm: Add code rewrite RA callbacks hipe_x86: Add code rewrite RA callbacks hipe: Remove defun_to_cfg/1 RA callback Add new sanity assertion to hipe_regalloc_prepass Simplify hipe_x86_ra_finalise:conv_ra_maplet/3 hipe_x86: Simplify ra_postconditions is_mem_opnd hipe_x86: Fix pseudo_tailcall prettyprinting hipe_x86: Extra sanity assertions hipe: clean up unnecessary catches hipe: Remove temp reuse from call_fun hipe: Add IG partitioning to hipe_regalloc_prepass hipe: Add hipe_regalloc_prepass
Diffstat (limited to 'lib/hipe/regalloc/hipe_temp_map.erl')
-rw-r--r--lib/hipe/regalloc/hipe_temp_map.erl39
1 files changed, 20 insertions, 19 deletions
diff --git a/lib/hipe/regalloc/hipe_temp_map.erl b/lib/hipe/regalloc/hipe_temp_map.erl
index 4085a0e1a7..b683d08054 100644
--- a/lib/hipe/regalloc/hipe_temp_map.erl
+++ b/lib/hipe/regalloc/hipe_temp_map.erl
@@ -33,10 +33,12 @@
-module(hipe_temp_map).
--export([cols2tuple/2, is_spilled/2, to_substlist/1]).
+-export([cols2tuple/3, find/2, is_spilled/2, to_substlist/1]).
-include("../main/hipe.hrl").
+-type target_context() :: any().
+
%%----------------------------------------------------------------------------
%% Convert a list of [{R0, C1}, {R1, C2}, ...] to a temp_map
%% (Currently implemented as a tuple) tuple {C1, C2, ...}.
@@ -47,34 +49,32 @@
%% element 1
%%----------------------------------------------------------------------------
--spec cols2tuple(hipe_map(), atom()) -> hipe_temp_map().
+-spec cols2tuple(hipe_map(), module(), target_context()) -> hipe_temp_map().
-cols2tuple(Map, Target) ->
- ?ASSERT(check_list(Map)),
- SortedMap = lists:keysort(1, Map),
- cols2tuple(0, SortedMap, [], Target).
+cols2tuple(Map, TgtMod, TgtCtx) ->
+ SortedMap = lists:keysort(1, Map),
+ cols2tuple(0, SortedMap, [], TgtMod, TgtCtx).
-%% sorted_cols2tuple(Map, Target) ->
-%% ?ASSERT(check_list(Map)),
+%% sorted_cols2tuple(Map, TgtMod, TgtCtx) ->
%% ?ASSERT(Map =:= lists:keysort(1, Map)),
-%% cols2tuple(0, Map, [], Target).
+%% cols2tuple(0, Map, [], TgtMod, TgtCtx).
%% Build a dense mapping
-cols2tuple(_, [], Vs, _) ->
+cols2tuple(_, [], Vs, _, _) ->
%% Done reverse the list and convert to tuple.
list_to_tuple(lists:reverse(Vs));
-cols2tuple(N, [{R, C}|Ms], Vs, Target) when N =:= R ->
+cols2tuple(N, [{R, C}|Ms], Vs, TgtMod, TgtCtx) when N =:= R ->
%% N makes sure the mapping is dense. N is he next key.
- cols2tuple(N+1, Ms, [C|Vs], Target);
-cols2tuple(N, SourceMapping, Vs, Target) ->
+ cols2tuple(N+1, Ms, [C|Vs], TgtMod, TgtCtx);
+cols2tuple(N, SourceMapping=[{R,_}|_], Vs, TgtMod, TgtCtx) when N < R ->
%% The source was sparse, make up some placeholders...
Val =
- case Target:is_precoloured(N) of
+ case TgtMod:is_precoloured(N, TgtCtx) of
%% If it is precoloured, we know what to map it to.
true -> {reg, N};
false -> unknown
end,
- cols2tuple(N+1, SourceMapping, [Val|Vs], Target).
+ cols2tuple(N+1, SourceMapping, [Val|Vs], TgtMod, TgtCtx).
%%
%% True if temp Temp is spilled.
@@ -82,7 +82,7 @@ cols2tuple(N, SourceMapping, Vs, Target) ->
-spec is_spilled(non_neg_integer(), hipe_temp_map()) -> boolean().
is_spilled(Temp, Map) ->
- case element(Temp+1, Map) of
+ case find(Temp, Map) of
{reg, _R} -> false;
{fp_reg, _R}-> false;
{spill, _N} -> true;
@@ -106,9 +106,10 @@ is_spilled(Temp, Map) ->
%% {spill, _N} -> false;
%% unknown -> false
%% end.
-%%
-%% %% Returns the inf temp Temp is mapped to.
-%% find(Temp, Map) -> element(Temp+1, Map).
+
+%% Returns the inf temp Temp is mapped to.
+find(Temp, Map) when Temp < tuple_size(Map) -> element(Temp+1, Map);
+find(_, Map) when is_tuple(Map) -> unknown. % consistency with cols2tuple/3
%%