------- Comment #8 from rguenth at gcc dot gnu dot org 2006-05-04 14:21 ------- Wording of 6.5.6/8 and /9 suggests that array objects larger than the maximum value that fits in ptrdiff_t (which needs to be signed) invoke undefined behavior, not last because of "the expression ((Q)+1)-(P) has the same value as ((Q)-(P))+1 and as -((P)-((Q)+1))" and "The size of the result is implementation-defined, and its type (a signed integer type) is ptrdiff_t defined in the <stddef.h> header. If the result is not representable in an object of that type, the behavior is undefined."
So for this reason I believe that folding PTR +- CST CMP PTR +- CST (with CST being of pointer type, as represented by the middle-end) as +- (ptrdiff_t)CST CMP +- (ptrdiff_t)CST is valid. Now the intel compiler f.i. does _not_ do this. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27039