Combine adjacent DROP
This commit is contained in:
parent
9ae39bab97
commit
dae4f58297
@ -365,6 +365,21 @@ let rec opt_tail_fail : michelson -> michelson =
|
|||||||
Prim (l, p, List.map opt_tail_fail args, annot)
|
Prim (l, p, List.map opt_tail_fail args, annot)
|
||||||
| x -> x
|
| x -> x
|
||||||
|
|
||||||
|
let opt_combine_drops : peep2 = function
|
||||||
|
(* DROP ; DROP ↦ DROP 2 *)
|
||||||
|
| Prim (_, I_DROP, [], _), Prim (_, I_DROP, [], _) ->
|
||||||
|
Some [i_dropn 2]
|
||||||
|
(* DROP ; DROP m ↦ DROP 1+m *)
|
||||||
|
| Prim (_, I_DROP, [], _), Prim (_, I_DROP, [Int (_, m)], _) ->
|
||||||
|
Some [i_dropn (1 + Z.to_int m)]
|
||||||
|
(* DROP n ; DROP ↦ DROP n+1 *)
|
||||||
|
| Prim (_, I_DROP, [Int (_, n)], _), Prim (_, I_DROP, [], _) ->
|
||||||
|
Some [i_dropn (Z.to_int n + 1)]
|
||||||
|
(* DROP n ; DROP m ↦ DROP n+m *)
|
||||||
|
| Prim (_, I_DROP, [Int (_, n)], _), Prim (_, I_DROP, [Int (_, m)], _) ->
|
||||||
|
Some [i_dropn (Z.to_int n + Z.to_int m)]
|
||||||
|
| _ -> None
|
||||||
|
|
||||||
let optimize : michelson -> michelson =
|
let optimize : michelson -> michelson =
|
||||||
fun x ->
|
fun x ->
|
||||||
let x = use_lambda_instr x in
|
let x = use_lambda_instr x in
|
||||||
@ -378,4 +393,5 @@ let optimize : michelson -> michelson =
|
|||||||
peephole @@ peep2 opt_swap2 ;
|
peephole @@ peep2 opt_swap2 ;
|
||||||
] in
|
] in
|
||||||
let x = iterate_optimizer (sequence_optimizers optimizers) x in
|
let x = iterate_optimizer (sequence_optimizers optimizers) x in
|
||||||
|
let x = iterate_optimizer (peephole @@ peep2 opt_combine_drops) x in
|
||||||
x
|
x
|
||||||
|
@ -58,6 +58,7 @@ let i_some = prim I_SOME
|
|||||||
let i_lambda arg ret body = prim ~children:[arg;ret;body] I_LAMBDA
|
let i_lambda arg ret body = prim ~children:[arg;ret;body] I_LAMBDA
|
||||||
let i_empty_map src dst = prim ~children:[src;dst] I_EMPTY_MAP
|
let i_empty_map src dst = prim ~children:[src;dst] I_EMPTY_MAP
|
||||||
let i_drop = prim I_DROP
|
let i_drop = prim I_DROP
|
||||||
|
let i_dropn n = prim I_DROP ~children:[int (Z.of_int n)]
|
||||||
let i_exec = prim I_EXEC
|
let i_exec = prim I_EXEC
|
||||||
|
|
||||||
let i_if a b = prim ~children:[seq [a] ; seq[b]] I_IF
|
let i_if a b = prim ~children:[seq [a] ; seq[b]] I_IF
|
||||||
|
Loading…
Reference in New Issue
Block a user