镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Regression on main when allocating arrays of arrays #46

Closed

Description

@LegNeato

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)

Activity

  1. LegNeato commented on Nov 4, 2024

    @LegNeato
    CollaboratorAuthor

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

  2. eddyb commented on Nov 4, 2024

    @eddyb
    Member

    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.

  3. LegNeato commented on Nov 4, 2024

    @LegNeato
    CollaboratorAuthor

    Yep, that's the error:

    error: cannot cast between pointer types
           from `*i32`
             to `*[i32; 2]`
    
  4. added a commit that references this issue on Dec 13, 2024
  5. changed the title [-]Regression on master when allocating arrays of arrays[/-] [+]Regression on main when allocating arrays of arrays[/+] on Dec 19, 2024
  6. LegNeato commented on Dec 26, 2024

    @LegNeato
    CollaboratorAuthor

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

  7. LegNeato commented on Jan 21, 2025

    @LegNeato
    CollaboratorAuthor

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

    Debug trace:

    Details
    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
    
  8. added a commit that references this issue on Mar 26, 2025
  9. added a commit that references this issue on Apr 21, 2025
    2f915a0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions