https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100342

--- Comment #3 from Uroš Bizjak <ubizjak at gmail dot com> ---
For some reason the *input* value at BSWAP insn is truncated to 32bits.

  v256u128 v256u128_1 =
    SHLV (SHLSV (__builtin_bswap64 (u128_0), (v256u128) (0 < v256u128_0)) <=
          0, v256u128_0);

u128_0 is an argument to foo0, passes value of 123842323652213865 (decimal).

The binary has only one BSWAP insn, so:

$ objdump -dr a.out | grep bswap
  401ddd:       48 0f ca                bswap  %rdx

(gdb) b *0x401ddd
Breakpoint 1 at 0x401ddd: file pr100342.c, line 72.

Breakpoint 1, 0x0000000000401ddd in foo0 (u8_0=u8_0@entry=0 '\000',
v128u8_0=v128u8_0@entry=..., v512u8_0=..., u16_0=u16_0@entry=10, 
    v128u16_0=v128u16_0@entry=..., u32_0=u32_0@entry=4, u64_0=u64_0@entry=2,
v512u64_0=..., u128_0=<optimized out>, v256u128_0=..., v512u128_0=...)
    at zzz.c:72
72          SHLV (SHLSV (__builtin_bswap64 (u128_0), (v256u128) (0 <
v256u128_0)) <=
(gdb) p $rdx
$2 = 3983735913
(gdb) p/x $rdx
$3 = 0xed72fc69

We can "fix" the clobbered value manually in gdb session:

(gdb) set $rdx = 123842323652213865
(gdb) p/x $rdx
$4 = 0x1b7f9efed72fc69
(gdb) c
Continuing.
[Inferior 1 (process 20630) exited normally]

Reply via email to