2.3 KiB
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 isadd 1
oradd -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
.