Re: [patch 4/21] fix ARCH_HAS_PREFETCH

Larry McVoy (lm@bitmover.com)
Sun, 11 Aug 2002 11:46:33 -0700


On Sun, Aug 11, 2002 at 11:47:22AM -0700, Andrew Morton wrote:
> Alan Cox wrote:
> >
> > On Sun, 2002-08-11 at 08:38, Andrew Morton wrote:
> > > This information loss is unfortunate. Examples:
> > >
> > > for (i = 0; i < N; i++)
> > > prefetch(foo[i]);
> > >
> > > Problem is, if `prefetch' is a no-op, the compiler will still
> > > generate an empty busy-wait loop. Which it must do.
> >
> > Why - nothing there is volatile
>
> Because the compiler sees:
>
> for (i = 0; i < N; i++)
> ;
>
> and it says "ah ha. A busy wait delay loop" and leaves it alone.
>
> It's actually a special-case inside the compiler to not optimise
> away such constructs.

Good lord. If anyone depends all versions of GCC to not optimize this away,
they are going to hate life. Since GCC doesn't seem to do cross file
optimization (does it?) I've found the following works well:

cat > use_result.c
int dummy; // can't be static, the compiler will see it's not read

use_result(int i)
{
dummy = i;
}
^D

for (i = 0; i < N; ++i) use_result(i);

I'm positive we do stuff like this in LMbench, which is fairly well supported
on a pile of different platforms/compilers.

-- 
---
Larry McVoy            	 lm at bitmover.com           http://www.bitmover.com/lm 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/