###### tags: `Technical Notes`
# Assorted Optimizer Ideas
## Rule List
Split the rule list into rules that act on a "normal form" and rules that bring optimized pieces in normal form to their most efficient representation.
Rules on nomal form can be combined with their surroundings without complications.
Finalization rules are ones that destroy that normal form.
### "Finalize" Rules (to be run after regular "normal form rules")
- mulmod- and addmod-introduction https://github.com/ethereum/solidity/issues/10687
- sub re-introduction https://github.com/ethereum/solidity/issues/6765
- specific `or(and(...), and(...))` patterns to `xor(...)` https://github.com/ethereum/solidity/pull/14013
### Misc
- extcode* -> code* https://github.com/ethereum/solidity/issues/10236
compication: only runtime code, not init code
## Yul
### Optimizations involving Solvers and Reasoning
- More redundant store removing https://github.com/ethereum/solidity/issues/10690
- Loop optimization based on simple detected invariants: https://github.com/ethereum/solidity/issues/12015
- [Efficient assembly for high-level `do`...`while` loops](https://github.com/ethereum/solidity/issues/15442). Could be done via CFG simplification?
### Advanced Structural Simplification
- `if <cond1> { if <cond2> { ... }}` --> `if and(<cond1>, <cond2>) { ... }` and similar (see comments in https://github.com/ethereum/solidity/issues/13149)
## Codegen based optimizations
- Outlined dispatch https://github.com/ethereum/solidity/issues/12137
- Partial compile-time calldata decoding (related https://github.com/ethereum/solidity/issues/12103)
- Internal dispatch
- Constant time https://github.com/ethereum/solidity/issues/12650
- Binary https://github.com/ethereum/solidity/issues/12688
- Move data automatically to code https://github.com/ethereum/solidity/issues/13089
- No array bound checks in trivial cases https://github.com/ethereum/solidity/issues/13288
- External call return values to scratch space (see comments in https://github.com/ethereum/solidity/issues/13149)
- Optimize checks on calldatasize https://github.com/ethereum/solidity/issues/13623
## Misc and to-be-categorized
- `memoryguard`s as mechanism to reserve static memory space for more than stack variables https://github.com/ethereum/solidity/issues/13046
- Loop Invariant Code Motion for storage and memory writes that are invariant (https://github.com/ethereum/solidity/issues/10720)
- Ignore zero-length writes in DataFlowAnalyzer (https://github.com/ethereum/solidity/issues/10645)
- Constant optimizer on sub-expressions (https://github.com/ethereum/solidity/issues/11513)
- empty Keccak https://github.com/ethereum/solidity/issues/11740
- Loop variables https://github.com/ethereum/solidity/issues/11964
- Unused store eliminator https://github.com/ethereum/solidity/issues/12735
- Advanced memory optimizations using memory-SSA forms e.g. https://doi.org/10.1145/773146.773049
- Proper handling of `MCOPY` in redundant store eliminator, load resolver, etc.
- [Yul optimizer does not respect `--optimizer-runs` when inlining #13245](https://github.com/ethereum/solidity/issues/13245)
## Test Cases
- struct_copy.sol https://github.com/ethereum/solidity/issues/12211
-