Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Cranelift: missed optimization Improve divisibility test by constant

Abierto
#14,699 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Nueva funcionalidad
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
rust, wasm
Área
compilers

Línea de trabajo

The issue asks for a strength reduction in Cranelift, so the work lives in its ISLE optimization rules and the lowering of remainder and divisibility tests. Read the linked Godbolt example to see the current output for a multiple-of-7 check, then look for existing constant-division rules the change could extend. Done means == and != tests against constants, for both signed and unsigned inputs and odd and even divisors, emit the short multiply-and-compare sequence and still pass the existing filetests.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

cranelift cranelift:goal:optimize-speed
Feature

Optimization of unsigned constant-remainder tests:

Take a look at: https://godbolt.org/z/MPfdhbc3q (divide x by constant, in this case 7, and then test it).

for signed/unsigned x, and for == and !=, rustc on llvm emits a short sequence, e.g. for the != case

is_multiple_of_7:
        imul    eax, edi, -1227133513
        cmp     eax, 613566757
        setae   al
        ret

The corresponding cranelift side is much longer:

is_multiple_of_7:
	 mov	rax, rdi
	 mul	dword ptr [rip + 0x2b]  # 0x38 <is_multiple_of_7+0x38>
	 mov	r10, rdi
	 sub	r10d, edx
	 shr	r10d
	 add	r10d, edx
	 shr	r10d, 0x2
	 imul	r11d, r10d, 0x7
	 sub	edi, r11d
	 test	edi, edi
	 setne	al
	 movzx	rax, al
Benefit

llvm-mca says this is 8 cycles for llvm or 20 for cranelift on a zen4. There is a similar disparity for arm64 and riscv64.

Implementation

Not sure. LLVM implements this in target independent SDAG, maybe there's a similar target independent ISLE fold that would be a good place for it?

extra note: make sure to handle signed vs unsigned, ne and eq, and odd and even numbers.

Alternatives
  • We could leave this as is. I think this is a mildly popular pattern, like for byte aligning so I'd like to see it improved.
  • Would need to look into cranelift more for other places to put this optimization. It could be target dependent but I assume this optimization should work the same for any target since it's a strength reduction.
Lenguaje dominante
Rust
Estrellas
18.7k
Forks
1.9k
Merge medio
21 h 36 min
PR fusionados (30 d)
316

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de bytecodealliance/wasmtime

Todos los issues de bytecodealliance/wasmtime

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.