label reference missed
Ulrich Drepper
drepper@redhat.com
Thu Aug 22 20:38:00 GMT 2002
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
I have this little piece of code:
int
foo (int a)
{
asm volatile ("jmp %0"::"m" (*&&fff));
if (1)
{
puts ("if");
}
else
{
fff:
puts ("else");
}
return 0;
}
It compiles fine but gcc doesn't realize that the label fff is
referenced. The result is that the entire 'else' branch is gone. Note
that this construct works fine if the condition of the 'if' is changed
from '1' to 'a'. But this defeats the purpose (in part).
The possibilities opened by code like that above are quite big. On x86,
for instance, we often have sequences like this (after macro expansion)
in lowlevel code:
if (({ unsigned char r;
asm ("cmpxchgl %3, %0; sete %1"
: "=m" (mem), "=q" (r)
: "0" (mem), "r" (oldval));
r; }) != 0)
...
which expands to something like
cmpxchgl ...,...
sete ...
testl ..., ...
jne ...
With a construct like that above this could be reduced to
cmpxchgl ...,...
je ...
I imagine that the change necessary to achieve this is minimal. It
would only require to recognize label references and mark the basic
blocks they introduce as alive.
I'll file a bug in gnats if it is agreed on that this is useful and
feasable.
- --
- ---------------. ,-. 1325 Chesapeake Terrace
Ulrich Drepper \ ,-------------------' \ Sunnyvale, CA 94089 USA
Red Hat `--' drepper at redhat.com `------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQE9Za5B2ijCOnn/RHQRAgZ3AJ90bS9M7QhMCABiWVOdSkgF+I6O+gCglJ5s
PnPQ+/qp4LNqrjsZWlciX6Q=
=R8UD
-----END PGP SIGNATURE-----
More information about the Gcc-bugs
mailing list