Optimize away instructions that handle a variable number of elements
Clarification and motivation
This issue is a follow up to #582 (closed) and is closely related to #299 (closed).
After #582 (closed) we should have fixed the rules in the optimizer that can remove unnecessary combination of instruction that consume/add a static amount of elements from/to the stack.
By static here I mean that the amount elements is always the same, for example: CAR
(always takes 1 and leaves 1), PAIR
(takes 2, leaves 1) and UNPAIR
(takes 1, leaves 2).
There are however some that handle a variable amount of elements from the stack, for example DROP n
and PAIR n
.
These aren't covered by rules optimizing unnecessary combinations, like:
-
PAIR n; DROP
->DROP n
-
PAIR n; CDR; CDR
->DROP 2; PAIR (n-2)
Note that the hardest part about dealing with these rules is to prove to GHC that these transformation are, in fact, of the correct types.
For this reason I suggest starting this only after #299 (closed), that also has to deal with this, to avoid duplicating effort.
Acceptance criteria
The optimizer is able to optimize instructions that handle a variable number of elements.