Skip to content

GEP not implemented for type struct [_; 0] #1075

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
kevinboulain opened this issue Jun 16, 2023 · 4 comments
Open

GEP not implemented for type struct [_; 0] #1075

kevinboulain opened this issue Jun 16, 2023 · 4 comments
Labels
t: bug Something isn't working

Comments

@kevinboulain
Copy link

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
@kevinboulain kevinboulain added the t: bug Something isn't working label Jun 16, 2023
@kevinboulain
Copy link
Author

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`

@JoelCourtney
Copy link

JoelCourtney commented Oct 10, 2023

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
Copy link
Contributor

eddyb commented Jan 31, 2024

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)

@rust-gpu-bot
Copy link

This issue is now being tracked at: Rust-GPU/rust-gpu#82

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
t: bug Something isn't working
Projects
None yet
Development

No branches or pull requests

4 participants