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

ICE: intrinsicck: index out of bounds: the len is 0 but the index is 0 #134334

Open
matthiaskrgr opened this issue Dec 15, 2024 · 1 comment · May be fixed by #135295
Open

ICE: intrinsicck: index out of bounds: the len is 0 but the index is 0 #134334

matthiaskrgr opened this issue Dec 15, 2024 · 1 comment · May be fixed by #135295
Labels
A-inline-assembly Area: Inline assembly (`asm!(…)`) A-SIMD Area: SIMD (Single Instruction Multiple Data) C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@matthiaskrgr
Copy link
Member

auto-reduced (treereduce-rust):

use std::arch::{asm, global_asm};

#[repr(simd)]
struct SimdNonCopy();

fn main() {
    unsafe {
        let x = 1;

        let _ = y;

        asm!("{}", in(xmm_reg) SimdNonCopy());
    }
}
original code

original:

//@ only-x86_64

#![feature(repr_simd, never_type)]

use std::arch::{asm, global_asm};

#[repr(simd)]
struct SimdNonCopy();

fn main() {
    unsafe {
        // Inputs must be initialized

        let x = 1;
        asm!("{}", in(reg) x);
        //~^ ERROR isn't initialized
        let mut y: u64;
        asm!("{}", inout(reg) y);
        //~^ ERROR isn't initialized
        let _ = y;

        // Outputs require mutable places

        let v: Vec<u64> = vec![0, 1, 2];
        //~^ ERROR is not declared as mutable
        asm!("{}", in(reg) v[0]);
        asm!("{}", out(reg) v[0]);
        asm!("{}", inout(reg) v[0]);

        // Register operands must be Copy

        asm!("{}", in(xmm_reg) SimdNonCopy([0.0, 0.0, 0.0, 0.0]));
        //~^ ERROR arguments for inline assembly must be copyable

        // Register operands must be integers, floats, SIMD vectors, pointers or
        // function pointers.

        asm!("{}", in(reg) 0i64);
        asm!("{}", in(deny) 0f64);
        asm!("{}", in(xmm_reg) std::arch::x86_64::_mm_setzero_ps());
        asm!("{}", in(reg) 0 as *const u8);
        asm!("{}", in(reg) 0 as *mut u8);
        asm!("{}", in(reg) main as fn());
        asm!("{}", in(reg) |x: i32| x);
        //~^ ERROR cannot use value of type
        asm!("{}", in(reg) 0i64);
        //~^ ERROR cannot use value of type `Vec<i32>` for inline assembly
        asm!("mm0", in(reg) (1, 2, 3));
        //~^ ERROR cannot use value of type `(i32, i32, i32)` for inline assembly
        asm!("", in("mm0") foo);
        //~^ ERROR cannot use value of type `[i32; 3]` for inline assembly

        // Register inputs (but not outputs) allow references and function types

        let mut f = main;
        let mut r = &mut 0;
        asm!("{}", in(reg) f);
        asm!("{}", in(xmm_reg) SimdNonCopy([0.0, 0.0, 0.0, 0.0]));
        //~^ ERROR cannot use value of type `fn() {main}` for inline assembly
        asm!("{}", in(reg) r);
        asm!("{}", inout(reg) r);
        //~^ ERROR cannot use value of type `&mut i32` for inline assembly
        let _ = (f, r);

        // Type checks ignore never type

        let u: ! = unreachable!();
        asm!("{}", in(reg) u);
    }
}

Version information

rustc 1.85.0-nightly (4790a435c 2024-12-15)
binary: rustc
commit-hash: 4790a435cbcb55c94ccdef51bf7a9b2e55824528
commit-date: 2024-12-15
host: x86_64-unknown-linux-gnu
release: 1.85.0-nightly
LLVM version: 19.1.5

Possibly related line of code:

