This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Multiple local register variables w/ same register
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Richard Henderson <rth at twiddle dot net>
- Cc: Peter Zijlstra <peterz at infradead dot org>, Mathieu Desnoyers <mathieu dot desnoyers at efficios dot com>, Will Deacon <will dot deacon at arm dot com>, linux-kernel at vger dot kernel dot org, Catalin Marinas <Catalin dot Marinas at arm dot com>, lttng-dev at lists dot lttng dot org, Nathan Lynch <Nathan_Lynch at mentor dot com>, "Paul E. McKenney" <paulmck at linux dot vnet dot ibm dot com>, Linus Torvalds <torvalds at linux-foundation dot org>, Andrew Morton <akpm at linux-foundation dot org>, "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Date: Tue, 19 Nov 2013 23:08:40 +0100
- Subject: Re: Multiple local register variables w/ same register
- Authentication-results: sourceware.org; auth=none
- References: <52803E5D dot 3050109 at mentor dot com> <52851395 dot 3010306 at mentor dot com> <67652521 dot 68027 dot 1384482849638 dot JavaMail dot zimbra at efficios dot com> <1691607547 dot 70809 dot 1384874952002 dot JavaMail dot zimbra at efficios dot com> <20131119160502 dot GG11778 at mudshark dot cambridge dot arm dot com> <1656507422 dot 70913 dot 1384880540574 dot JavaMail dot zimbra at efficios dot com> <20131119173312 dot GP16796 at laptop dot programming dot kicks-ass dot net> <528BDEA9 dot 1050708 at twiddle dot net>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Wed, Nov 20, 2013 at 07:56:57AM +1000, Richard Henderson wrote:
> It appears not:
>
> int __attribute__((noinline)) f(void)
> {
> {
> register int x __asm__("eax");
> x = 1;
> }
> {
> register int y __asm__("eax");
> return ++y;
> }
> }
>
> extern void abort(void);
>
> int main(void)
> {
> if (f() != 2)
> abort();
> return 0;
> }
>
> Anyone see anything wrong with the testcase? Do we thing this sort of thing
> ought to work, perhaps with scopes lengthened?
I'd say this is undefined, when a local register var goes out of scope,
it's value can change arbitrarily. If you insert some call in between the
two scopes, it will surely have clobbered value, and even if there isn't
any call in between those, any insn could in theory clobber those.
Jakub