wasmtime icon indicating copy to clipboard operation
wasmtime copied to clipboard

Cranelift: 'Could not allocate minimal bundle, but the allocation problem should be possible to solve' panic

Open jakubDoka opened this issue 2 years ago • 4 comments

.clif Test Case (reduced)

function u0:0() windows_fastcall {
    sig0 = (i64 sret, i64) -> i64 sret fast
    fn0 = colocated u0:4 sig0

block0:
    v1 = iconst.i64 0
    v5 = iconst.i64 0
    v6 = call fn0(v5, v1)  ; v5 = 0, v1 = 0
    return
}

Steps to Reproduce

(bug.clif)

function u0:0(i64, i64) windows_fastcall {
    sig0 = (i64 sret, i64) -> i64 sret fast
    sig1 = (i64 sret, i64) -> i64 sret fast
    fn0 = colocated u0:4 sig0
    fn1 = colocated u0:4 sig1

block0(v0: i64, v1: i64):
    v2 = iconst.i8 0
    store v2, v0  ; v2 = 0
    v3 = iadd_imm v0, 4
    v4 = call fn0(v3, v1)
    v5 = iadd_imm v0, 16
    v6 = call fn1(v5, v1)
    return
}

(in cranelift directory)

> cargo run --release bugpoint bug.clif x86_64-pc-windows-msvc

Expected Result

The code I provided should be valid or at least possible to compile unless I overlooked something.

Actual Results

thread '<unnamed>' panicked at 'Could not allocate minimal bundle, but the allocation problem should be possible to solve', C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\regalloc2-0.4.1\src\ion\process.rs:1268:17
stack backtrace:
   0: std::panicking::begin_panic<str>
             at /rustc/95a992a68694d8bf3959bd2c0ac27ce9e9208b59\library\std\src\panicking.rs:616
   1: regalloc2::ion::data_structures::Env<cranelift_codegen::machinst::vcode::VCode<enum2$<cranelift_codegen::isa::x64::lower::isle::generated_code::MInst> > >::process_bundle<cranelift_codegen::machinst::vcode::VCode<enum2$<cranelift_codegen::isa::x64::lower:
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\regalloc2-0.4.1\src\ion\process.rs:1268
   2: regalloc2::ion::data_structures::Env<cranelift_codegen::machinst::vcode::VCode<enum2$<cranelift_codegen::isa::x64::lower::isle::generated_code::MInst> > >::process_bundles<cranelift_codegen::machinst::vcode::VCode<enum2$<cranelift_codegen::isa::x64::lower
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\regalloc2-0.4.1\src\ion\process.rs:44
   3: regalloc2::ion::data_structures::Env<cranelift_codegen::machinst::vcode::VCode<enum2$<cranelift_codegen::isa::x64::lower::isle::generated_code::MInst> > >::run<cranelift_codegen::machinst::vcode::VCode<enum2$<cranelift_codegen::isa::x64::lower::isle::gene
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\regalloc2-0.4.1\src\ion\mod.rs:107
   4: regalloc2::ion::run<cranelift_codegen::machinst::vcode::VCode<enum2$<cranelift_codegen::isa::x64::lower::isle::generated_code::MInst> > >
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\regalloc2-0.4.1\src\ion\mod.rs:127
   5: regalloc2::run<cranelift_codegen::machinst::vcode::VCode<enum2$<cranelift_codegen::isa::x64::lower::isle::generated_code::MInst> > >
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\regalloc2-0.4.1\src\lib.rs:1460
   6: cranelift_codegen::machinst::compile::compile<cranelift_codegen::isa::x64::X64Backend>
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\cranelift-codegen-0.89.1\src\machinst\compile.rs:41
   7: cranelift_codegen::isa::x64::X64Backend::compile_vcode
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\cranelift-codegen-0.89.1\src\isa\x64\mod.rs:58
   8: cranelift_codegen::isa::x64::impl$1::compile_function
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\cranelift-codegen-0.89.1\src\isa\x64\mod.rs:69
   9: cranelift_codegen::context::Context::compile_stencil
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\cranelift-codegen-0.89.1\src\context.rs:173
  10: cranelift_codegen::context::Context::compile
             at C:\Users\LENOVO\.cargo\registry\src\github.com-1ecc6299db9ec823\cranelift-codegen-0.89.1\src\context.rs:185
  11: middleware::logic::Worker::compile_current_requests
             at C:\src\rust\catalyst\subcommands\middleware\src\logic.rs:686
  12: middleware::logic::Worker::compile_macros
             at C:\src\rust\catalyst\subcommands\middleware\src\logic.rs:614
  13: middleware::logic::Worker::compile_module
             at C:\src\rust\catalyst\subcommands\middleware\src\logic.rs:591
  14: middleware::logic::impl$2::run::closure$0
             at C:\src\rust\catalyst\subcommands\middleware\src\logic.rs:535
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Versions and Environment

Cranelift version or commit: 0.90.0

Operating system: Windows

Architecture: x86_64

jakubDoka avatar Oct 31 '22 12:10 jakubDoka

Seems like removing sret from return type of imported signatures makes compilation pass, Is sret supposed to be used with return value or argument is enough?

jakubDoka avatar Oct 31 '22 14:10 jakubDoka

Using it as argument is enough.

bjorn3 avatar Oct 31 '22 14:10 bjorn3

Seems like I was misusing this for a while, nevertheless resulting error is not helpful, Would it be possible to integrate some verification for signatures?

jakubDoka avatar Oct 31 '22 15:10 jakubDoka

Yeah, I think we should check this in the verifier. Adding a StructReturn case to https://github.com/bytecodealliance/wasmtime/blob/95ecb7e4d440605165a74de607de5389508779be/cranelift/codegen/src/verifier/mod.rs#L1741-L1753 would work I think.

bjorn3 avatar Oct 31 '22 18:10 bjorn3