[Bug middle-end/31862] Loop IM and other optimizations harmful for -fopenmp

amylaar at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Mon Oct 22 23:17:00 GMT 2007



------- Comment #13 from amylaar at gcc dot gnu dot org  2007-10-22 23:17 -------
(In reply to comment #0)
> See http://openmp.org/pipermail/omp/2007/000840.html
> and the rest of the lengthy threads:
> Memory consistency contradiction between 2.5 specification and GCC
> OpenMP spec 2.5 seems to have incorrect flush example on page 12
> Two simpler examples (Re: OpenMP spec 2.5 seems to have incorrect flush example
> on page 12)
> 
> Some GCC optimizations are harmful for threaded code, e.g. loop invariant
> motion
> of global variables:
> 
> int var;
> void
> foo (int x)
> {
>   int i;
>   for (i = 0; i < 100; i++)
>     {
>       if (i > x)
>         var = i;
>     }
> }
> 
> When some other thread modifies var at the same time while foo (200) is
> executed,
> the compiler inserted a race which doesn't really exist in the original
> program,
> as it will do reg = var; ... var = reg; even when var was never modified.
> 

This is not even a particular good choice of transformation for performance
reasons.  We incur memory read latency when there is no need to.

Better is:

  auto int dummy, *addr;

  addr = &dummy;
  if (i > x)
    addr = &var;
  *addr = i;

Or for the entire function:

void
foo (int x)
{
  int dummy;
  int *addr = &dummy;

  if (99 > x)
    addr = &var;
  *addr = 99;
}


-- 

amylaar at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization


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



More information about the Gcc-bugs mailing list