public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/53436] New: Volatile behaves strange with OpenMP
@ 2012-05-21 12:44 o.mangold at googlemail dot com
  2012-05-21 21:07 ` [Bug tree-optimization/53436] " jakub at gcc dot gnu.org
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: o.mangold at googlemail dot com @ 2012-05-21 12:44 UTC (permalink / raw)
  To: gcc-bugs

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: unassigned@gcc.gnu.org
        ReportedBy: o.mangold@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");
    }
  }
}


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2012-05-24 22:34 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-21 12:44 [Bug tree-optimization/53436] New: Volatile behaves strange with OpenMP o.mangold at googlemail dot com
2012-05-21 21:07 ` [Bug tree-optimization/53436] " jakub at gcc dot gnu.org
2012-05-21 21:19 ` jakub at gcc dot gnu.org
2012-05-22  7:40 ` jakub at gcc dot gnu.org
2012-05-22  7:59 ` o.mangold at googlemail dot com
2012-05-22  9:55 ` jakub at gcc dot gnu.org
2012-05-22  9:59 ` o.mangold at googlemail dot com
2012-05-22 10:19 ` jakub at gcc dot gnu.org
2012-05-24 22:34 ` ebotcazou at gcc dot gnu.org
2012-05-24 22:37 ` pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).