Jason Baron <jba...@redhat.com> writes: > While working on some Linux kernel code, I've found that functions that > are declared as 'static inline' are having their arguments evaluated > well before they are used. For example I have a function: > > static inline void trace(arg1, arg2) > { > if (unlikely(enabled)) { > <use the arguments> > } > } > > If i call 'trace(ptr->arg1, ptr->arg2)', then the pointers are > dereferenced before the 'if' is executed. Is there any way to delay the > argument evaluation until they are used? Am I missing a compiler option? > I am used gcc 4.3.0.
This question is appropriate for gcc-h...@gcc.gnu.org, not g...@gcc.gnu.org. Please take any followups to gcc-help. The short answer is no, there are no such compiler options. From the compiler's perspective, ptr->arg1 is evaluated before the function call, so even the fact that the arguments are only used in an unlikely branch isn't going to help. What you want is for the compiler to sink the load into the only place where the result of the load is used. That seems like a reasonable optimization, at least when the result is only used in an unlikely branch. I recommend that you open a enhancement request at http://gcc.gnu.org/bugzilla with a complete standalone test case. Ian