http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58480
Bug ID: 58480
Summary: Use attribute((nonnull)) to optimize callers
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: glisse at gcc dot gnu.org
Hello,
in this first function, gcc knows that p is not zero and removes the test (I
have to make sure q doesn't disappear too early, or the compiler forgets that p
is dereferenced, maybe when vrp information becomes persistent...):
int f(int*p){
int q=*p;
if(!p) __builtin_abort();
return q;
}
However, in the following:
void g(int*p,int*q){
__builtin_memcpy(q,p,4);
if(!p) __builtin_abort();
}
the test isn't removed, although calling memcpy with a zero argument is just as
bad a dereferencing 0.
Replacing __builtin_memcpy with this doesn't help either:
extern void * my_memcpy (void *dest, const void *src, unsigned long len)
__attribute__((nonnull));
However, this is optimized:
__attribute__((nonnull))void g(int*p){
if(!p) __builtin_abort();
}
So I think gcc should make use of the nonnull attribute for optimization
purposes not just inside the function, but in the callers as well (and make
sure whatever we do for the nonnull attribute applies to __builtin_memcpy as
well).