------- Additional Comments From macro at linux-mips dot org 2005-08-09 11:38
-------
Thanks for your insight. I did some experimenting with the code (including
reducing the source file to a somewhat more readable form -- I can post it
if interested) and I noticed this *(struct { char __x[0xfffffff]; } *) cast
is somehow involved. I searched the info pages to find out what exactly it
is expected to mean to GCC, but I failed. Anyway I sense this effectively
tells all the memory (0xfffffff is close to 1/16 of the target's address
space) is potentially to be referred to, forcing any variables cached in
registers to be written back to their corresponding memory locations. Am I
right?
But "__d3" is a temporary and if located on the stack, it's not going to
affect "__s" in a well-defined program. Is there a way to tell GCC about
that?
Of course it can be worked around by using "=m" as the constraint for
"__d3", but then the opportunity to use a register when one is actually
available is lost. I've tried to use alternative constraints with an early
clobber for the register variation only (i.e. "=&r,m"), but GCC still
insisted on using a register.
BTW, thanks for the hint about calling strcspn() -- I've noticed the
problem disappears when one of these calls is removed, too. I'll prepare a
patch for glibc as a microoptimization here. But of course <bits/string.h>
is a user header, so we cannot simply cover the problem by changing
md5-crypt.c and praying it won't reappear elsewhere. ;-)
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22045