This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/50065] -Os, -O2, -O3 optimization breaks LD/ST ordering on 32-bit SPARC
- From: "ebotcazou at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 14 Aug 2011 12:42:47 +0000
- Subject: [Bug rtl-optimization/50065] -Os, -O2, -O3 optimization breaks LD/ST ordering on 32-bit SPARC
- Auto-submitted: auto-generated
- References: <bug-50065-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50065
--- Comment #6 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2011-08-14 12:42:47 UTC ---
> The code is equivalent to
>
> volatile unsigned char lock;
> int remap_barrier;
>
> while (atomic_test_and_set(lock)) {
> while (lock) {
> ;
> }
> }
> remap_barrier++;
> lock = 0;
>
> Eric: could you let me know you you think the code inside function
> spinlock_lock(&remap_lock) is a NOP?
I don't, you simply misquoted, I wrote "the end of the code". The first part
of the spinlock implementation is correct, in particular you have the required
memory barrier in spinlock_is_locked. The second part is not correct, as you
don't have the memory barrier in spinlock_unlock.
> Also, the arch_write_lock/unlock in the SPARC port of Linux uses a very
> similar implementation.
No, it precisely doesn't, it has the memory barrier in spinlock_unlock.