[RFC] Modeling the behavior of function calls
Chris Lattner
clattner@apple.com
Tue Apr 29 00:17:00 GMT 2008
On Apr 28, 2008, at 12:04 PM, Diego Novillo wrote:
> [ Apologies if this comes out twice. I posted this message last week,
> but I think it was rejected because of a .pdf attachment. ]
>
> We have been bouncing ideas for a new mechanism to describe the
> behavior
> of function calls so that optimizers can be more aggressive at call
> sites. Currently, GCC supports the notion of pure/impure,
> const/non-const, but that is not enough for various cases.
>
> The main application for this would be stable library code like libc,
> that the compiler generally doesn't get to process.
This is very interesting. One issue to consider: how do you plan to
handle errno? There are a variety of compiler transformations that
can be done on libm functions, even in the presence of errno. For an
example (which occurs in spec2k), it is safe to transform:
for (i = 0 .. 100)
Val += i*sqrt(loopinvariant)
into:
tmp = sqrt(loopinvariant)
for (i = 0 .. 100)
Val += i*tmp
This is safe because errno will still be set and the value that errno
is set to is a function of the input value. Also, the value of errno
is not otherwise changed in the body of the loop. Note that sqrt is
not pure or const here because it sets errno.
The wrinkle is "detecting that the loop body doesn't set errno". On
many platforms, errno is a #define for something like
"*__errno_func()". How do you plan to model this?
-Chris
More information about the Gcc
mailing list