This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [jbaron@redhat.com: [PATCH 0/3] tracepoints: delay argument evaluation]


Jason Baron <jbaron@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-help@gcc.gnu.org, not
gcc@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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]