File 3311-Derive-ranges-from-matching-of-signed-integer-segmen.patch of Package erlang
From 6ffcc0950307198882b8ac9ebc821a21de3dffeb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Wed, 9 Feb 2022 08:33:10 +0100
Subject: [PATCH 1/2] Derive ranges from matching of signed integer segments
Derive ranges from matching of signed integer segments using the
binary syntax.
---
lib/compiler/src/beam_ssa_type.erl | 7 ++++---
lib/compiler/src/beam_validator.erl | 17 ++++++++++++-----
2 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/lib/compiler/src/beam_ssa_type.erl b/lib/compiler/src/beam_ssa_type.erl
index 00b5f6db1e..487f793151 100644
--- a/lib/compiler/src/beam_ssa_type.erl
+++ b/lib/compiler/src/beam_ssa_type.erl
@@ -2208,12 +2208,13 @@ bs_match_type(integer, Args) ->
#b_literal{val=Size},
#b_literal{val=Unit}] when Size * Unit < 64 ->
NumBits = Size * Unit,
+ Max = (1 bsl NumBits) - 1,
case member(unsigned, Flags) of
true ->
- beam_types:make_integer(0, (1 bsl NumBits)-1);
+ beam_types:make_integer(0, Max);
false ->
- %% Signed integer. Don't bother.
- #t_integer{}
+ Min = -(Max + 1),
+ beam_types:make_integer(Min, Max)
end;
[_|_] ->
#t_integer{}
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl
index 11f328b470..74b057e903 100644
--- a/lib/compiler/src/beam_validator.erl
+++ b/lib/compiler/src/beam_validator.erl
@@ -965,11 +965,18 @@ vi({test,bs_get_integer2=Op,{f,Fail},Live,
NumBits = Unit * Sz,
Stride = NumBits,
- Type = case member(unsigned, Flags) of
- true when 0 =< NumBits, NumBits =< 64 ->
- beam_types:make_integer(0, (1 bsl NumBits)-1);
- _ ->
- %% Signed integer, way too large, or negative size.
+ Type = if
+ 0 =< NumBits, NumBits =< 64 ->
+ Max = (1 bsl NumBits) - 1,
+ case member(unsigned, Flags) of
+ true ->
+ beam_types:make_integer(0, Max);
+ false ->
+ Min = -(Max + 1),
+ beam_types:make_integer(Min, Max)
+ end;
+ true ->
+ %% Way too large or negative size.
#t_integer{}
end,
--
2.34.1