Rust-GPU / Rust-GPU/rust-gpu

Capability is required unexpectedly for constant cast

Aperta
#300 27 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug
Lingua principale
Rust
Stelle
3.4k
Fork
126
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

I have a following trivial situation:

const K: u8 = 20;

...
    let position = 2u32;
    let global_y_offset_bits = position * K as u32;
...

Here it should be trivial for compiler to cast u8 to u32 at compile time and make last line effectively this:

let global_y_offset_bits = position * 20u32;

Yet for some reason it doesn't happen and I'm getting this instead:

  error: `u8` without `OpCapability Int8`
      --> /home/nazar-pc/.rustup/toolchains/nightly-2024-11-22-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/num/mod.rs:1298:5
       |
  1298 | /     uint_impl! {
  1299 | |         Self = usize,
  1300 | |         ActualT = u32,
  1301 | |         SignedT = isize,
  ...    |
  1315 | |         bound_condition = " on 32-bit targets",
  1316 | |     }
       | |_____^
       |
       = note: used by unnamed global (%1504)
  note: used from within `ab_proof_of_space_gpu::shader::compute_f1::compute_f1`
      --> ../src/shader/compute_f1.rs:85:47
       |
  85   |         let global_y_offset_bits = position * K as u32;
       |                                               ^^^^^^^^

I think this is a bug. Even if it was a variable that is assigned a literal I'd expect the compiler to inline it with a correct type. And I believe rustc actually does this for CPU architectures like x86-64.

I imagine inability to handle cases like this will result in suboptimal output in many cases, so it'd be nice to address the root cause of it.

UPD: const K_U32: u32 = K as u32; as a workaround helps, but ideally shouldn't be necessary.

Guida per i contributori

Apri la guida per i contributori

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.

Direzione di ricerca

Riproduci il fallimento della compilazione dello shader da src/shader/compute_f1.rs:85 e confrontalo con il workaround K_U32. Ispeziona i requisiti di capability generati attorno al cast u8-to-u32 e l’implementazione degli interi correlata in core/src/num/mod.rs:1298; il lavoro è completato quando il cast diretto della costante viene compilato senza richiedere OpCapability Int8.

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

Valutazione

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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.