This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/53436] New: Volatile behaves strange with OpenMP
- From: "o.mangold at googlemail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 21 May 2012 12:03:41 +0000
- Subject: [Bug tree-optimization/53436] New: Volatile behaves strange with OpenMP
- Auto-submitted: auto-generated
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");
}
}
}