aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hipe/icode/hipe_icode_type.erl
diff options
context:
space:
mode:
authorMagnus Lång <[email protected]>2017-02-20 14:57:16 +0100
committerMagnus Lång <[email protected]>2017-03-06 18:18:23 +0100
commit7e66eb6a07928448b7c1a6f265d782bebacd4e6b (patch)
treeb2b5f7bbd13103586c08d3fb4a7d425bebf73f71 /lib/hipe/icode/hipe_icode_type.erl
parent11f1271b5b54a474bcd5ebc1e9c34549610a918b (diff)
downloadotp-7e66eb6a07928448b7c1a6f265d782bebacd4e6b.tar.gz
otp-7e66eb6a07928448b7c1a6f265d782bebacd4e6b.tar.bz2
otp-7e66eb6a07928448b7c1a6f265d782bebacd4e6b.zip
hipe: Improve code generation for element/2
* Omit bounds check in more cases. A test case that needs this change to omit bounds check is added. * Improve code generation by reformulating bounds check to decrease register pressure.
Diffstat (limited to 'lib/hipe/icode/hipe_icode_type.erl')
-rw-r--r--lib/hipe/icode/hipe_icode_type.erl21
1 files changed, 11 insertions, 10 deletions
diff --git a/lib/hipe/icode/hipe_icode_type.erl b/lib/hipe/icode/hipe_icode_type.erl
index 815d1e57a8..aafaeb5a0a 100644
--- a/lib/hipe/icode/hipe_icode_type.erl
+++ b/lib/hipe/icode/hipe_icode_type.erl
@@ -1410,9 +1410,10 @@ transform_element2(I) ->
NewIndex =
case test_type(integer, IndexType) of
true ->
- case t_number_vals(IndexType) of
- unknown -> unknown;
- [_|_] = Vals -> {number, Vals}
+ case {number_min(IndexType), number_max(IndexType)} of
+ {Lb0, Ub0} when is_integer(Lb0), is_integer(Ub0) ->
+ {number, Lb0, Ub0};
+ {_, _} -> unknown
end;
_ -> unknown
end,
@@ -1427,19 +1428,19 @@ transform_element2(I) ->
_ -> unknown
end,
case {NewIndex, MinSize} of
- {{number, [_|_] = Ns}, {tuple, A}} when is_integer(A) ->
- case lists:all(fun(X) -> 0 < X andalso X =< A end, Ns) of
+ {{number, Lb, Ub}, {tuple, A}} when is_integer(A) ->
+ case 0 < Lb andalso Ub =< A of
true ->
- case Ns of
- [Idx] ->
+ case {Lb, Ub} of
+ {Idx, Idx} ->
[_, Tuple] = hipe_icode:args(I),
update_call_or_enter(I, #unsafe_element{index = Idx}, [Tuple]);
- [_|_] ->
+ {_, _} ->
NewFun = {element, [MinSize, valid]},
update_call_or_enter(I, NewFun)
end;
false ->
- case lists:all(fun(X) -> hipe_tagscheme:is_fixnum(X) end, Ns) of
+ case lists:all(fun(X) -> hipe_tagscheme:is_fixnum(X) end, [Lb, Ub]) of
true ->
NewFun = {element, [MinSize, fixnums]},
update_call_or_enter(I, NewFun);
@@ -1454,7 +1455,7 @@ transform_element2(I) ->
NewFun = {element, [MinSize, fixnums]},
update_call_or_enter(I, NewFun);
false ->
- NewFun = {element, [MinSize, NewIndex]},
+ NewFun = {element, [MinSize, NewIndex]},
update_call_or_enter(I, NewFun)
end
end.