[Bug tree-optimization/53436] Volatile behaves strange with OpenMP

2012-05-24 Thread ebotcazou at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

Eric Botcazou ebotcazou at gcc dot gnu.org changed:

   What|Removed |Added

 CC||ebotcazou at gcc dot
   ||gnu.org

--- Comment #8 from Eric Botcazou ebotcazou at gcc dot gnu.org 2012-05-24 
22:31:58 UTC ---
 Yes, I get, that it's not a good way to do things, as (among other reasons) a
 volatile access is no memory fence. So accesses to other locations may not be
 ordered. But just for the sake of correctness, accesses should be ordered, if
 they all go to volatile variables, no? From the C99-standard, section 5.1.2.3:
 
  At sequence points, volatile objects are stable in the sense that previous 
  accesses are complete and subsequent accesses have not yet occurred.
 
 This means buffering the reads to the volatile variable over multiple
 iterations of the while loop is not allowed, or do I get this wrong?

You cannot invoke the C99 standard when there is concurrency in your program,
as the standard doesn't deal with it at all.


[Bug tree-optimization/53436] Volatile behaves strange with OpenMP

2012-05-24 Thread pinskia at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

--- Comment #9 from Andrew Pinski pinskia at gcc dot gnu.org 2012-05-24 
22:34:30 UTC ---
(In reply to comment #8)
 You cannot invoke the C99 standard when there is concurrency in your program,
 as the standard doesn't deal with it at all.

Though C++11/C11 does but we don't have it implemented yet.


[Bug tree-optimization/53436] Volatile behaves strange with OpenMP

2012-05-22 Thread jakub at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

Jakub Jelinek jakub at gcc dot gnu.org changed:

   What|Removed |Added

 Status|UNCONFIRMED |RESOLVED
 CC||jakub at gcc dot gnu.org
 Resolution||FIXED

--- Comment #3 from Jakub Jelinek jakub at gcc dot gnu.org 2012-05-22 
07:37:14 UTC ---
The testcase is not valid OpenMP, there is no flush operation in between the
store and reads, that said, there was a bug on the GCC side that I've fixed.


[Bug tree-optimization/53436] Volatile behaves strange with OpenMP

2012-05-22 Thread o.mangold at googlemail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

--- Comment #4 from o.mangold at googlemail dot com 2012-05-22 07:45:46 UTC ---
(In reply to comment #3)
 The testcase is not valid OpenMP, there is no flush operation in between the
 store and reads, 

Is that also needed with volatile variables? Would be quite counterintuitive.

 that said, there was a bug on the GCC side that I've fixed.

Great, thanks.


[Bug tree-optimization/53436] Volatile behaves strange with OpenMP

2012-05-22 Thread jakub at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

--- Comment #5 from Jakub Jelinek jakub at gcc dot gnu.org 2012-05-22 
07:59:01 UTC ---
(In reply to comment #4)
 (In reply to comment #3)
  The testcase is not valid OpenMP, there is no flush operation in between the
  store and reads, 
 
 Is that also needed with volatile variables? Would be quite counterintuitive.

I believe so.  Volatile only makes sure the compiler emits a store of the
variable to memory, but the CPU can just store it into a cache.  There is
nothing that orders that store compared to other stores/loads.
So, just use the appropriate OpenMP directives for synchronization, rather than
bad attempts at busy waiting using volatile.


[Bug tree-optimization/53436] Volatile behaves strange with OpenMP

2012-05-22 Thread o.mangold at googlemail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

--- Comment #6 from o.mangold at googlemail dot com 2012-05-22 08:32:03 UTC ---
Yes, I get, that it's not a good way to do things, as (among other reasons) a
volatile access is no memory fence. So accesses to other locations may not be
ordered. But just for the sake of correctness, accesses should be ordered, if
they all go to volatile variables, no? From the C99-standard, section 5.1.2.3:

 At sequence points, volatile objects are stable in the sense that previous 
 accesses are complete and subsequent accesses have not yet occurred.

This means buffering the reads to the volatile variable over multiple
iterations of the while loop is not allowed, or do I get this wrong?


[Bug tree-optimization/53436] Volatile behaves strange with OpenMP

2012-05-22 Thread jakub at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

--- Comment #7 from Jakub Jelinek jakub at gcc dot gnu.org 2012-05-22 
10:01:11 UTC ---
What GCC did was wrong.  But your testcase is clearly invalid as per
OpenMP 3.1, 1.4.1:
Similarly, if at least one thread reads from a memory unit and at least one
thread writes without synchronization to that same memory unit, including cases
due to atomicity considerations as described above, then a data race occurs. If
a data race occurs then the result of the program is unspecified.


[Bug tree-optimization/53436] Volatile behaves strange with OpenMP

2012-05-21 Thread jakub at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

--- Comment #1 from Jakub Jelinek jakub at gcc dot gnu.org 2012-05-21 
21:05:39 UTC ---
Author: jakub
Date: Mon May 21 21:05:33 2012
New Revision: 187741

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=187741
Log:
PR tree-optimization/53436
* omp-low.c (omp_build_component_ref): New function.
(build_receiver_ref, build_sender_ref, create_task_copyfn): Use it.

Modified:
trunk/gcc/ChangeLog
trunk/gcc/omp-low.c


[Bug tree-optimization/53436] Volatile behaves strange with OpenMP

2012-05-21 Thread jakub at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53436

--- Comment #2 from Jakub Jelinek jakub at gcc dot gnu.org 2012-05-21 
21:06:19 UTC ---
Author: jakub
Date: Mon May 21 21:06:13 2012
New Revision: 187742

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=187742
Log:
PR tree-optimization/53436
* omp-low.c (omp_build_component_ref): New function.
(build_receiver_ref, build_sender_ref, create_task_copyfn): Use it.

Modified:
branches/gcc-4_7-branch/gcc/ChangeLog
branches/gcc-4_7-branch/gcc/omp-low.c