Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:26
erlang
3134-Enhance-range-analysis-for-the-bsl-operato...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 3134-Enhance-range-analysis-for-the-bsl-operator.patch of Package erlang
From a71c2c625e4d5ef46e6ee04af1a2edc8771bc469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org> Date: Sun, 13 Aug 2023 07:32:58 +0200 Subject: [PATCH 4/6] Enhance range analysis for the bsl operator Teach beam_bounds:bounds/3 to calculate a range for the `bsl` operator when the left-hand side operand is partly unbounded. For example: bsl0(A) when is_integer(A), A >= 1 -> %% Range for A is 1..'+inf' A bsl 3. % Range is 8..'+inf' bsl1(A) when is_integer(A), A =< 10 -> %% Range for A is '-inf'..10 A bsl 3. % Range is '-inf'..80 --- lib/compiler/src/beam_bounds.erl | 4 ++-- lib/compiler/test/beam_bounds_SUITE.erl | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/compiler/src/beam_bounds.erl b/lib/compiler/src/beam_bounds.erl index 59b7f27c86..034aded4b8 100644 --- a/lib/compiler/src/beam_bounds.erl +++ b/lib/compiler/src/beam_bounds.erl @@ -186,8 +186,8 @@ bounds('bsr', R1, R2) -> end; bounds('bsl', R1, R2) -> case {R1,R2} of - {{A,B}, {C,D}} when abs(A) bsr ?NUM_BITS =:= 0, - abs(B) bsr ?NUM_BITS =:= 0 -> + {{A,B}, {C,D}} when A =:= '-inf' orelse abs(A) bsr ?NUM_BITS =:= 0, + B =:= '+inf' orelse abs(B) bsr ?NUM_BITS =:= 0 -> Min = inf_min(inf_bsl(A, C), inf_bsl(A, D)), Max = inf_max(inf_bsl(B, C), inf_bsl(B, D)), normalize({Min,Max}); diff --git a/lib/compiler/test/beam_bounds_SUITE.erl b/lib/compiler/test/beam_bounds_SUITE.erl index 42a8add3d7..5f5d2441f1 100644 --- a/lib/compiler/test/beam_bounds_SUITE.erl +++ b/lib/compiler/test/beam_bounds_SUITE.erl @@ -267,8 +267,13 @@ bsl_bounds(_Config) -> {2,'+inf'} = beam_bounds:bounds('bsl', {1,10}, {1,10_000}), {0,'+inf'} = beam_bounds:bounds('bsl', {1,10}, {-10,10_000}), + {'-inf',-20} = beam_bounds:bounds('bsl', {-30,-10}, {1,10_000}), + {'-inf',-2} = beam_bounds:bounds('bsl', {-9,-1}, {1,10_000}), any = beam_bounds:bounds('bsl', {-7,10}, {1,10_000}), + {0,'+inf'} = beam_bounds:bounds('bsl', {0,'+inf'}, {0,'+inf'}), + {20,'+inf'} = beam_bounds:bounds('bsl', {20,30}, {0,'+inf'}), + any = beam_bounds:bounds('bsl', {-10,100}, {0,'+inf'}), any = beam_bounds:bounds('bsl', {-10,100}, {1,'+inf'}), any = beam_bounds:bounds('bsl', {-10,100}, {-1,'+inf'}), @@ -281,6 +286,11 @@ bsl_bounds(_Config) -> {'-inf',-1} = beam_bounds:bounds('bsl', {-10,-1}, {500,1024}), {0,'+inf'} = beam_bounds:bounds('bsl', {1,10}, {500,1024}), + {'-inf',-40} = beam_bounds:bounds('bsl', {'-inf',-10}, {2,64}), + {'-inf',224} = beam_bounds:bounds('bsl', {'-inf',7}, {3,5}), + + any = beam_bounds:bounds('bsl', {'-inf',7}, {3,'+inf'}), + ok. lt_bounds(_Config) -> -- 2.35.3
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