Skip to content
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

Regression on main when allocating arrays of arrays #46

Open
LegNeato opened this issue Nov 4, 2024 · 5 comments
Open

Regression on main when allocating arrays of arrays #46

LegNeato opened this issue Nov 4, 2024 · 5 comments
Labels
bug Something isn't working regression

Comments

@LegNeato
Copy link
Collaborator

LegNeato commented Nov 4, 2024

Minimal repro that fails to compile:

use spirv_std::spirv;

#[spirv(fragment)]
pub fn main() {
    let x = [[1; 2]; 1];
}

Bisects to 02cd324

It was found in #21 (comment) (assuming it is the same issue, but at least that is what I started with to get a repro)

@LegNeato
Copy link
Collaborator Author

LegNeato commented Nov 4, 2024

@eddyb not sure if this will be fixed by your qptr stuff.

@eddyb
Copy link
Collaborator

eddyb commented Nov 4, 2024

Is this the error you're seeing?

error: cannot cast between pointer types
       from `*i32`
         to `*[i32; 2]`

With my various changes I also get:

error: error:0:0 - OpStore Pointer <id> '32[%32]' is not a logical pointer.
         OpStore %32 %33

And with a full move to qptr, something goes wrong with qptr.copy:

error: error:0:0 - Opcode CopyMemorySized requires one of these capabilities: Addresses 
         OpCopyMemorySized %29 %30 %uint_8