ty::Float(FloatTy::F64) => Ok(InlineAsmType::F64),
ty::Float(FloatTy::F128) => Ok(InlineAsmType::F128),
ty::FnPtr(..) => Ok(asm_ty_isize),
ty::RawPtr(ty, _) if self.is_thin_ptr_ty(ty) => Ok(asm_ty_isize),
ty::Adt(adt, args) if adt.repr().simd() => {
let fields = &adt.non_enum_variant().fields;
let field = &fields[FieldIdx::ZERO];
let elem_ty = field.ty(self.tcx, args);
let (size, ty) = match elem_ty.kind() {
ty::Array(ty, len) => {
let len = self.tcx.normalize_erasing_regions(self.typing_env, *len);
if let Some(len) = len.try_to_target_usize(self.tcx) {

Command:
/home/matthias/.rustup/toolchains/master/bin/rustc

Program output

error[E0425]: cannot find value `y` in this scope
  --> /tmp/icemaker_global_tempdir.fOXZErRE56RX/rustc_testrunner_tmpdir_reporting.p9FlkAioN2KU/mvce.rs:10:17
   |
10 |         let _ = y;
   |                 ^ help: a local variable with a similar name exists: `x`

error[E0658]: SIMD types are experimental and possibly buggy
 --> /tmp/icemaker_global_tempdir.fOXZErRE56RX/rustc_testrunner_tmpdir_reporting.p9FlkAioN2KU/mvce.rs:3:1
  |
3 | #[repr(simd)]
  | ^^^^^^^^^^^^^
  |
  = note: see issue #27731 <https://github.com/rust-lang/rust/issues/27731> for more information
  = help: add `#![feature(repr_simd)]` to the crate attributes to enable
  = note: this compiler was built on 2024-12-15; consider upgrading it if it is out of date

warning: unused import: `global_asm`
 --> /tmp/icemaker_global_tempdir.fOXZErRE56RX/rustc_testrunner_tmpdir_reporting.p9FlkAioN2KU/mvce.rs:1:22
  |
1 | use std::arch::{asm, global_asm};
  |                      ^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

error[E0075]: SIMD vector cannot be empty
 --> /tmp/icemaker_global_tempdir.fOXZErRE56RX/rustc_testrunner_tmpdir_reporting.p9FlkAioN2KU/mvce.rs:4:1
  |
4 | struct SimdNonCopy();
  | ^^^^^^^^^^^^^^^^^^

thread 'rustc' panicked at compiler/rustc_hir_analysis/src/check/intrinsicck.rs:89:36:
index out of bounds: the len is 0 but the index is 0
stack backtrace:
   0:     0x71b5da7a4c5a - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::heb202b000efba683
   1:     0x71b5db013d66 - core::fmt::write::h4529572b8b32da24
   2:     0x71b5dc01db51 - std::io::Write::write_fmt::h1a906436cb206037
   3:     0x71b5da7a4ab2 - std::sys::backtrace::BacktraceLock::print::h934abc86fa2dd260
   4:     0x71b5da7a6faa - std::panicking::default_hook::{{closure}}::hfd4bbe50128406cd
   5:     0x71b5da7a6df3 - std::panicking::default_hook::h25fd19fcd22c2e04
   6:     0x71b5d98f9a68 - std[70002648da4681c1]::panicking::update_hook::<alloc[334d4c3039138aa]::boxed::Box<rustc_driver_impl[2cc745b14baadf]::install_ice_hook::{closure#0}>>::{closure#0}
   7:     0x71b5da7a7768 - std::panicking::rust_panic_with_hook::h3f6d3ded85336e6b
   8:     0x71b5da7a745a - std::panicking::begin_panic_handler::{{closure}}::h4686f34f41f48fef
   9:     0x71b5da7a50f9 - std::sys::backtrace::__rust_end_short_backtrace::h4d0c634afae53cc6
  10:     0x71b5da7a711d - rust_begin_unwind
  11:     0x71b5d73cf0c0 - core::panicking::panic_fmt::h5928a9348ea2bb6c
  12:     0x71b5d9120c16 - core::panicking::panic_bounds_check::ha0907f8c63a361ab
  13:     0x71b5d9a9eecc - <rustc_hir_analysis[4c68008ff0c7f4c4]::check::intrinsicck::InlineAsmCtxt>::get_asm_ty
  14:     0x71b5d9a9f067 - <rustc_hir_analysis[4c68008ff0c7f4c4]::check::intrinsicck::InlineAsmCtxt>::check_asm_operand_type
  15:     0x71b5d9aa0a0d - <rustc_hir_analysis[4c68008ff0c7f4c4]::check::intrinsicck::InlineAsmCtxt>::check_asm
  16:     0x71b5db21fad6 - rustc_hir_typeck[220f1b283db8da2]::typeck
  17:     0x71b5db21bafb - rustc_query_impl[98026ab69133ca5a]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[98026ab69133ca5a]::query_impl::typeck::dynamic_query::{closure#2}::{closure#0}, rustc_middle[4552a92c16cacd81]::query::erase::Erased<[u8; 8usize]>>
  18:     0x71b5db275711 - rustc_query_system[c5a9321c1b201b0d]::query::plumbing::try_execute_query::<rustc_query_impl[98026ab69133ca5a]::DynamicConfig<rustc_data_structures[41b15b2b138651fb]::vec_cache::VecCache<rustc_span[5501a71f8d28de35]::def_id::LocalDefId, rustc_middle[4552a92c16cacd81]::query::erase::Erased<[u8; 8usize]>, rustc_query_system[c5a9321c1b201b0d]::dep_graph::graph::DepNodeIndex>, false, false, false>, rustc_query_impl[98026ab69133ca5a]::plumbing::QueryCtxt, false>
  19:     0x71b5db2749cd - rustc_query_impl[98026ab69133ca5a]::query_impl::typeck::get_query_non_incr::__rust_end_short_backtrace
  20:     0x71b5db27467f - <rustc_middle[4552a92c16cacd81]::hir::map::Map>::par_body_owners::<rustc_hir_analysis[4c68008ff0c7f4c4]::check_crate::{closure#4}>::{closure#0}
  21:     0x71b5db272692 - rustc_hir_analysis[4c68008ff0c7f4c4]::check_crate
  22:     0x71b5db453502 - rustc_interface[cf66c2394d3c8572]::passes::run_required_analyses
  23:     0x71b5dc00c91e - rustc_interface[cf66c2394d3c8572]::passes::analysis
  24:     0x71b5dc00c8ef - rustc_query_impl[98026ab69133ca5a]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[98026ab69133ca5a]::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle[4552a92c16cacd81]::query::erase::Erased<[u8; 0usize]>>
  25:     0x71b5dc041015 - rustc_query_system[c5a9321c1b201b0d]::query::plumbing::try_execute_query::<rustc_query_impl[98026ab69133ca5a]::DynamicConfig<rustc_query_system[c5a9321c1b201b0d]::query::caches::SingleCache<rustc_middle[4552a92c16cacd81]::query::erase::Erased<[u8; 0usize]>>, false, false, false>, rustc_query_impl[98026ab69133ca5a]::plumbing::QueryCtxt, false>
  26:     0x71b5dc040d4e - rustc_query_impl[98026ab69133ca5a]::query_impl::analysis::get_query_non_incr::__rust_end_short_backtrace
  27:     0x71b5dc0b61b4 - rustc_interface[cf66c2394d3c8572]::interface::run_compiler::<(), rustc_driver_impl[2cc745b14baadf]::run_compiler::{closure#0}>::{closure#1}
  28:     0x71b5dbf685db - std[70002648da4681c1]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[cf66c2394d3c8572]::util::run_in_thread_with_globals<rustc_interface[cf66c2394d3c8572]::util::run_in_thread_pool_with_globals<rustc_interface[cf66c2394d3c8572]::interface::run_compiler<(), rustc_driver_impl[2cc745b14baadf]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
  29:     0x71b5dbf68a90 - <<std[70002648da4681c1]::thread::Builder>::spawn_unchecked_<rustc_interface[cf66c2394d3c8572]::util::run_in_thread_with_globals<rustc_interface[cf66c2394d3c8572]::util::run_in_thread_pool_with_globals<rustc_interface[cf66c2394d3c8572]::interface::run_compiler<(), rustc_driver_impl[2cc745b14baadf]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[3b8d2fc2756ea0bb]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  30:     0x71b5dbf6a06f - std::sys::pal::unix::thread::Thread::new::thread_start::hdeaa41b2ac9b4ad7
  31:     0x71b5d60a339d - <unknown>
  32:     0x71b5d612849c - <unknown>
  33:                0x0 - <unknown>

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

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: please make sure that you have updated to the latest nightly

note: rustc 1.85.0-nightly (4790a435c 2024-12-15) running on x86_64-unknown-linux-gnu

query stack during panic:
#0 [typeck] type-checking `main`
#1 [analysis] running analysis passes on this crate
end of query stack
error: aborting due to 3 previous errors; 1 warning emitted

Some errors have detailed explanations: E0075, E0425, E0658.
For more information about an error, try `rustc --explain E0075`.

@rustbot label +F-repr_simd +F-never_type

@matthiaskrgr matthiaskrgr added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Dec 15, 2024
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Dec 15, 2024
@matthiaskrgr
Copy link
Member Author

#[repr(simd)]
struct A();

fn main() {
    std::arch::asm!("{}", in(xmm_reg) A());
}

@matthiaskrgr matthiaskrgr added the S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. label Dec 16, 2024
@saethlin saethlin removed the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Dec 16, 2024
@Enselic Enselic added A-inline-assembly Area: Inline assembly (`asm!(…)`) A-SIMD Area: SIMD (Single Instruction Multiple Data) labels Dec 30, 2024
@eyraudh eyraudh linked a pull request Jan 9, 2025 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-inline-assembly Area: Inline assembly (`asm!(…)`) A-SIMD Area: SIMD (Single Instruction Multiple Data) C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants