Skip to content

aarch64: Atomic umin/umax does not zero-extend properly #13972

Description

@alexcrichton

This input:

test run
target aarch64

function %rmw_umin_i8(i32) -> i8 {
    ss0 = explicit_slot 8
block0(v0: i32):
    v1 = stack_addr.i64 ss0
    v2 = iconst.i8 32
    store.i8 v2, v1
    v3 = ireduce.i8 v0
    v4 = atomic_rmw.i8 umin v1, v3
    v5 = load.i8 v1
    return v5
}
; run: %rmw_umin_i8(0x110) == 16

yields:

$ cargo run -p cranelift-tools --target aarch64-unknown-linux-gnu test case_rmw_umin_i8.clif
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.10s
     Running `qemu-aarch64 -L /usr/aarch64-linux-gnu -E LD_LIBRARY_PATH=/usr/aarch64-linux-gnu/lib -E WASMTIME_TEST_NO_HOG_MEMORY=1 /home/alex/code/wasmtime2/target/aarch64-unknown-linux-gnu/debug/clif-util test case_rmw_umin_i8.clif`
[2026-07-25T00:04:36Z ERROR cranelift_filetests::concurrent] FAIL: run
FAIL case_rmw_umin_i8.clif: run

Caused by:
    Failed test: run: %rmw_umin_i8(272) == 16, actual: 32
1 tests
Error: 1 failure

This only affects when has_lse is disabled, and notably the lowering of U{min,max} are missing zero-extensions of loads. And LLM writeup, if helpful, is here

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugIncorrect behavior in the current implementation that needs fixingcraneliftIssues related to the Cranelift code generatorcranelift:area:aarch64Issues related to AArch64 backend.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions