Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Cranelift: missed optimization Improve divisibility test by constant

Aperta
#14,699 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
35/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
rust, wasm
Ambito
compilers

Direzione di ricerca

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.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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.
Lingua principale
Rust
Stelle
18.7k
Fork
1.9k
Merge medio
21h 36m
PR unite (30g)
316

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di bytecodealliance/wasmtime

Tutte le issue di bytecodealliance/wasmtime

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.