YJIT: x64: Remove register shuffle with opt_and and friends (#10498)

This is best understood by looking at the change to the output:

```diff
  # Insn: 0002 opt_and (stack_size: 2)
  - mov rax, rsi
  - and rax, rdi
  - mov rsi, rax
  + and rsi, rdi
```

It's a bit awkward to match against due to how stack operands are
lowered, but hey, it's nice to save the 2 unnecessary MOVs.
This commit is contained in:
Alan Wu 2024-04-11 10:37:56 -04:00 committed by GitHub
parent db0cf1aef9
commit c2622b5253
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 3 deletions

View File

@ -181,6 +181,23 @@ impl Assembler
iterator.map_insn_index(&mut asm);
iterator.next_unmapped(); // Pop merged Insn::Mov
}
(Opnd::Reg(_), Opnd::Reg(_), Some(Insn::Mov { dest, src }))
if out == src && live_ranges[index] == index + 1 && {
// We want to do `dest == left`, but `left` has already gone
// through lower_stack_opnd() while `dest` has not. So we
// lower `dest` before comparing.
let lowered_dest = if let Opnd::Stack { .. } = dest {
asm.lower_stack_opnd(dest)
} else {
*dest
};
lowered_dest == *left
} => {
*out = *dest;
asm.push_insn(insn);
iterator.map_insn_index(&mut asm);
iterator.next_unmapped(); // Pop merged Insn::Mov
}
_ => {
match (unmapped_opnds[0], unmapped_opnds[1]) {
(Opnd::Mem(_), Opnd::Mem(_)) => {

View File

@ -3827,7 +3827,7 @@ fn gen_opt_and(
// Push the output on the stack
let dst = asm.stack_push(Type::Fixnum);
asm.store(dst, val);
asm.mov(dst, val);
Some(KeepCompiling)
} else {
@ -3867,7 +3867,7 @@ fn gen_opt_or(
// Push the output on the stack
let dst = asm.stack_push(Type::Fixnum);
asm.store(dst, val);
asm.mov(dst, val);
Some(KeepCompiling)
} else {
@ -3909,7 +3909,7 @@ fn gen_opt_minus(
// Push the output on the stack
let dst = asm.stack_push(Type::Fixnum);
asm.store(dst, val);
asm.mov(dst, val);
Some(KeepCompiling)
} else {