Optimize field access in interpreter by improving inlining.
The DoFieldGet and DoFieldPut functions are forced to be inlined into the
interpreter. Nevertheless, this seems to expose a limitation in GCC's
inlining process where two parts of the code are not inlined while they
depend on constant function parameters:
- the call to Primitive::FieldSize is not completely inlined since there's
still a call to Primitive::ComponentSize,
- the switch (which reads from/writes to the field) is not inlined but
copied into the interpreter.
To improve inlining, we could transform these functions into macros. Then GCC
would correctly inline the code. However, in order to keep the code simple and
readable, I chose to transform them into template functions. This only requires
to move constant parameters of the function into template arguments.
Note that while it creates multiple versions of DoFieldGet and DoFieldPut, they
are not part of the final object file since they're all inlined.
1 file changed