/* { dg-do run } */ /* { dg-options "-O2" } */ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #define REV_ENDIANNESS __attribute__((scalar_storage_order("big-endian"))) #else #define REV_ENDIANNESS __attribute__((scalar_storage_order("little-endian"))) #endif typedef unsigned long long u64; union DST { u64 val; struct { u64 x : 1; u64 y : 1; u64 r: 62; } REV_ENDIANNESS; } REV_ENDIANNESS; struct SRC { u64 a; } REV_ENDIANNESS; [[gnu::noipa]] void foo () {__builtin_abort();} [[gnu::noinline]] int bar(struct SRC *src) { union DST dst; dst.val = src->a; if (dst.y) { foo(); } return 0; } int main(void) { #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ struct SRC t = {-1ull & (~(0x01ull<<62))}; #else struct SRC t = {-1ull & (~(0x01ull<<1))}; #endif bar(&t); return 0; }