bool b; int i; int foo (void) { #pragma omp atomic b ^= 1; #pragma omp barrier #pragma omp atomic b |= 1; #pragma omp barrier #pragma omp atomic b &= 1; #pragma omp barrier #pragma omp atomic b -= 1; #pragma omp barrier #pragma omp atomic i ^= 1; #pragma omp barrier #pragma omp atomic i |= 1; #pragma omp barrier #pragma omp atomic i &= 1; #pragma omp barrier #pragma omp atomic i -= 1; #pragma omp barrier #pragma omp atomic i &= -1; #pragma omp barrier #pragma omp atomic i |= -1; #pragma omp barrier return 0; }
shows that b ^= 1 and b -= 1 isn't gimplified correctly - an expression reading the variable before atomic_load is used in atomic_store instead of something reading from the var in the atomic region. -- Summary: #pragma omp atomic on bool has issues Product: gcc Version: 4.6.0 Status: UNCONFIRMED Keywords: openmp Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jakub at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45423