Skip to content

Commit a211a3a

Browse files
committed
improve type inference when one of the bounds is a literal
1 parent cb2e4e2 commit a211a3a

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

lib/compiler/src/beam_ssa_type.erl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2819,6 +2819,14 @@ infer_type({bif,is_integer}, [#b_var{}=Arg,
28192819
#b_literal{val=Max}], _Ts, _Ds) when Min =< Max ->
28202820
T = {Arg, beam_types:make_integer(Min, Max)},
28212821
{[T], [T]};
2822+
infer_type({bif,is_integer}, [#b_var{}=Arg,
2823+
#b_literal{val=Min},_], _Ts, _Ds) ->
2824+
T = {Arg, make_number({Min,'+inf'})},
2825+
{[T], [T]};
2826+
infer_type({bif,is_integer}, [#b_var{}=Arg,_,
2827+
#b_literal{val=Max}], _Ts, _Ds) ->
2828+
T = {Arg, make_number({'-inf',Max})},
2829+
{[T], [T]};
28222830
infer_type({bif,is_integer}, [#b_var{}=Arg, _, _], _Ts, _Ds) ->
28232831
%% We cannot subtract the type when the bounds are unknown: `Arg` may still
28242832
%% be an integer if it is not in the tested range.

lib/compiler/test/guard_SUITE.erl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3440,6 +3440,12 @@ is_integer_3_guard(_Config) ->
34403440
false = is_integer_3_guard_3(id(1024)),
34413441
true = is_integer_3_guard_3(id(1025)),
34423442

3443+
true = is_integer_3_guard_4(id(2), id(5)),
3444+
false = is_integer_3_guard_4(id(2), id(0)),
3445+
false = is_integer_3_guard_4(id(5), id(3)),
3446+
false = is_integer_3_guard_4(id(1024), id(1023)),
3447+
true = is_integer_3_guard_4(id(1025), id(1026)),
3448+
34433449
ok.
34443450

34453451
is_integer_3_guard_1(X, LB, UB) when is_integer(X, LB, UB) ->
@@ -3457,6 +3463,12 @@ is_integer_3_guard_3(X) when not is_integer(X, 1, 1024) ->
34573463
is_integer_3_guard_3(X) ->
34583464
not is_integer(X, 1, 1024).
34593465

3466+
is_integer_3_guard_4(X, Y) when is_integer(X, 1, Y) ->
3467+
true = is_integer(X, 1, Y);
3468+
is_integer_3_guard_4(X, Y) when is_integer(X, Y, 1)->
3469+
is_integer(X, Y, 1);
3470+
is_integer_3_guard_4(_, _) -> false.
3471+
34603472
%% Call this function to turn off constant propagation.
34613473
id(I) -> I.
34623474

0 commit comments

Comments
 (0)