GCC aliasing rules: more aggressive than C99?
Richard Guenther
richard.guenther@gmail.com
Mon Jan 4 00:45:00 GMT 2010
On Mon, Jan 4, 2010 at 12:19 AM, Joshua Haberman <jhaberman@gmail.com> wrote:
> By the way, here is one case I tested where I was surprised GCC was not
> more aggressive:
>
> extern void bar();
> int foo(int *i) {
> if(*i) bar();
> return *i;
> }
>
> With GCC 4.4.1 -O3 (Ubuntu, x86-64) this reloads *i if bar is called. I
> suppose you have to allow that either "i" or "*i" is accessible as a
> global. But this is a pretty big bummer, because it means that any
> function call forces reloads of any data that was read from a pointer.
> "restrict" doesn't help here, nor does "const". The only way to prevent
> these reloads is to manually read the data into stack variable(s):
>
> extern void bar();
> int foo(int *i) {
> int i_val = *i;
> if(i_val) bar();
> return i_val;
> }
Well, i may point to any global integer variable and bar() might change it.
There's no way for a compiler to know that it does not unless it has access
to its function body. You can mark the function with the pure or the const
attribute though.
Richard.
> Josh
>
>
More information about the Gcc
mailing list