Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
4155-dialyzer-Optimize-infimum-on-bit-strings.p...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 4155-dialyzer-Optimize-infimum-on-bit-strings.patch of Package erlang
From 923ecb37fa2f24593d4f12585ffe00a7ac4a4676 Mon Sep 17 00:00:00 2001 From: Hans Bolinder <hasse@erlang.org> Date: Wed, 28 Jul 2021 10:19:02 +0200 Subject: [PATCH 5/7] dialyzer: Optimize infimum on bit strings t_inf/2 finds the common base of two bit string types faster in some cases. It is a little bit slower on many cases, though. --- lib/dialyzer/src/erl_types.erl | 10 ++++++---- lib/dialyzer/test/erl_types_SUITE.erl | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl index 7b88ebd59c..e381bfb64e 100644 --- a/lib/hipe/cerl/erl_types.erl +++ b/lib/hipe/cerl/erl_types.erl @@ -2933,7 +2933,7 @@ t_inf(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B, _Opaques) -> %% result in a none result. Pairs = map_pairwise_merge( - %% For optional keys in both maps, when the infinimum is none, we have + %% For optional keys in both maps, when the infimum is none, we have %% essentially concluded that K must not be a key in the map. fun(K, ?opt, V1, ?opt, V2) -> {K, ?opt, t_inf(V1, V2)}; %% When a key is optional in one map, but mandatory in another, it @@ -3404,9 +3404,11 @@ findfirst(N1, N2, U1, B1, U2, B2) -> if Val1 =:= Val2 -> Val1; Val1 > Val2 -> - findfirst(N1, N2+1, U1, B1, U2, B2); + N2_1 = N2 + max((Val1 - Val2) div U2, 1), + findfirst(N1, N2_1, U1, B1, U2, B2); Val1 < Val2 -> - findfirst(N1+1, N2, U1, B1, U2, B2) + N1_1 = N1 + max((Val2 - Val1) div U1, 1), + findfirst(N1_1, N2, U1, B1, U2, B2) end. %% Optimization. Before Erlang/OTP 25, subst_all_vars_to_any() was @@ -4046,7 +4048,7 @@ t_subtract(?map(APairs, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B) -> %% * The arguments constrain A at least as much as B, i.e. that A so far %% is a subtype of B. In that case they return false %% * That for the particular arguments, A being a subtype of B does not - %% hold, but the infinimum of A and B is nonempty, and by narrowing a + %% hold, but the infimum of A and B is nonempty, and by narrowing a %% pair in A, we can create a type that excludes some elements in the %% infinumum. In that case, they will return that pair. %% * That for the particular arguments, A being a subtype of B does not diff --git a/lib/hipe/test/erl_types_SUITE.erl b/lib/hipe/test/erl_types_SUITE.erl index 7d7c144b69..72a705ee26 100644 --- a/lib/hipe/test/erl_types_SUITE.erl +++ b/lib/hipe/test/erl_types_SUITE.erl @@ -15,7 +15,9 @@ -module(erl_types_SUITE). -export([all/0, - consistency_and_to_string/1, map_multiple_representations/1]). + consistency_and_to_string/1, + misc/1, + map_multiple_representations/1]). %% Simplify calls into erl_types and avoid importing the entire module. -define(M, erl_types). @@ -23,7 +25,7 @@ -include_lib("common_test/include/ct.hrl"). all() -> - [consistency_and_to_string, map_multiple_representations]. + [consistency_and_to_string, misc, map_multiple_representations]. consistency_and_to_string(_Config) -> %% Check consistency of types @@ -196,6 +198,16 @@ consistency_and_to_string(_Config) -> "{'false',_} | {'true',_}" = ?M:t_to_string(Union10), "{'true',integer()}" = ?M:t_to_string(?M:t_inf(Union10, ?M:t_tuple([?M:t_atom(true), ?M:t_integer()]))). +misc(_Config) -> + %% Miscellaneous cases which have been fixed. + + %% Used to take "forever". + B1_1 = ?M:t_bitstr(6442450944, 1456), + B1_2 = ?M:t_bitstr(85, 7), + R1_R = ?M:t_bitstr(547608330240, 347892352432), + R1_R = ?M:t_inf(B1_1, B1_2), + ok. + %% OTP-17537. map_multiple_representations(_Config) -> DefV = erl_types:t_atom(), -- 2.31.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor