Telling the C optimizer that a pointer's contents won't be modified
Jonathan Wakely
jwakely.gcc@gmail.com
Thu Mar 11 16:36:35 GMT 2021
On Thu, 11 Mar 2021 at 16:30, Hugo Musso Gualandi
<hgualandi@inf.puc-rio.br> wrote:
>
> Hi everyone,
>
> Does anyone know if there is a way to tell the C compiler that a
> pointer's contents won't change after a function call? For example, if
> I compile the following code with -O2 then GCC 10 can optimize away the
> second pointer dereference in "f" but not in "g".
> https://godbolt.org/z/5P3rxn
>
> void reader(const int *p);
>
> int f(int *p) {
> int x = *p;
> int y = *p;
> return x + y;
> }
>
> int g(int *p) {
> int x = *p;
> reader(p);
> int y = *p;
> return x + y;
> }
>
> Note how there is a single "movl" in the first case but two in the
> second:
>
> f:
> movl (%rdi), %eax
> addl %eax, %eax
> ret
> g:
> pushq %rbp
> pushq %rbx
> movq %rdi, %rbx
> subq $8, %rsp
> movl (%rdi), %ebp
> call reader
> movl (%rbx), %eax
> addq $8, %rsp
> popq %rbx
> addl %ebp, %eax
> popq %rbp
> ret
>
> I also tried using restrict but the result was still the same.
>
> // The generated ASM was still the same even with restrict.
> int g(int * restrict p) {
The restrict qualifier says that no other function arguments alias
with that one, so it doesn't mean anything on a single argument.
> Is there a way to tell the optimizer that the "reader" function won't
> modify the contents of "p"? The context of this is that I'm working
> with a compiler that uses C as a compilation target. We can rely on GCC
> to optimize most things I can't figure out how help it optimize this
> one...
Did you try the access attribute?
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
More information about the Gcc-help
mailing list