Re: [PATCH 1/2] x86: optimize XCHG to MOV for same-register forms

Sam James <[email protected]>
Newsgroups gmane.comp.gnu.binutils
Organization Gentoo
Message-ID <[email protected]>
Jan Beulich <[email protected]> writes:

> On 02.07.2026 08:06, Sam James wrote:
>> Jan Beulich <[email protected]> writes:
>> 
>>> MOV requires far less execution resources.
>> 
>> In case anyone ends up stumbling upon this and wonders why Valgrind
>> stopped working, it needs adjusting for this change:
>> https://bugs.kde.org/522533.
>
> So the instruction bytes quoted there:
>
> IR: unhandled instruction bytes: 0x48 0xC1 0xC7 0x3 0x48 0xC1 0xC7 0xD 0x48 0xC1
>
> are really unrelated to the issue? That's the earlier ROLs afaict ...
>

AFAICT yes! I found this surprising too but it's the only difference
in the object.

> What is that code doing anyway?

Mark explained it to me yesterday as (any errors mine in paraphrasing)..

We die in vg_preloaded.c:129 which is:

void * VG_NOTIFY_ON_LOAD(ifunc_wrapper) (void)
...
    /* Call the original indirect function and get it's result */
    VALGRIND_GET_ORIG_FN(fn); /* <-- */
    CALL_FN_W_v(result, fn);

which is VALGRIND_GET_NR_CONTEXT:

#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval)                       \
  { volatile OrigFn* _zzq_orig = &(_zzq_rlval);                   \
    volatile unsigned int __addr;                                 \
    __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE               \
                     /* %EAX = guest_NRADDR */                    \
                     "xchgl %%ecx,%%ecx"                          \
                     : "=a" (__addr)                              \
                     :                                            \
                     : "cc", "memory"                             \
                    );                                            \
    _zzq_orig->nraddr = __addr;                                   \
  }

and the rols are the _S_I_P macro:

#define __SPECIAL_INSTRUCTION_PREAMBLE                            \
                     "roll $3,  %%edi ; roll $13, %%edi\n\t"      \
                     "roll $29, %%edi ; roll $19, %%edi\n\t"

but what I don't understand is why it ends up seeing that. I think when
it sees _S_I_P, it is supposed to rewrite it (?), but I am not an expert on
valgrind's VEX interpreter at all.

> And why is -O passed to gas there, when specific
> insn selection matters?

That's just because it's one of the things I test in some runs. I'll
filter it out for Valgrind as I agree it makes no sense there, but
another problem  happens when Valgrind itself is built without it, but
e.g. systemd has -Wa,-O2:

vex amd64->IR: unhandled instruction bytes: 0x48 0xC1 0xC7 0x3 0x48 0xC1 0xC7 0xD 0x48 0xC1
vex amd64->IR:   REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0
vex amd64->IR:   VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=NONE
vex amd64->IR:   PFX.66=0 PFX.F2=0 PFX.F3=0
==720097== valgrind: Unrecognised instruction at address 0x491cf5b.
==720097==    at 0x491CF5B: cleanup_pools (in /usr/lib64/libsystemd.so.0.44.0)
==720097==    by 0x400C061: _dl_call_fini (dl-call_fini.c:43)
==720097==    by 0x401098F: _dl_fini (dl-fini.c:120)
==720097==    by 0x4B8E7CF: __run_exit_handlers (exit.c:118)
==720097==    by 0x4B8E8BB: exit (exit.c:148)
==720097==    by 0x4B6F290: (below main) (libc_start_call_main.h:83)
==720097== Your program just tried to execute an instruction that Valgrind
==720097== did not recognise.  There are two possible reasons for this.
==720097== 1. Your program has a bug and erroneously jumped to a non-code
==720097==    location.  If you are running Memcheck and you just saw a
==720097==    warning about a bad jump, it's probably your program's fault.
==720097== 2. The instruction is legitimate but Valgrind doesn't handle it,
==720097==    i.e. it's Valgrind's fault.  If you think this is the case or
==720097==    you are not sure, please let us know and we'll try to fix it.
==720097== Either way, Valgrind will now raise a SIGILL signal which will
==720097== probably kill your program.
==720097==
==720097== Process terminating with default action of signal 4 (SIGILL): dumping core
==720097==  Illegal opcode at address 0x491CF5B
==720097==    at 0x491CF5B: cleanup_pools (in /usr/lib64/libsystemd.so.0.44.0)
==720097==    by 0x400C061: _dl_call_fini (dl-call_fini.c:43)
==720097==    by 0x401098F: _dl_fini (dl-fini.c:120)
==720097==    by 0x4B8E7CF: __run_exit_handlers (exit.c:118)
==720097==    by 0x4B8E8BB: exit (exit.c:148)
==720097==    by 0x4B6F290: (below main) (libc_start_call_main.h:83)

so Valgrind still needs to be able to interpret the pattern anyway.

>
> Jan

sam
signature.asc (application/pgp-signature, 418 B)
-----BEGIN PGP SIGNATURE-----

iQEBBAEWCgCpFiEEJaa7iN2bdkxrVUHCc4QJ9SDfkZAFAmpGCPgbFIAAAAAABAAO
bWFudTIsMi41KzEuMTIsMiwyXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25z
Lm9wZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXQyNUE2QkI4OEREOUI3NjRDNkI1NTQx
QzI3Mzg0MDlGNTIwREY5MTkwDxxzYW1AZ2VudG9vLm9yZwAKCRBzhAn1IN+RkGc0
AQDfH2sVB22T5MOapfSdu5CMves0lSNQOX8UbnI7PnIvugEAueUSyoz8ggS0g4C2
7R3tO6I0WtyfQEi8hyewY0ImmAk=
=Rt1t
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.