On Thu, 24 May 2007, Derek M Jones wrote:
>
> Saturated arithmetic kills off so many optimizations because reordering
> an expression might produce different results.
Yes. However, the FP people do have solutions to that, for all the same
reasons.
(ie, you can add rules like:
- parentheses have meaning outside of just precedence, and disable
associativity-based ordering optimizations.
- the normal C side effect boundaries also act as ordering boundaries for
arithmetic.
> This is the point of the discussion that has got me confused.
> What compiler misfeature? Perhaps I am using the 'wrong' version
> of gcc (version 4.0.2), but I get the expected wrapping behavior (ie,
> the compiler tries to behave at translate time the same way as st
> runtime).
The problem that Al was pointing to that sometimes gcc will do *constant
folding* at parse time, and treat "1+n-n" as a compile-time constant in
situations where that simply isn't valid C.
Try this:
[EMAIL PROTECTED] ~]$ cat t.c
extern int n;
int a[1 + n - n];
[EMAIL PROTECTED] ~]$ gcc -c -Wall t.c
and notice the lack of any error what-so-ever. With sparse, you get
[EMAIL PROTECTED] ~]$ sparse -Wall t.c
t.c:2:13: error: bad constant expression
now, change the "1+n-n" into "1+n+n-n-n", and notice what gcc says:
[EMAIL PROTECTED] ~]$ gcc -c -Wall t.c
t.c:2: error: variably modified ‘a’ at file scope
iow, gcc actually thinks that "1+n-n" is somehow different from
"1+n+n-n-n".
Which was Al's point.
Linus