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

Cranelift: fcvt_to_{u,s}int{,_sat} not implemented for i128 on x64 #4899

Open
afonso360 opened this issue Sep 12, 2022 · 0 comments
Open

Cranelift: fcvt_to_{u,s}int{,_sat} not implemented for i128 on x64 #4899

afonso360 opened this issue Sep 12, 2022 · 0 comments
Labels
bug Incorrect behavior in the current implementation that needs fixing cranelift:area:x64 Issues related to x64 codegen cranelift Issues related to the Cranelift code generator

Comments

@afonso360
Copy link
Contributor

👋 Hey,

This came up when trying to fuzz #4884

.clif Test Case

So this is a bunch of separate cases, I can split it into multiple issues if you'd like:

fcvt_to_uint
test run
set enable_llvm_abi_extensions
target x86_64

function %a(f32) -> i128 {
block0(v0: f32):
    v1 = fcvt_to_uint.i128 v0
    return v1
}
; run: %a(0.0) == 0

function %c(f64) -> i128 {
block0(v0: f64):
    v1 = fcvt_to_uint.i128 v0
    return v1
}
; run: %c(0.0) == 0
fcvt_to_sint
test run
set enable_llvm_abi_extensions
target x86_64

function %signed_a(f32) -> i128 {
block0(v0: f32):
    v1 = fcvt_to_sint.i128 v0
    return v1
}
; run: %signed_a(0.0) == 0

function %signed_c(f64) -> i128 {
block0(v0: f64):
    v1 = fcvt_to_sint.i128 v0
    return v1
}
; run: %signed_c(0.0) == 0
fcvt_to_uint_sat
test run
set enable_llvm_abi_extensions
target x86_64

function %a(f32) -> i128 {
block0(v0: f32):
    v1 = fcvt_to_uint_sat.i128 v0
    return v1
}
; run: %a(0.0) == 0

function %c(f64) -> i128 {
block0(v0: f64):
    v1 = fcvt_to_uint_sat.i128 v0
    return v1
}
; run: %c(0.0) == 0
fcvt_to_sint_sat
test run
set enable_llvm_abi_extensions
target x86_64

function %signed_a(f32) -> i128 {
block0(v0: f32):
    v1 = fcvt_to_sint_sat.i128 v0
    return v1
}
; run: %signed_a(0.0) == 0

function %signed_c(f64) -> i128 {
block0(v0: f64):
    v1 = fcvt_to_sint_sat.i128 v0
    return v1
}
; run: %signed_c(0.0) == 0

Steps to Reproduce

  • clif-util ./the-above.clif

Expected Results

The above tests to pass.

Actual Results

thread 'worker #0' panicked at 'internal error: entered unreachable code: Invalid OperandSize: 16', cranelift\codegen\src\isa\x64\inst\args.rs:1807:18
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
 ERROR cranelift_filetests::concurrent > FAIL: panicked in worker #0: internal error: entered unreachable code: Invalid OperandSize: 16
FAIL .\lmao.clif: panicked in worker #0: internal error: entered unreachable code: Invalid OperandSize: 16
1 tests
Error: 1 failure

This fails in the first function but all the functions in all test cases crash with a similar error.

Versions and Environment

Cranelift version or commit: main
Operating system: Windows
Architecture: x64

Extra Info

cg_clif works around this by directly emitting a libcall: https://github.com/bjorn3/rustc_codegen_cranelift/blob/fa7660440b2581c4c57d896d50e76da1515de6df/src/cast.rs#L87-L113

@afonso360 afonso360 added bug Incorrect behavior in the current implementation that needs fixing cranelift Issues related to the Cranelift code generator labels Sep 12, 2022
@afonso360 afonso360 changed the title Cranelift: fcvt_to_{u,s}int{,_sat} not implemented for i128 types on x64 Cranelift: fcvt_to_{u,s}int{,_sat} not implemented for i128 on x64 Sep 12, 2022
@akirilov-arm akirilov-arm added the cranelift:area:x64 Issues related to x64 codegen label Sep 26, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Incorrect behavior in the current implementation that needs fixing cranelift:area:x64 Issues related to x64 codegen cranelift Issues related to the Cranelift code generator
Projects
None yet
Development

No branches or pull requests

2 participants