On 03 August 2007 18:49, Joe Buck wrote: > On Fri, Aug 03, 2007 at 06:45:55PM +0100, Dave Korn wrote: >> On 03 August 2007 18:35, Nathan Froyd wrote: >> >>> On Fri, Aug 03, 2007 at 06:24:06PM +0100, Paul Brook wrote: >>>> On Friday 03 August 2007, Jonathan S. Shapiro wrote: >>>>> Then it seems very curious that the constant folding should fail on this >>>>> platform. Any idea what may be going on here? >>>> >>>> You're exploiting a hole in the C aliasing rules by accessing a 32-bit >>>> int as type char. I tested several compilers (4.2, 4.1 and 3.4 x86, 4.2 >>>> m68k and 4.2 arm) and the only one that eliminated the comparison was >>>> 3.4-x86. >>> >>> FWIW, rewriting it with the "obvious" union approach seems to give the >>> desired results on 4.2 arm with and without -mbig-endian. >> >> Shouldn't it also work by changing the (char *) cast to (unsigned char >> *), since IIUIC the standard guarantees you're allowed to access any >> object as an array of unsigned char and not get into aliasing difficulties? > > The standard makes the same guarantee about (char *). This is not > "exploiting a hole"; it is standard C that you can access anything > as (char *).
Well, the compiler's not doing anything invalid by failing to optimise a constant expression, so everything's all still valid and compliant. Shame it can't recognize the cast case same as the union case and optimise them the same though. cheers, DaveK -- Can't think of a witty .sigline today....