diff options
Diffstat (limited to 'erts/emulator/test/op_SUITE.erl')
-rw-r--r-- | erts/emulator/test/op_SUITE.erl | 255 |
1 files changed, 252 insertions, 3 deletions
diff --git a/erts/emulator/test/op_SUITE.erl b/erts/emulator/test/op_SUITE.erl index dd13fde16d..73b556ad66 100644 --- a/erts/emulator/test/op_SUITE.erl +++ b/erts/emulator/test/op_SUITE.erl @@ -25,7 +25,7 @@ -export([all/0, suite/0, bsl_bsr/1,logical/1,t_not/1,relop_simple/1,relop/1, complex_relop/1,unsafe_fusing/1, - range_tests/1,typed_relop/1]). + range_tests/1,combined_relops/1,typed_relop/1]). -import(lists, [foldl/3,flatmap/2]). @@ -35,7 +35,8 @@ suite() -> all() -> [bsl_bsr, logical, t_not, relop_simple, relop, - complex_relop, unsafe_fusing, range_tests, typed_relop]. + complex_relop, unsafe_fusing, range_tests, + combined_relops, typed_relop]. %% Test the bsl and bsr operators. bsl_bsr(Config) when is_list(Config) -> @@ -523,7 +524,7 @@ range_tests(_Config) -> inside = range_big(MinSmall), inside = range_big(-1 bsl 58), inside = range_big(0), - inside = range_barely_small(17.75), + inside = range_big(17.75), inside = range_big(1 bsl 58), inside = range_big(MaxSmall), @@ -531,6 +532,39 @@ range_tests(_Config) -> greater = range_big(1 bsl 64), greater = range_big(float(1 bsl 64)), + inside = int_range_1(id(-100_000)), + inside = int_range_1(id(-10)), + inside = int_range_1(id(100)), + inside = int_range_1(id(100_000)), + + outside = int_range_1(id(atom)), + outside = int_range_1(id(-1 bsl 60)), + outside = int_range_1(id(-100_001)), + outside = int_range_1(id(100_001)), + outside = int_range_1(id(1 bsl 60)), + + inside = int_range_2(id(1)), + inside = int_range_2(id(42)), + inside = int_range_2(id(16#f000_0000)), + + outside = int_range_2(id([a,list])), + outside = int_range_2(id(0)), + outside = int_range_1(id(-1 bsl 60)), + outside = int_range_1(id(1 bsl 60)), + + inside = int_range_3(id(1 bsl 28)), + inside = int_range_3(id((1 bsl 28) + 1)), + inside = int_range_3(id((1 bsl 33) + 555)), + inside = int_range_3(id((1 bsl 58) - 1)), + inside = int_range_3(id(1 bsl 58)), + + outside = int_range_3(id({a,tuple})), + outside = int_range_3(id(-1 bsl 60)), + outside = int_range_3(id(-1000)), + outside = int_range_3(id(100)), + outside = int_range_3(id((1 bsl 58) + 1)), + outside = int_range_3(id(1 bsl 60)), + ok. range(X) -> @@ -683,6 +717,221 @@ range_big_2(X) when (-1 bsl 59) - 1 =< X, X =< 1 bsl 59 -> range_big_2(_) -> outside. +int_range_1(X) when is_integer(X), -100_000 =< X, X =< 100_000 -> + inside; +int_range_1(_) -> + outside. + +int_range_2(X) when is_integer(X), 1 =< X, X =< 16#f000_0000 -> + inside; +int_range_2(_) -> + outside. + +int_range_3(X) when is_integer(X), 1 bsl 28 =< X, X =< 1 bsl 58 -> + inside; +int_range_3(_) -> + outside. + +combined_relops(_Config) -> + other = test_tok_char(-1 bsl 64), + other = test_tok_char($A - 1), + + var = test_tok_char($A), + var = test_tok_char($B), + var = test_tok_char($P), + var = test_tok_char($Y), + var = test_tok_char($Z), + + other = test_tok_char($Z + 1), + + var = tok_char($_), + other = tok_char(float($_)), + + other = test_tok_char(1 bsl 64), + + other = test_tok_char(atom), + other = test_tok_char(self()), + + %% + b = ge_ge_int_range_1(-200), + b = ge_ge_int_range_1(-101), + + a = ge_ge_int_range_1(-100), + a = ge_ge_int_range_1(-50), + a = ge_ge_int_range_1(-10), + + b = ge_ge_int_range_1(-9), + b = ge_ge_int_range_1(-6), + + a = ge_ge_int_range_1(-5), + + b = ge_ge_int_range_1(-4), + b = ge_ge_int_range_1(0), + b = ge_ge_int_range_1(42), + + %% + b = ge_ge_int_range_2(-1 bsl 59), + + a = ge_ge_int_range_2((-1 bsl 59) + 1), + a = ge_ge_int_range_2(-1 bsl 58), + a = ge_ge_int_range_2(-1000), + a = ge_ge_int_range_2(1 bsl 58), + a = ge_ge_int_range_2((1 bsl 59) - 10), + + b = ge_ge_int_range_2((1 bsl 59) - 9), + + a = ge_ge_int_range_2((1 bsl 59) - 5), + + b = ge_ge_int_range_2((1 bsl 59) - 4), + b = ge_ge_int_range_2((1 bsl 59) - 1), + + %% + b = ge_ge_int_range_3(-1 bsl 59), + + b = ge_ge_int_range_3((-1 bsl 59) + 1), + b = ge_ge_int_range_3(-1 bsl 58), + b = ge_ge_int_range_3(-1000), + b = ge_ge_int_range_3(1 bsl 58), + + a = ge_ge_int_range_3((1 bsl 59) - 20), + a = ge_ge_int_range_3((1 bsl 59) - 15), + a = ge_ge_int_range_3((1 bsl 59) - 10), + + b = ge_ge_int_range_3((1 bsl 59) - 9), + + a = ge_ge_int_range_3((1 bsl 59) - 5), + + b = ge_ge_int_range_3((1 bsl 59) - 4), + b = ge_ge_int_range_3((1 bsl 59) - 1), + + %% + b = ge_ge_int_range_4(-1 bsl 59), + + a = ge_ge_int_range_4((-1 bsl 59) + 1), + a = ge_ge_int_range_4((-1 bsl 59) + 3), + a = ge_ge_int_range_4((-1 bsl 59) + 5), + + b = ge_ge_int_range_4((-1 bsl 59) + 6), + b = ge_ge_int_range_4((-1 bsl 59) + 9), + + a = ge_ge_int_range_4((-1 bsl 59) + 10), + + b = ge_ge_int_range_4((-1 bsl 59) + 11), + + b = ge_ge_int_range_4(0), + b = ge_ge_int_range_4(1000), + + b = ge_ge_int_range_4((1 bsl 59) - 1), + + %% Test a sequence that can't occur in optimized code: + %% is_ge Fail Src 10 + %% is_ge Fail Src 5 + Module = {?FUNCTION_NAME,[{test,1}],[], + [{function, test, 1, 2, + [{label,1}, + {line,[{location,"t.erl",4}]}, + {func_info,{atom,?FUNCTION_NAME},{atom,test},1}, + {label,2}, + {test,is_ge,{f,4}, + [{tr,{x,0},{t_integer,{0,1000}}}, + {integer,10}]}, + {test,is_ge, + {f,3}, + [{tr,{x,0},{t_integer,{0,1000}}}, + {integer,5}]}, + {label,3}, + {move,{atom,a},{x,0}}, + return, + {label,4}, + {move,{atom,b},{x,0}}, + return]}], + 5}, + + {ok,Mod,Code} = compile:forms(Module, [from_asm,time,report]), + {module,Mod} = code:load_binary(Mod, Mod, Code), + + b = Mod:test(0), + b = Mod:test(5), + b = Mod:test(9), + + a = Mod:test(10), + a = Mod:test(11), + a = Mod:test(1000), + + true = code:delete(Mod), + _ = code:purge(Mod), + + ok. + +test_tok_char(C) -> + Result = tok_char(C), + if + is_integer(C) -> + Result = tok_char(float(C)), + Result = tok_char_int(C), + if + C band 16#FFFF =:= C -> + Result = tok_char_int_range(C); + true -> + Result + end; + true -> + Result + end. + +%% is_ge + is_lt +tok_char(C) when $A =< C, C =< $Z -> + var; +tok_char($_) -> + var; +tok_char(_) -> + other. + +%% is_ge + is_ge +tok_char_int(C) when $A =< C, C =< $Z -> + var; +tok_char_int($_) -> + var; +tok_char_int(_) -> + other. + +%% is_ge + is_ge +tok_char_int_range(C) when $A =< C, C =< $Z -> + var; +tok_char_int_range($_) -> + var; +tok_char_int_range(_) -> + other. + +%% is_ge + is_ge +ge_ge_int_range_1(X) when -100 =< X, X =< -10 -> + a; +ge_ge_int_range_1(-5) -> + a; +ge_ge_int_range_1(_) -> + b. + +ge_ge_int_range_2(X) when (-1 bsl 59) + 1 =< X, X =< (1 bsl 59) - 10 -> + a; +ge_ge_int_range_2((1 bsl 59) - 5) -> + a; +ge_ge_int_range_2(_) -> + b. + +ge_ge_int_range_3(X) when (1 bsl 59) - 20 =< X, X =< (1 bsl 59) - 10 -> + a; +ge_ge_int_range_3((1 bsl 59) - 5) -> + a; +ge_ge_int_range_3(_) -> + b. + +ge_ge_int_range_4(X) when (-1 bsl 59) + 1 =< X, X =< (-1 bsl 59) + 5 -> + a; +ge_ge_int_range_4((-1 bsl 59) + 10) -> + a; +ge_ge_int_range_4(_) -> + b. + %% Tests operators where type hints are significant. typed_relop(Config) when is_list(Config) -> _ = [compare_integer_pid(1 bsl N) || N <- lists:seq(1, 64)], |