Running LuaVela¶
Note
The internal name of LuaVela in IPONWEB is uJIT. These two along with respective CLI names may be used interchangeably in the documentation for historical reasons.
Note
This manual is effective as of LuaVela 0.7 release. Please beware: Although it originates from LuaJIT’s CLI guide, current set of CLI options supported by LuaVela differs significantly. For older LuaVela releases, please use the aforementioned LuaJIT’s guide.
Note
Prior to LuaVela 0.15 the name of the executable was luajit
.
General CLI Options¶
LuaVela has only a single stand-alone executable, called ujit. It can be used to run simple Lua statements or whole Lua applications from the command line. It has an interactive mode, too.
The ujit stand-alone executable is just a slightly modified version of the regular lua
stand-alone executable. It supports the same basic options, too. ujit -h
prints a short list of the available options. Please have a look at the Lua 5.1 Reference Manual for details. The sections below cover additional options provided by LuaVela .
LuaVela Interpreter Options¶
-b (dump bytecode)¶
$ ujit -b output ...
Dumps bytecode of the chunk saving it to the output
file in human readable form. output
parameter is required and cannot be omitted. To dump to stdout
, set output
to -
(dash character).
Output file is overwritten on each run.
Typical usage examples:
$ ujit -b test.out test.lua # List bytecode to test.out $ ujit -b test.out -e "print('hello world')" # List cmdline script's bytecode to test.out $ ujit -b- test.lua # List bytecode to stdout $ ujit -b- -e "print('hello world')" # List cmdline script's bytecode to stdout
-B (dump bytecode with source)¶
$ ujit -B output script_file.lua
Similar to -b
, but also prints a source code which corresponds to each bytecode (similar to ‘disassembly /s’ in gdb). If command line chunk is given instead of a script file, prints a warning and dumps bytecode as -b
.
LuaVela General Compiler Options¶
LuaVela provides a number of options for manipulating JIT compiler’s behaviour. General syntax is following:
$ ujit -j cmd[=arg[,arg...]] ...
This option performs a LuaVela control command or activates one of the loadable extension modules. The command is first looked up in the jit.*
library. If no matching function is found, a module named jit.<cmd>
is loaded and the start()
function of the module is called with the specified arguments (if any). The space between -j
and cmd
is optional.
Control Commands¶
$ ujit -jcmd
Following commands are supported:
Command | Description |
---|---|
on |
Turns the JIT compiler on (default). |
off |
Turns the JIT compiler off (only use the interpreter). |
flush |
Flushes the whole cache of compiled code. |
Dumping Compiler Progress¶
$ ujit -p output ...
Executes a chunk and dumps compiler’s progress as the execution moves on. For each trace, following information is dumped:
- Bytecode corresponding to the recorded trace.
- IR of the trace, along with emitted snapshots and information about allocated host registers (if available, i.e. if trace recording was not aborted).
- Machine code of the trace (if available, i.e. if trace recording was not aborted).
- If trace recoding was aborted, specifies the abort reason.
- If the trace exited during script execution, exit state is dumped.
output
parameter is required and cannot be omitted. To dump to stdout
, set output
to -
(dash character). Output file is overwritten on each run.
LuaVela Compiler Optimization Options¶
$ ujit -O[level] ... $ ujit -O[+]flag -O-flag ... $ ujit -Oparam=value ...
This options allows fine-tuned control of the optimizations used by the JIT compiler. This is mainly intended for debugging LuaVela itself. Please note that the JIT compiler is extremely fast (we are talking about the microsecond to millisecond range). Disabling optimizations doesn’t have any visible impact on its overhead, but usually generates code that runs slower.
The first form sets an optimization level — this enables a specific mix of optimization flags. -O0
turns off all optimizations and higher numbers enable more optimizations. Omitting the level (i.e. just -O
) sets the default optimization level, which is -O3
in the current version. Optimizations specific to`` -O4`` are either experimental or known to work improperly.
From within Lua code optimization level can be set by the same integer values passed as a first argument to jit.opt.start(<optimization_level>, ...).
The second form adds or removes individual optimization flags. The third form sets a parameter for the VM or the JIT compiler to a specific value.
You can either use this option multiple times (like -Ocse -O-dce -Ohotloop=10
) or separate several settings with a comma (like -O+cse,-dce,hotloop=10
). The settings are applied from left to right and later settings override earlier ones. You can freely mix the three forms, but note that setting an optimization level overrides all earlier flags.
To set individual option flags from within Lua code, define each one as a separate argument to
jii.opt.start
e.g.``jit.opt.start(“-sink”, “+loop”).``
Here are the available flags and at what optimization levels they are enabled:
Flag | -01 | -02 | -03 | -04 | WIP | Description |
---|---|---|---|---|---|---|
fold |
✅ | ✅ | ✅ | ✅ | Constant Folding, Simplifications and Reassociation | |
cse |
✅ | ✅ | ✅ | ✅ | Common-Subexpression Elimination | |
dce |
✅ | ✅ | ✅ | ✅ | Dead-Code Elimination | |
narrow |
✅ | ✅ | ✅ | Narrowing of numbers to integers | ||
loop |
✅ | ✅ | ✅ | Loop Optimizations (code hoisting) | ||
fwd |
✅ | ✅ | Load Forwarding (L2L) and Store Forwarding (S2L) | |||
dse |
✅ | ✅ | Dead-Store Elimination | |||
abc |
✅ | ✅ | Array Bounds Check Elimination | |||
sink |
✅ | ✅ | Allocation Sinking Optimization | |||
fuse |
❗ | Fusion of operands into instructions. This optimization is currently a no-op in LuaVela at the moment. | ||||
nohrefk |
✅ | Disables emission of the HREFK IR instruction. Available since LuaVela 0.10. |
||||
noretl |
✅ | Disables recording of returns to lower Lua frames. Available since LuaVela 0.10. | ||||
jitcat |
✅ | Enables compilation of concatenation. Available since LuaVela 0.11. | ||||
jittabcat |
✅ | Enables compilation of table.concat. Available since LuaVela 0.20. | ||||
jitstr |
✅ | Enables compilation of string.find, string.lower, string.upper. Available since LuaVela 0.20. | ||||
movtv |
❗ | Optimizes copying data between tables. Available since LuaVela 0.23. | ||||
movtvpri |
❗ | Same as movtv , but for recording-time nil , false and true values. Available since LuaVela 0.24. |
||||
jitpairs |
❗ | Enables compilation of ‘pairs’ and ‘next’. Available since LuaVela 0.22, but is known to produce incorrect results sometimes. Work on fix in progress. |
Notes:
-O3
is the default set of optimizations provided by LuaJIT-O4
is-O3
plus the set of optimizations specific to LuaVela
Here are the parameters and their default values:
Parameter | Default | Description |
---|---|---|
maxtrace |
1000 | Maximum number of traces in the cache |
maxrecord |
4000 | Maximum number of recorded IR instructions |
maxirconst |
500 | Maximum number of IR constants of a trace |
maxside |
100 | Maximum number of side traces of a root trace |
maxsnap |
500 | Maximum number of snapshots for a trace |
hotloop |
56 | Number of iterations to detect a hot loop or hot call |
hotexit |
10 | Number of taken exits to start a side trace |
tryside |
4 | Number of attempts to compile a side trace |
instunroll |
4 | Maximum unroll factor for instable loops |
loopunroll |
15 | Maximum unroll factor for loop ops in side traces |
callunroll |
3 | Maximum unroll factor for pseudo-recursive calls |
recunroll |
2 | Minimum unroll factor for true recursion |
sizemcode |
64 | Size of each machine code area in KBytes (In LuaJIT default value is 32. This might be important for comparing JIT performance) |
maxmcode |
8192 | Maximum total size of all machine code areas in KBytes (In LuaJIT default value is 512. This might be important for comparing JIT performance) |
Warning
Unlike LuaJIT, LuaVela does not support -Onodce
syntax for optimization flags, use -O-dce
for switching certain optimizations off.
Extended Configuration Options¶
Note
This section applies to LuaVela 0.21 and above.
LuaVela supports extended configuration options in the form of
$ ujit -X opt1=value1 -X opt2=value2
When CLI is invoked, these options are read first and are used for creating an according virtual machine instance.
Supported options:
Option | Description | Supported Values | Availability |
---|---|---|---|
hashf |
Hashing function used for interning strings across the platform |
|
Since LuaVela 0.21 |
itern |
Enables ITERN optimization in frontend |
|
Since LuaVela 0.22 |