This is the mail archive of the gcc-help@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: Problem with optimization setting -O3


On 2010-05-25 23:41, Ian Lance Taylor wrote:
> You need to show us these macros.
> 
> My first guess would be an aliasing violation which is causing trouble
> when combined with the aggressive inlining done at -O3.  In
> particular, see if the code works correctly if you also use the
> -fno-strict-aliasing option.  If it does, you most likely have an
> aliasing violation.
Thanks, Ian.

We are using -fno-strict-aliasing already to make sure the code works
properly (after all GCC warns a lot without its use and our code needs
to make use of these constructs, i.e. type-punning), but the problem
exists nevertheless.

Here the macros. As I mentioned before, the behavior differs between
little and big Endian platforms. x64 is a little Endian platform, though.

/* Little Endian */
#define LEND32(X) (uint32_t)(X)
#define PUT32(X,Y) (*(uint32_t*)(X)) = LEND32(Y)
#define GET32(X) (*(uint32_t*)(X))

/* Big Endian */
#define SWAP32(X) (uint32_t)(((uint32_t)(X) >> 24) | \
                  ((uint32_t)(X) << 24) | \
                  (((uint32_t)(X) >> 8) & 0xff00) | \
                  (((uint32_t)(X) & 0xff00) << 8))
#define LEND32(X) SWAP32(X)
#define GET32(X) (SWAP32(*(uint32_t*)(X)))
#define PUT32(X,Y) (*(uint32_t*)(X)) = LEND32(Y)

Thanks for looking at it,

// Oliver


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