gir/optimizations.md

62 lines
2.3 KiB
Markdown

Gir has five optimization passes.
joinAdjacentOps
---------------
* *consumes*: commands without offsets
* *produces*: commands without offsets
* *unknown commands*: passed through unmodified
* *acts on*: `moveHead`, `add`
* *other known commands*: `loop` (recurses)
`joinAdjacentOps` joins adjacent `moveHead`s and `add`s together. Normally
`parse` joins runs of `<>` or `+-` into one command, but if the runs are
interrupted by another character two commands get generated. `moveHead`s are
joined first, before the pass goes over the generated commands again and
joins `add`s.
transformClearLoops
-------------------
* *consumes*: commands without offsets
* *produces*: commands without offsets
* *unknown commands*: passed through unmodified
* *acts on*: `loop` with one command, which is `add 1` or `add -1`
* *other known commands*: `loop` (recurses)
`transformClearLoops` changes loops of the form `[-]` or `[+]` into a single
`clear` command.
addOffsetProperties
-------------------
* *consumes*: commands without offsets
* *produces*: commands with offsets
* *unknown commands*: raise UnknownIRError
* *acts on*: `moveHead`, `add`, `clear`, `writeByte`, `readByte`, `loop`
`addOffsetProperties` adds an `offset` property to `add`, `clear`,
`writeByte`, and `readByte`. The `offset` tells the offset at which from the
current tape head location the operations are performed. It also adds an
`isBalanced` property to loops. This property tells if execution of loop
body ends at the same cell where it began, which is useful for performing
further optimizations.
transformMultiplyLoops
----------------------
* *consumed*: commands with offsets
* *unknown commands*: passed through unmodified
* *acts on*: balanced `loop`s that only have adds and where adds at offset 0 are together 1 or -1
* *other known commands*: `loop` (recurses)
`transformMultiplyLoops` changes loops of the form `[>+>++<<-]` into a
single `multiply` command.
flattenLoops
------------
* *consumes*: commands with offsets
* *produces*: flattened array commands with offsets
* *unknown commands*: passed through unmodified
* *acts on*: `loop`
`flattenLoops` changes the nested structure where `loop` commands have a
`content` property with the loop body inside to a flat structure with
`jumpIfZero` and `jumpIfNonZero`.