diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index 213ab2c..1e1cf31 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -1352,12 +1352,12 @@ chase_labels([L | Ls], Map, Live) -> chase_labels(New ++ Ls, Map, Live#{ L => true }). %% Replace PUSH, RETURN by RETURNR, drop returns after tail calls. -tweak_returns(['RETURN', {'PUSH', A} | Code]) -> [{'RETURNR', A} | Code]; -tweak_returns(['RETURN' | Code = [{'CALL_T', _} | _]]) -> Code; -tweak_returns(['RETURN' | Code = [{'CALL_TR', _, _} | _]]) -> Code; -tweak_returns(['RETURN' | Code = [{'CALL_GT', _} | _]]) -> Code; -tweak_returns(['RETURN' | Code = [{'CALL_GTR', _, _} | _]])-> Code; -tweak_returns(['RETURN' | Code = [{'ABORT', _} | _]]) -> Code; +tweak_returns(['RETURN', {'PUSH', A} | Code]) -> [{'RETURNR', A} | Code]; +tweak_returns(['RETURN' | Code = [{'CALL_T', _} | _]]) -> Code; +tweak_returns(['RETURN' | Code = [{'CALL_TR', _, _, _} | _]]) -> Code; +tweak_returns(['RETURN' | Code = [{'CALL_GT', _} | _]]) -> Code; +tweak_returns(['RETURN' | Code = [{'CALL_GTR', _, _, _, _} | _]]) -> Code; +tweak_returns(['RETURN' | Code = [{'ABORT', _} | _]]) -> Code; tweak_returns(Code) -> Code. %% -- Split basic blocks at CALL instructions -- @@ -1373,6 +1373,8 @@ split_calls(Ref, [I | Code], Acc, Blocks) when element(1, I) == 'CALL'; element(1, I) == 'CALL_GR'; element(1, I) == 'jumpif' -> split_calls(make_ref(), Code, [], [{Ref, lists:reverse([I | Acc])} | Blocks]); +split_calls(Ref, [{'ABORT', _} = I | _Code], Acc, Blocks) -> + lists:reverse([{Ref, lists:reverse([I | Acc])} | Blocks]); split_calls(Ref, [I | Code], Acc, Blocks) -> split_calls(Ref, Code, [I | Acc], Blocks).