gir/optimizations.md

39 lines
1.5 KiB
Markdown
Raw Normal View History

2018-05-22 16:39:48 +00:00
Gir has three optimization passes.
joinAdjacentOps
---------------
consumes | commands without offsets
produces | commands without offsets
unknown commands | passed through unmodified
acts on | `moveHead`, `add`
`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`
`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.