https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108695
--- Comment #6 from Martin Liška <marxin at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #5)
> I am 99% sure there is aliasing violations in this code too:
> #if _MSC_VER
> #define GETU32(p) SWAP(*((u32 *)(p)))
> #define PUTU32(ct, st) \
> { \
> *((u32 *)(ct)) = SWAP((st)); \
> }
Yes, I'm also suspecting this code and I can verify that using optimize("O0")
for rijndaelEncrypt fixes the issue.
The thing below is cast from 'const u8 *' and I thought it's valid to case
to 'u32 *' and then access it. Can you explain to me how exactly the violation
happens?
> #else /* _MSC_VER */
> # if __BYTE_ORDER == __BIG_ENDIAN
> #define GETU32(p) *((u32*)(p))
> #define PUTU32(ct, st) *((u32*)(ct)) = (st)
> #else /* BIG_ENDIAN */
> #if 0 //def HAVE_LINUX_SWAB_H
> #define GETU32(p) __swab32(*((u32*)(p)))
> #define PUTU32(ct, st) *((u32*)(ct)) = __swab32((st))
> #else /* __GNUC__ */
> #include <netinet/in.h>
> #define GETU32(p) ntohl(*((u32*)(p)))
> #define PUTU32(ct, st) *((u32*)(ct)) = htonl((st))
> #endif /* __GNUC__ */
> #endif /* BIG_ENDIAN */
> #endif /*_MSC_VER */
>
This part below is guarded with '#if 0'..
> #if 0
> #define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^
> ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3]))
> #define PUTU32(ct, st) \
> { \
> (ct)[0] = (u8)((st) >> 24); \
> (ct)[1] = (u8)((st) >> 16); \
> (ct)[2] = (u8)((st) >> 8); \
> (ct)[3] = (u8)(st); \
> }
> #endif
>
> A few other places too ...