Closed frankblubaugh closed 7 months ago
Hi @frankblubaugh, cool to see someone interested in sci-rs. sci-rs makes heavy use of const generic sized arrays (provided by heapless) to allow functionality for no_std. I hit several ICEs across several nightly versions, while putting together the current crate functionality. Do be warned to keep track of what nightly works for you if you plan to use the crate as it is now. The features required by sci-rs are #![feature(generic_const_exprs, generic_arg_infer)]
, which are known to be undergoing changes.
I find that the internal compiler error hits in 2022-11-27 but not 2022-11-26. I tried both the aarch64-apple-ios and aarch64-apple-darwin targets on a library that uses sci-rs like your example.
sci-rs has a lot of const generic usage. The call that crashed was way down inside of the butter_st call near poly_st and heapless. Here is an example of how the functions calls use computed const generic values to compute math on the stack for no_std compatibility in this call tree.
pub fn poly_st<F, const N: usize>(z: &Vec<F, N>) -> Vec<F, { N + 1 }>
where
F: ComplexField,
[(); { N + 1 }]: Sized,
{
let mut a: Vec<F, { N + 1 }> = Vec::new();
a.push(F::one());
const KER: usize = 2;
for zi in z {
let mut b = Vec::new();
b.resize(a.len() + 1, F::zero());
let k = [F::one(), -zi.clone()];
for i in 0..a.len() + KER - 1 {
let u_i = if i > a.len() { i - KER } else { 0 };
let u_f = i.min(a.len() - 1);
if u_i == u_f {
b[i] += a[u_i].clone() * k[i - u_i].clone();
} else {
for u in u_i..(u_f + 1) {
if i - u < KER {
b[i] += a[u].clone() * k[i - u].clone();
}
}
}
}
a = b;
}
let mut roots = z.clone();
sort_cplx_st(&mut roots);
let mut root_conjs = z
.iter()
.map(|zi| zi.clone().conjugate())
.collect::<Vec<_, N>>();
sort_cplx_st(&mut root_conjs);
if roots.into_iter().zip(root_conjs).all(|(a, b)| a == b) {
a = a
.into_iter()
.map(|ai| ComplexField::from_real(ai.real()))
.collect();
}
a
}
Additionally, here is a call site for poly_st
pub fn zpk2tf_st<C, F, const N: usize>(
z: &Vec<C, N>,
p: &Vec<C, N>,
k: F,
) -> BaFormatFilter<F, { N + 1 }>
where
C: ComplexField<RealField = F>,
F: Float + RealField,
[(); { N + 1 }]: Sized,
{
let b = poly_st(z)
.into_iter()
.map(|bi| <C as ComplexField>::from_real(k) * bi)
.collect::<Vec<_, _>>();
let a = poly_st(p);
// lots of math not shown
todo!()
}
searched nightlies: from nightly-2022-11-25 to nightly-2022-12-01 regressed nightly: nightly-2022-11-27 searched commit range: https://github.com/rust-lang/rust/compare/8681d4cffcd23bbe619984ab62772a91827a40dc...80a96467ec5675e9f69683b5c075a8b15950c341 regressed commit: https://github.com/rust-lang/rust/commit/aff003becd8b6bf803202e958623031274ad69c9
cc @Julianknodt @BoxyUwU
WG-prioritization assigning priority (Zulip discussion).
@rustbot label -I-prioritize +P-medium
@trueb2 Is there a github repo for sci_rs
(The one linked on docs.rs
is not visible)? I suspect that the issue is coming from a combination of generic_arg_infer
and generic_const_exprs
. I've been looking through the source on crates.io
, but it'd be a bit more convenient to see the whole source.
@JulianKnodt you can use https://docs.rs/crate/cargo-download/latest to see the whole source locally.
Somewhat minimized:
#![feature(generic_const_exprs, generic_arg_infer)]
#![allow(incomplete_features)]
#![allow(unused)]
use core::mem::MaybeUninit;
pub struct Arr<T, const N: usize> {
v: [MaybeUninit<T>; N],
}
impl<T, const N: usize> Arr<T, N> {
const ELEM: MaybeUninit<T> = MaybeUninit::uninit();
const INIT: [MaybeUninit<T>; N] = [Self::ELEM; N]; // important for optimization of `new`
fn new() -> Self {
Arr { v: Self::INIT }
}
}
pub struct BaFormatFilter<const N: usize> {}
pub enum DigitalFilter<const N: usize>
where
[(); N * 2 + 1]: Sized,
[(); N * 2]: Sized,
{
Ba(BaFormatFilter<{ N * 2 + 1 }>),
}
pub fn iirfilter_st_copy<const N: usize, const M: usize>(_: [f32; M]) -> DigitalFilter<N>
where
[(); N * 2 + 1]: Sized,
[(); N * 2]: Sized,
{
let zpk = zpk2tf_st(&Arr::<f32, { N * 2 }>::new(), &Arr::<f32, { N * 2 }>::new());
DigitalFilter::Ba(zpk)
}
pub fn zpk2tf_st<const N: usize>(
_z: &Arr<f32, N>,
_p: &Arr<f32, N>,
) -> BaFormatFilter<{ N + 1 }>
where
[(); N + 1]: Sized,
{
BaFormatFilter {}
}
fn main() {
iirfilter_st_copy::<4, 2>([10., 50.,]);
}
I checked the GitHub Actions CI logs that picked up the nightly changes. The error logs are nicer now:
error: internal compiler error: compiler/rustc_monomorphize/src/collector.rs:786:54: collection encountered polymorphic constant: Unevaluated(UnevaluatedConst { def: WithOptConstParam { did: DefId(35:1008 ~ heapless[11c0]::vec::{impl#0}::INIT), const_param_did: None }, substs: [nalgebra::Complex<f64>, Const { ty: usize, kind: Unevaluated(UnevaluatedConst { def: WithOptConstParam { did: DefId(0:426 ~ sci_rs[3467]::signal::filter::design::zpk2tf::poly_st::{constant#2}), const_param_did: Some(DefId(35:1000 ~ heapless[11c0]::vec::Vec::N)) }, substs: [nalgebra::Complex<f64>, Const { ty: usize, kind: Expr(Binop(Mul, Const { ty: usize, kind: Value(Leaf(0x0000000000000004)) }, Const { ty: usize, kind: Value(Leaf(0x0000000000000002)) })) }] }) }], promoted: None }, [std::mem::MaybeUninit<nalgebra::Complex<f64>>; { N + 1 }])
[14](https://github.com/qsib-cbie/sci-rs/actions/runs/4001647129/jobs/6868094727#step:6:15)
--> /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/heapless-0.7.16/src/vec.rs:70:21
[15](https://github.com/qsib-cbie/sci-rs/actions/runs/4001647129/jobs/6868094727#step:6:16)
|
[16](https://github.com/qsib-cbie/sci-rs/actions/runs/4001647129/jobs/6868094727#step:6:17)
70 | buffer: Self::INIT,
[17](https://github.com/qsib-cbie/sci-rs/actions/runs/4001647129/jobs/6868094727#step:6:18)
| ^^^^^^^^^^
[18](https://github.com/qsib-cbie/sci-rs/actions/runs/4001647129/jobs/6868094727#step:6:19)
Given this is tagged with requires-nightly, I don't think it qualifies as a beta regression. Removing that label.
Triage: Fixed on the latest nightly, marking as E-needs-test @rustbot labels: +E-needs-test
Code
Meta
rustc --version --verbose
:Error output
Backtrace
``` stack backtrace: 0: 0x1054f9bac -::fmt::hea68b7b20126fcc2
1: 0x10554b30c - core::fmt::write::h76ef1456439f6e44
2: 0x1054ed404 - std::io::Write::write_fmt::ha1f61edbd5acf3b5
3: 0x1054f99c0 - std::sys_common::backtrace::print::h8649bc4326f5f277
4: 0x1054fc4f4 - std::panicking::default_hook::{{closure}}::h7887887a17185173
5: 0x1054fc24c - std::panicking::default_hook::h197221548797e88a
6: 0x10d73b324 - rustc_driver[69cf2497f4e7534a]::DEFAULT_HOOK::{closure#0}::{closure#0}
7: 0x1054fcbec - std::panicking::rust_panic_with_hook::h0e871605208fade7
8: 0x10fcff64c - std[8e1853b45c5b494b]::panicking::begin_panic::::{closure#0}
9: 0x10fcfef20 - std[8e1853b45c5b494b]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !>
10: 0x11197db58 - std[8e1853b45c5b494b]::panicking::begin_panic::
11: 0x10fd151d8 - std[8e1853b45c5b494b]::panic::panic_any::
12: 0x10fd145c8 - ::span_bug::
13: 0x10fd1440c - ::span_bug::
14: 0x10fd1536c - rustc_middle[6ee9a7af4dced80c]::ty::context::tls::with_context_opt::::{closure#0}, ()>::{closure#0}, ()>
15: 0x10fd15238 - rustc_middle[6ee9a7af4dced80c]::util::bug::opt_span_bug_fmt::
16: 0x111984ce8 - rustc_middle[6ee9a7af4dced80c]::util::bug::span_bug_fmt::
17: 0x10fcf0178 - ::visit_constant
18: 0x10fcebbd4 - ::visit_operand
19: 0x10fceab50 - ::visit_rvalue
20: 0x10fcf1128 - rustc_monomorphize[674d628f34238242]::collector::collect_neighbours
21: 0x10fcef290 - rustc_monomorphize[674d628f34238242]::collector::collect_items_rec
22: 0x10fcef708 - rustc_monomorphize[674d628f34238242]::collector::collect_items_rec
23: 0x10fcef708 - rustc_monomorphize[674d628f34238242]::collector::collect_items_rec
24: 0x10fcef708 - rustc_monomorphize[674d628f34238242]::collector::collect_items_rec
25: 0x10fcef708 - rustc_monomorphize[674d628f34238242]::collector::collect_items_rec
26: 0x10fcef708 - rustc_monomorphize[674d628f34238242]::collector::collect_items_rec
27: 0x10fcf7f04 - std[8e1853b45c5b494b]::panicking::try::<(), core[584ed36222eb190f]::panic::unwind_safe::AssertUnwindSafe, rustc_monomorphize[674d628f34238242]::collector::collect_crate_mono_items::{closure#1}::{closure#0}>::{closure#0}::{closure#0}>>
28: 0x10fd0df24 - ::time::<(), rustc_monomorphize[674d628f34238242]::collector::collect_crate_mono_items::{closure#1}>
29: 0x10fced448 - rustc_monomorphize[674d628f34238242]::collector::collect_crate_mono_items
30: 0x10fcf5600 - rustc_monomorphize[674d628f34238242]::partitioning::collect_and_partition_mono_items
31: 0x11080110c - rustc_query_system[4bcc622c2d45b20f]::query::plumbing::try_execute_query::
32: 0x110951548 - ::collect_and_partition_mono_items
33: 0x10d84c27c - rustc_codegen_ssa[3b93f269012db227]::base::codegen_crate::
34: 0x10d9374f4 - ::codegen_crate
35: 0x10d7b2aa8 - ::time::, rustc_interface[99b2e32c496d056e]::passes::start_codegen::{closure#0}>
36: 0x10d7cfc24 - rustc_interface[99b2e32c496d056e]::passes::start_codegen
37: 0x10d7cec2c - ::enter::<::ongoing_codegen::{closure#0}::{closure#0}, core[584ed36222eb190f]::result::Result, rustc_errors[e6281b614dbb5e3f]::ErrorGuaranteed>>
38: 0x10d822f10 - ::ongoing_codegen
39: 0x10d71759c - rustc_span[35545e7b8de4724]::with_source_map::, rustc_interface[99b2e32c496d056e]::interface::run_compiler, rustc_driver[69cf2497f4e7534a]::run_compiler::{closure#1}>::{closure#0}::{closure#0}>
40: 0x10d70b0d8 - >::set::, rustc_driver[69cf2497f4e7534a]::run_compiler::{closure#1}>::{closure#0}, core[584ed36222eb190f]::result::Result<(), rustc_errors[e6281b614dbb5e3f]::ErrorGuaranteed>>
41: 0x10d6e0180 - std[8e1853b45c5b494b]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver[69cf2497f4e7534a]::run_compiler::{closure#1}>::{closure#0}, core[584ed36222eb190f]::result::Result<(), rustc_errors[e6281b614dbb5e3f]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[584ed36222eb190f]::result::Result<(), rustc_errors[e6281b614dbb5e3f]::ErrorGuaranteed>>
42: 0x10d6c6638 - <::spawn_unchecked_, rustc_driver[69cf2497f4e7534a]::run_compiler::{closure#1}>::{closure#0}, core[584ed36222eb190f]::result::Result<(), rustc_errors[e6281b614dbb5e3f]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[584ed36222eb190f]::result::Result<(), rustc_errors[e6281b614dbb5e3f]::ErrorGuaranteed>>::{closure#1} as core[584ed36222eb190f]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
43: 0x105505624 - std::sys::unix::thread::Thread::new::thread_start::h7328e7d271fec60e
44: 0x1b4f1c26c - __pthread_deallocate
```