EmbarkStudios/rust-gpu

GEP not implemented for type struct [_; 0]

kevinboulain opened this issue · 3 comments

Expected Behaviour

This compiles fine with rustc (I guess this bit is probably eliminated?).

Example & Steps To Reproduce

I was using const generic parameters to determine the length of some arrays. At some point, a base case ended up declaring a zero-length array, like so:

#![cfg_attr(target_arch = "spirv", no_std)]
use spirv_std::spirv;

fn example<const LENGTH: usize>() {
    let mut array = [0; LENGTH];
    for i in 0..array.len() {
        array[i] += i;
    }
}

#[spirv(compute(threads(1, 1, 1)))]
pub fn compute() {
    example::<0>();
}

Resulting in:

error: GEP not implemented for type struct [usize; 0] {  }
 --> examples/shaders/compute-shader/src/lib.rs:7:9
  |
7 |         array[i] += i;
  |         ^^^^^^^^^^^^^

System Info

  • rustc: 1.71.0-nightly (1a5f8bce7 2023-05-26)
  • rust-gpu: b2e5eb7

A slight modification of the previous example can also result in a division by zero in the compiler (can open another issue if you prefer):

#![cfg_attr(target_arch = "spirv", no_std)]
use spirv_std::spirv;

fn example<const LENGTH: usize, R: Copy + Default>(callback: impl Fn() -> R) {
    let mut array = [Default::default(); LENGTH];
    for i in 0..array.len() {
        array[i] = callback();
    }
}

#[spirv(compute(threads(1, 1, 1)))]
pub fn compute() {
    example::<10, ()>(|| ());
}
thread 'rustc' panicked at 'attempt to divide by zero', crates/rustc_codegen_spirv/src/builder/builder_methods.rs:441:34
stack backtrace:
   0: rust_begin_unwind
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/library/std/src/panicking.rs:578:5
   1: core::panicking::panic_fmt
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/library/core/src/panicking.rs:67:14
   2: core::panicking::panic
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/library/core/src/panicking.rs:117:5
   3: rustc_codegen_spirv::builder::builder_methods::<impl rustc_codegen_spirv::builder::Builder>::recover_access_chain_from_offset
             at ./crates/rustc_codegen_spirv/src/builder/builder_methods.rs:441:34
   4: rustc_codegen_spirv::builder::builder_methods::<impl rustc_codegen_ssa::traits::builder::BuilderMethods for rustc_codegen_spirv::builder::Builder>::pointercast
             at ./crates/rustc_codegen_spirv/src/builder/builder_methods.rs:1624:13
   5: rustc_codegen_ssa::base::unsize_ptr
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/compiler/rustc_codegen_ssa/src/base.rs:225:14
   6: rustc_codegen_ssa::mir::rvalue::<impl rustc_codegen_ssa::mir::FunctionCx<Bx>>::codegen_rvalue_operand
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/compiler/rustc_codegen_ssa/src/mir/rvalue.rs:462:29
   7: rustc_codegen_ssa::mir::statement::<impl rustc_codegen_ssa::mir::FunctionCx<Bx>>::codegen_statement
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/compiler/rustc_codegen_ssa/src/mir/statement.rs:22:43
   8: rustc_codegen_ssa::mir::block::<impl rustc_codegen_ssa::mir::FunctionCx<Bx>>::codegen_block
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/compiler/rustc_codegen_ssa/src/mir/block.rs:1178:17
   9: rustc_codegen_ssa::mir::codegen_mir
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/compiler/rustc_codegen_ssa/src/mir/mod.rs:272:9
  10: rustc_codegen_ssa::base::codegen_instance
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/compiler/rustc_codegen_ssa/src/base.rs:395:5
  11: <rustc_middle::mir::mono::MonoItem as rustc_codegen_ssa::mono_item::MonoItemExt>::define
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/compiler/rustc_codegen_ssa/src/mono_item.rs:91:17
  12: <rustc_codegen_spirv::SpirvCodegenBackend as rustc_codegen_ssa::traits::backend::ExtraBackendMethods>::compile_codegen_unit::{{closure}}
             at ./crates/rustc_codegen_spirv/src/lib.rs:438:17
  13: <rustc_codegen_spirv::SpirvCodegenBackend as rustc_codegen_ssa::traits::backend::ExtraBackendMethods>::compile_codegen_unit
             at ./crates/rustc_codegen_spirv/src/lib.rs:450:36
  14: rustc_codegen_ssa::base::codegen_crate
             at /rustc/1a5f8bce74ee432f7cc3aa131bc3d6920e06de10/compiler/rustc_codegen_ssa/src/base.rs:728:34
  15: <rustc_codegen_spirv::SpirvCodegenBackend as rustc_codegen_ssa::traits::backend::CodegenBackend>::codegen_crate
             at ./crates/rustc_codegen_spirv/src/lib.rs:241:18
  16: <rustc_session::session::Session>::time::<alloc::boxed::Box<dyn core::any::Any>, rustc_interface::passes::start_codegen::{closure#0}>
  17: rustc_interface::passes::start_codegen
  18: <rustc_middle::ty::context::GlobalCtxt>::enter::<<rustc_interface::queries::Queries>::ongoing_codegen::{closure#0}::{closure#0}, core::result::Result<alloc::boxed::Box<dyn core::any::Any>, rustc_span::ErrorGuaranteed>>
  19: <rustc_interface::queries::Queries>::ongoing_codegen
  20: <rustc_interface::interface::Compiler>::enter::<rustc_driver_impl::run_compiler::{closure#1}::{closure#2}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>>
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

error: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/EmbarkStudios/rust-gpu/issues/new

note: rustc 1.71.0-nightly (1a5f8bce7 2023-05-26) running on x86_64-unknown-linux-gnu

note: compiler flags: --crate-type dylib --crate-type lib -C opt-level=3 -C embed-bitcode=no -C codegen-units=1 -C incremental=[REDACTED] -Z unstable-options -Z codegen-backend=.../rust-gpu/target/debug/deps/librustc_codegen_spirv.so -Z binary-dep-depinfo -C symbol-mangling-version=v0 -Z crate-attr=feature(register_tool) -Z crate-attr=register_tool(rust_gpu) -C overflow-checks=off -C debug-assertions=off

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
end of query stack
note: `rust-gpu` version `0.8.0`

I also encountered the attempt to divide by zero error. I made this change on a fork and the build succeeded and appeared to work.

I'm not opening a PR though because I made that change blindly (I'm not familiar with the internals of rust-gpu and have no idea what's going on :), so I'm not confident that it's sound.

eddyb commented

I made this change on a fork and the build succeeded and appeared to work.

Oh, that looks great! (I would only replace the panic but I haven't checked yet what's valid at that position)

(sorry for not seeing this sooner, up until more recently the only way to guarantee I'd actually get notified would be to use @eddyb or ping me on Discord)