cvs commit: src/sys/ia64/include atomic.h
David Schultz
das at FreeBSD.ORG
Thu May 29 18:43:25 UTC 2008
On Wed, May 28, 2008, Marcel Moolenaar wrote:
>
> On May 28, 2008, at 9:43 AM, Bruce M. Simpson wrote:
>
> >Marcel Moolenaar wrote:
> >>...the cmpxchg instruction was comparing
> >> 0x0000000080000000LU to 0xffffffff80000000LU and obviously didn't
> >> perform the exchange.
> >> ...Subsequent locking requests found rw_state non-zero
> >> and the thread in question entered the kernel and block
> >>indefinitely.
> >
> >
> >Man, this must have been a total nightmare to track down.
>
> Yeah. It was 2 puzzles in one. First you need to track down the failure
> and then you need to figure out how to work around it...
>
> >I guess the bigger question is, why was gcc sign-extending a
> >constant marked U in the first place?
>
> My best answer is: because of a bug :-)
>
> In this case GCC knew the value and as such opened itself up to its own
> sign bugs. Normally cmpval is unknown (by virtue of not being constant
> or
> by virtue of not being able to constant-propagate across functions) and
> GCC will perform standard transformations. The standard transformations
> can only work with the type of cmpval, which is uint32_t and as such
> will
> do zero-extension. But if the value is known, optimizations kick in that
> normally wouldn't kick in and in. Those optimizations have a tendendency
> to focus on the value and not on the type. In this case the constant has
> the sign-bit set, so somewhere along the lines sign-extension happened
> that shouldn't have happened and it's hard to get the right result in
> the
> end...
I remember from writing fenv.h that there were lots of painful
bugs involving gcc on ia64 and inline asms. Generally things would
work at -O0, but once you turned on inlining you got bogus code.
Then turning on -O2 or -fschedule-insns2 would fix it again.
More information about the cvs-all
mailing list