inefficient code output?
James E Wilson
wilson@specifixinc.com
Thu Mar 24 21:39:00 GMT 2005
Stefan Strasser wrote:
> movl %ebx, -200(%ebp)
> movl %ebx, -196(%ebp)
> movl %eax, 4(%esp)
> movl -200(%ebp), %edx
> movl -196(%ebp), %ecx
It is hard to say without a testcase, but my first guess would be reload
inheritance and/or the post-reload cse pass.
Reload may need to load/store something from a stack slot to satisfy a
reload. If we have two instructions in a row that need the same reload,
then reload inheritance will try to reuse the value. This may avoid
loading it twice and/or storing then reloading a value. If reload
inheritance is successful, it then tries to delete the now unnecessary
load/store, but this is a complicated operation, and doesn't always
succeed. So sometimes we end up with unnecessary loads/stores for
partially deleted reloads.
A similar thing might happen if post-reload cse succeeds in simplifying
some code, but doesn't succeed in deleting the now unnecessary stack
load/store. Deleting a stack slot store is difficult, as it requires
memory alias analysis that probably isn't being done in reload and the
post-reload cse passes. It is better to avoid creating them in the
first place, which is why we have reload inheritance, and why reload is
so complicated.
--
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com
More information about the Gcc
mailing list