abrown closed issue #2883:
.clif
Test Casefunction u0:0() -> i64 system_v { block0: v0 = iconst.i64 1 v1 = iconst.i64 1 v2 = ssub_sat v0, v1 return v2 }
Steps to Reproduce
Use
ssub_sat
with twoI64
values and (at least for my case) usecranelift-object
with a triple that looks like:target_lexicon::Triple::host() = Triple { architecture: X86_64, vendor: Unknown, operating_system: Linux, environment: Gnu, binary_format: Elf, }
Expected Results
The code should compile correctly and the function should return
0
Actual Results
thread 'main' panicked at 'internal error: entered unreachable code: SsubSat', /home/mental/.cargo/registry/src/github.com-1ecc6299db9ec823/cranelift-codegen-0.73.0/src/isa/x64/lower.rs:1800:26
(note that the unreachable message is actually empty in the code, I have modified it locally to emit the unsupported opcode)
an unreachable case is hit instead.
Versions and Environment
Cranelift version or commit:
0.73.0
Operating system:
Linux felix 5.11.15-arch1-2 #1 SMP PREEMPT Sat, 17 Apr 2021 00:22:30 +0000 x86_64 GNU/Linux
Architecture:
x86_64
Extra Info
<details>
<summary>minimal, complete and verifiable example (mcve)</summary>use cranelift_codegen::{binemit, ir::InstBuilder, Context}; use cranelift_codegen::{ ir::{self, Signature}, isa, settings, verify_function, }; use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext}; use cranelift_module::{Linkage, Module}; use cranelift_object::{ObjectBuilder, ObjectModule}; use settings::FlagsOrIsa; fn main() { let target_isa = isa::lookup(dbg!(target_lexicon::Triple::host())) .unwrap() .finish(settings::Flags::new(settings::builder())); let object_builder = ObjectBuilder::new( target_isa, "<empty>".to_string(), cranelift_module::default_libcall_names(), ) .unwrap(); let target_isa = isa::lookup(target_lexicon::Triple::host()) .unwrap() .finish(settings::Flags::new(settings::builder())); let mut object_module = ObjectModule::new(object_builder); let mut sig = Signature::new(cranelift_codegen::isa::CallConv::SystemV); sig.returns.push(ir::AbiParam::new(ir::types::I64)); let mut func = ir::Function::with_name_signature( ir::ExternalName::User { namespace: 0, index: 0, }, sig, ); let mut builder_ctx = FunctionBuilderContext::new(); let mut builder = FunctionBuilder::new(&mut func, &mut builder_ctx); let b0 = builder.create_block(); builder.switch_to_block(b0); let v1 = builder.ins().iconst(ir::types::I64, 1); let v2 = builder.ins().iconst(ir::types::I64, 1); let v3 = builder.ins().ssub_sat(v1, v2); builder.ins().return_(&[v3]); let fisa = FlagsOrIsa::from(&*target_isa); verify_function(&builder.func, fisa).unwrap(); let fid = object_module .declare_function(&"main", Linkage::Export, &func.signature.clone()) .unwrap(); let mut ctx = Context::for_function(func); object_module .define_function( fid, &mut ctx, &mut binemit::NullTrapSink {}, &mut binemit::NullStackMapSink {}, ) .unwrap(); }
[package] name = "clif-usub" version = "0.1.0" edition = "2018" [dependencies] cranelift-codegen = "0.73.0" cranelift-frontend = "0.73.0" cranelift-object = "0.73.0" cranelift-module = "0.73.0" target-lexicon = "0.12.0"
</details>
Last updated: Nov 22 2024 at 16:03 UTC