(and I'm not getting the kind of SPIR-T errors I would expect, either).

02cd324 shouldn't have broken anything like this, but that code is subtle and I am not exactly surprised.

My best guess is that something is being ambiguous about wanting access to the whole inner [_; 2] array, and instead it gets just the leaf field.

@LegNeato
Copy link
Collaborator Author

LegNeato commented Nov 4, 2024

Yep, that's the error:

error: cannot cast between pointer types
       from `*i32`
         to `*[i32; 2]`

LegNeato added a commit to LegNeato/rust-gpu that referenced this issue Dec 1, 2024
LegNeato added a commit to LegNeato/rust-gpu that referenced this issue Dec 1, 2024
LegNeato added a commit that referenced this issue Dec 13, 2024
These passed before 02cd324.
@LegNeato LegNeato changed the title Regression on master when allocating arrays of arrays Regression on main when allocating arrays of arrays Dec 19, 2024
@LegNeato
Copy link
Collaborator Author

Also happens with arrays of vecs, which is more common: #189

@LegNeato
Copy link
Collaborator Author

LegNeato commented Jan 21, 2025

Well, I am not smart enough / haven't cracked this yet. Spent a couple of hours on it.

Debug trace:

DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Array { id: 17, element: Integer { id: 15, width: 32, signedness: true }, count: 2 }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: None
 DEBUG rustc_codegen_spirv::builder::builder_methods NOT AN ADT
 DEBUG rustc_codegen_spirv::builder::builder_methods returning type: Integer { id: 15, width: 32, signedness: true }
 DEBUG rustc_codegen_spirv::builder::builder_methods maybe_original_access_chain
 DEBUG rustc_codegen_spirv::builder::builder_methods no original access chain
 DEBUG rustc_codegen_spirv::builder::builder_methods maybe_inbounds_gep calling pointercast
 DEBUG rustc_codegen_spirv::builder::builder_methods ptr.ty == dest_ty
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 31, pointee: Integer { id: 15, width: 32, signedness: true } }
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 31, pointee: Integer { id: 15, width: 32, signedness: true } }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Integer { id: 15, width: 32, signedness: true }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: None
 DEBUG rustc_codegen_spirv::builder::builder_methods maybe_original_access_chain
 DEBUG rustc_codegen_spirv::builder::builder_methods has original access chain
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 31, pointee: Integer { id: 15, width: 32, signedness: true } }
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 31, pointee: Integer { id: 15, width: 32, signedness: true } }
 DEBUG rustc_codegen_spirv::builder::builder_methods adjust_pointer_for_typed_access
 DEBUG rustc_codegen_spirv::builder::builder_methods before adjust_pointer_for_sized_access i32
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Integer { id: 15, width: 32, signedness: true }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: None
 DEBUG rustc_codegen_spirv::builder::builder_methods after adjust_pointer_for_sized_access i32
 DEBUG rustc_codegen_spirv::builder::builder_methods adjust_pointer_for_sized_access returning *i32 i32
 DEBUG rustc_codegen_spirv::builder::builder_methods val: i32 -> dest: i32
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Integer { id: 15, width: 32, signedness: true }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: None
 DEBUG rustc_codegen_spirv::builder::builder_methods maybe_original_access_chain
 DEBUG rustc_codegen_spirv::builder::builder_methods has original access chain
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 31, pointee: Integer { id: 15, width: 32, signedness: true } }
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 31, pointee: Integer { id: 15, width: 32, signedness: true } }
 DEBUG rustc_codegen_spirv::builder::builder_methods adjust_pointer_for_typed_access
 DEBUG rustc_codegen_spirv::builder::builder_methods before adjust_pointer_for_sized_access i32
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Integer { id: 15, width: 32, signedness: true }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: None
 DEBUG rustc_codegen_spirv::builder::builder_methods after adjust_pointer_for_sized_access i32
 DEBUG rustc_codegen_spirv::builder::builder_methods adjust_pointer_for_sized_access returning *i32 i32
 DEBUG rustc_codegen_spirv::builder::builder_methods val: i32 -> dest: i32
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Array { id: 19, element: Array { id: 17, element: Integer { id: 15, width: 32, signedness: true }, count: 2 }, count: 1 }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: None
 DEBUG rustc_codegen_spirv::builder::builder_methods NOT AN ADT
 DEBUG rustc_codegen_spirv::builder::builder_methods returning type: Array { id: 17, element: Integer { id: 15, width: 32, signedness: true }, count: 2 }
 DEBUG rustc_codegen_spirv::builder::builder_methods maybe_original_access_chain
 DEBUG rustc_codegen_spirv::builder::builder_methods no original access chain
 DEBUG rustc_codegen_spirv::builder::builder_methods maybe_inbounds_gep calling pointercast
 DEBUG rustc_codegen_spirv::builder::builder_methods ptr.ty == dest_ty
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 22, pointee: Array { id: 17, element: Integer { id: 15, width: 32, signedness: true }, count: 2 } }
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 22, pointee: Array { id: 17, element: Integer { id: 15, width: 32, signedness: true }, count: 2 } }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Array { id: 17, element: Integer { id: 15, width: 32, signedness: true }, count: 2 }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: None
 DEBUG rustc_codegen_spirv::builder::builder_methods NOT AN ADT
 DEBUG rustc_codegen_spirv::builder::builder_methods returning type: Integer { id: 15, width: 32, signedness: true }
 DEBUG rustc_codegen_spirv::builder::builder_methods RESULT base_pointee: i32
 DEBUG rustc_codegen_spirv::builder::builder_methods RESULT result_pointee: [i32; 2]
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 31, pointee: Integer { id: 15, width: 32, signedness: true } }
 rustc_codegen_spirv::builder::builder_methods::emit_access_chain result_type=Pointer { id: 31, pointee: Integer { id: 15, width: 32, signedness: true } }
 DEBUG rustc_codegen_spirv::builder::builder_methods adjusting_pointers: *[i32; 2] -> *i32
 DEBUG rustc_codegen_spirv::builder::builder_methods before adjust_pointer_for_sized_access i32
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Integer { id: 15, width: 32, signedness: true }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: None
 DEBUG rustc_codegen_spirv::builder::builder_methods after adjust_pointer_for_sized_access i32
 DEBUG rustc_codegen_spirv::builder::builder_methods before adjust_pointer_for_sized_access [i32; 2]
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Array { id: 17, element: Integer { id: 15, width: 32, signedness: true }, count: 2 }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: None
 DEBUG rustc_codegen_spirv::builder::builder_methods NOT AN ADT
 DEBUG rustc_codegen_spirv::builder::builder_methods avoiding digging beyond the point the leaf could actually fit
 DEBUG rustc_codegen_spirv::builder::builder_methods after adjust_pointer_for_sized_access [i32; 2]
 DEBUG rustc_codegen_spirv::builder::builder_methods adjust_pointer_for_sized_access returning *[i32; 2] [i32; 2]
 DEBUG rustc_codegen_spirv::builder::builder_methods src adjusted memcpy calling pointercast: *i32 -> [i32; 2], src: *[i32; 2]
 DEBUG rustc_codegen_spirv::builder::builder_methods ptr type after strippint pointer cases: *i32
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: ty: Integer { id: 15, width: 32, signedness: true }
 DEBUG rustc_codegen_spirv::builder::builder_methods recovering access chain: leaf_ty: Array { id: 17, element: Integer { id: 15, width: 32, signedness: true }, count: 2 }
 DEBUG rustc_codegen_spirv::builder::builder_methods ptr.type: *i32 dest_ty: *[i32; 2]
 DEBUG rustc_codegen_spirv::builder::builder_methods copying memory

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

No branches or pull requests

2 participants