On Mon, 2 Apr 2012, Michael Matz wrote: > On Mon, 2 Apr 2012, Jakub Jelinek wrote: > > > > inline int syscall1(int number, long arg1) { > > > register int ax __asm__("eax"); > > > register long di __asm__("rdi"); > > > ax = number; > > > di = arg1; > > > __asm__ volatile ("syscall"); > > > } > > > > > > _then_ we would probably get miscompilations here and there. > > > > That is actually what is used on most targets, including x86_64 > > Yikes! That's indeed the case. I'll want to retract what I said, concede > with Honza that we're lucky and add that we're lucky mostly because > register variables are not regarded as gimple registers, hence all stores > to such variables are regarded as VDEFs. So there will be VDEF/VUSE > chains between initializer and syscall, which prevents most code motion > into that chain. That itself doesn't e.g. prevent the load/store > disambiguator from disambiguating two such decls, even if they refer to > the same hardreg. So we really are merely lucky, with enough effort we > probably could create a "miscompiling" testcase.
Lucky perhaps, but documented lucky: this is documented (grep sysint extend.texi) to work, to avoid having talented gcc hackers saying "oh, that worked? You have to _stop doing that_; you've just been lucky in previous versions" rather that "oops, looks like I broke that; I'll fix it post-haste". (There's *one* test-case in gcc.target/cris/asmreg-1.c; this could certainly do with more coverage.) brgds, H-P