http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

             Bug #: 53436
           Summary: Volatile behaves strange with OpenMP
    Classification: Unclassified
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: o.mang...@googlemail.com


When I compile the program below (gcc 4.7.0)

> gcc -g -O3 -std=c99 -fopenmp volatile.c

I find, that the volatile is ignored (when optimizing with -O or higher) for
the statement

  while(!x);

>From objdump I see that x is not reread for each loop

> objdump -S a.out
...
      while(!x);
      sleep(1);
      printf("b finished\n");
  4007bf:    bf 9c 08 40 00           mov    $0x40089c,%edi
  4007c4:    e9 37 fe ff ff           jmpq   400600 <puts@plt>
  4007c9:    eb fe                    jmp    4007c9 <main._omp_fn.0+0x29>
  4007cb:    0f 1f 44 00 00           nopl   0x0(%rax,%rax,1)
  volatile bool x=false;
  #pragma omp parallel num_threads(2) shared(x)
  {
    if (omp_get_thread_num()==0)
    {
      sleep(1);
  4007d0:    bf 01 00 00 00           mov    $0x1,%edi
  4007d5:    e8 66 fe ff ff           callq  400640 <sleep@plt>
...

At 4007c9 an unconditional (endless) loop is generated. I don't know if it is
valid to use volatile this way in combination with OpenMP (maybe the standard
doesn't cover it), but I guess that kind of optimization is at least a
dangerous thing to do.

--- volatile.c ---
#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <omp.h>

int main()
{
  volatile bool x=false;
  #pragma omp parallel num_threads(2)
  {
    if (omp_get_thread_num()==0)
    {
      sleep(1);
      x=true;
      printf("a finished\n");
    }
    else
    {
      while(!x);
      sleep(1);
      printf("b finished\n");
    }
  }
}

Reply via email to