Deadcode elimination (icode post pass)

This commit is contained in:
Ulf Norell
2019-02-04 14:08:26 +01:00
parent 478da2af33
commit dfa286d43c
5 changed files with 94 additions and 4 deletions
+13 -2
View File
@@ -26,7 +26,16 @@ simple_compile_test_() ->
<<"Type errors\n",ErrorString/binary>> = compile(ContractName),
check_errors(lists:sort(ExpectedErrors), ErrorString)
end} ||
{ContractName, ExpectedErrors} <- failing_contracts() ].
{ContractName, ExpectedErrors} <- failing_contracts() ] ++
[ {"Testing deadcode elimination",
fun() ->
#{ byte_code := NoDeadCode } = compile("nodeadcode"),
#{ byte_code := DeadCode } = compile("deadcode"),
SizeNoDeadCode = byte_size(NoDeadCode),
SizeDeadCode = byte_size(DeadCode),
?assertMatch({_, _, true}, {SizeDeadCode, SizeNoDeadCode, SizeDeadCode + 40 < SizeNoDeadCode}),
ok
end} ].
check_errors(Expect, ErrorString) ->
%% This removes the final single \n as well.
@@ -64,7 +73,9 @@ compilable_contracts() ->
"stack",
"test",
"builtin_bug",
"builtin_map_get_bug"
"builtin_map_get_bug",
"nodeadcode",
"deadcode"
].
%% Contracts that should produce type errors
+21
View File
@@ -0,0 +1,21 @@
namespace List =
function map1(f : 'a => 'b, xs : list('a)) =
switch(xs)
[] => []
x :: xs => f(x) :: map1(f, xs)
function map2(f : 'a => 'b, xs : list('a)) =
switch(xs)
[] => []
x :: xs => f(x) :: map2(f, xs)
contract Deadcode =
function inc1(xs : list(int)) : list(int) =
List.map1((x) => x + 1, xs)
function inc2(xs : list(int)) : list(int) =
List.map1((x) => x + 1, xs)
+21
View File
@@ -0,0 +1,21 @@
namespace List =
function map1(f : 'a => 'b, xs : list('a)) =
switch(xs)
[] => []
x :: xs => f(x) :: map1(f, xs)
function map2(f : 'a => 'b, xs : list('a)) =
switch(xs)
[] => []
x :: xs => f(x) :: map2(f, xs)
contract Deadcode =
function inc1(xs : list(int)) : list(int) =
List.map1((x) => x + 1, xs)
function inc2(xs : list(int)) : list(int) =
List.map2((x) => x + 1, xs)