[fpc-devel] Request to remove "movzwl %ax, %eax" -> "andl $0xffff, %ax" optimisations
J. Gareth Moreton
gareth at moreton-family.com
Wed Nov 27 22:04:27 CET 2019
This one is a case of inefficiency - this sequence of instructions
appears in the compilation of the HexToBin function in the Classes unit
(-O3, but with the peephole optimizer turned off):
...
movzbw (%rcx),%r9w
andw $15,%r9w
movswl %r9w,%r9d
movl %r9d,%ebx
...
When the peephole optimizer is turned on and the compiler has
DEBUG_AOPTOBJ defined:
...
# Peephole Optimization: var15
# Peephole Optimization: var15
# Peephole Optimization: var15
# Peephole Optimization: var15
movzbw (%rcx),%r9w
andw $15,%r9w
movswl %r9w,%r9d
movl %r9d,%ebx
...
"var15" is the optimisation (also one of the risky infinite loop ones)
that analyses a "movzbw/andw" pair and changes the "andw #, %regw"
instruction to "andw (# and $FF), %regw". It performs this optimisation
during all four iterations of Pass 1, even though 15 and $FF = 15 in
this case and nothing actually changes. Meanwhile, though unrelated,
there appears to be no peephole optimisation to change "movswl
%r9w,%r9d; movl %r9d,%ebx" to "movswl %r9w,%ebx". Theoretically, in
this instance, the use of R9 can be dropped completely and only RBX
used, but that's another story.
I'm still looking at ways to improve the peephole optimizer,
specifically reducing the number of passes where possible, but I figure
I need to work on one function at a time. OptPass1MOV and its sister
functions could use a lot of refactoring. I'll submit small patches
over time that are easier to verify.
Gareth aka. Kit
More information about the fpc-devel
mailing list