https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94366
Bug ID: 94366 Summary: OpenMP Parallel Reduction with "&&" operator does not compute correct result Product: gcc Version: 9.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: satzeni at nvidia dot com Target Milestone: --- Created attachment 48137 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48137&action=edit reproducer Consider this program: #include <assert.h> #include <omp.h> #include <stdio.h> static int expect = 1; static int result; int main() { int a = 2; /* or any another even number */ #pragma omp parallel reduction(&& : a) { a = a && 1; } result = a ? 1 : 0; assert(result == 1); } Compiler and run with: $ gcc -fopenmp test.c $ OMP_NUM_THREADS=2 ./a.out GCC is not correctly computing the logical-and reduction on variable "a". Inside the parallel region "a" value is 1, but right after the parallel region is 0 failing the assertion. The correct result should be 1 as the initial value is 2 and the logical-and between 2 && 1 should be non zero. Looking at the assembly code, GCC is using a bitwise “and” instruction to perform the “&&” operation: <main._omp_fn.0+26> mov (%rbx),%edx <main._omp_fn.0+28> jmp 0x400782 <main._omp_fn.0+34> <main._omp_fn.0+30> xchg %ax,%ax <main._omp_fn.0+32> mov %eax,%edx <main._omp_fn.0+34> mov %edx,%ecx <main._omp_fn.0+36> mov %edx,%eax <main._omp_fn.0+38> and $0x1,%ecx <main._omp_fn.0+41> lock cmpxchg %ecx,(%rbx) However the the value of “a” is not reduced to “1” before it is passed to the parallel region. <main+15> movl $0x2,(%rsp) <main+22> callq 0x4005c0 <GOMP_parallel_start@plt>