Hi everyone,

I just made a new cross-platform node-level optimisation - https://gitlab.com/freepascal.org/fpc/source/-/merge_requests/304 - the subject of which was briefly touched upon in https://gitlab.com/freepascal.org/fpc/source/-/merge_requests/282. This seeks to remove unnecessary AND instructions at the node-level when reading from fields of record types, thereby taking strain off the peephole optimizer.

To answer Florian's question in 282, converting the instructions from, say, "movl 28(ref),%eax; shrl $24,%eax" to "movzbl 31(ref),%eax" is unfortunately not always possible because, a lot of the time, the code generator forces variables to be in (imaginary) registers, which are at the mercy of the register allocator... they may become real registers, or be stored on the stack.

Still, this is the first step.  Because this is cross-platform, this might need a lot of testing on other platforms.  I also admit that I'm not sure how this optimisation will perform on bitpacked records and/or with sizes that aren't a multiple of 8 bits (or the register word size).

Kit

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to