From http://embed.cs.utah.edu/embarrassing/dec_09/harvest/gcc-head_llvm-gcc-head/
typedef unsigned char u8; typedef unsigned int u32; #pragma pack(1) #pragma pack() #pragma pack(1) #pragma pack() #pragma pack(1) #pragma pack() #pragma pack(4) #pragma pack() union __anonunion_out_195 { u32 value; u8 bytes[4]; }; union __anonunion_in_196 { u32 value; u8 bytes[4]; }; extern void acpi_ut_track_stack_ptr (void); u32 acpi_ut_dword_byte_swap (u32 value); u32 acpi_ut_dword_byte_swap (u32 value) { union __anonunion_out_195 out; union __anonunion_in_196 in; { acpi_ut_track_stack_ptr (); in.value = value; out.bytes[0] = in.bytes[3]; out.bytes[1] = in.bytes[2]; out.bytes[2] = in.bytes[1]; out.bytes[3] = in.bytes[0]; return (out.value); } } /* Checksum = 1251E213 */ does not turn into bswap, while llvm does that. There's bswap detection code in tree-ssa-math-ops.c, but it doesn't seem to work for this union pattern. Perhaps it should? -- Summary: bswap not recognized for union Product: gcc Version: unknown Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: andi-gcc at firstfloor dot org GCC host triplet: x86_64-linux GCC target triplet: x86_64-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42587