[llvm] [SelectionDAG] Fix incorrect expansion of `CONVERT_TO_ARBITRARY_FP` (PR #221358)

Dmitry Sidorov via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 17 05:22:57 PDT 2026


================
@@ -0,0 +1,778 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=riscv64 -mattr=+b,+f < %s | FileCheck %s
+
+define i8 @bf16_fp8e5m2_nearest(bfloat %x) nounwind {
+; CHECK-LABEL: bf16_fp8e5m2_nearest:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    addi sp, sp, -32
+; CHECK-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; CHECK-NEXT:    fsw fs0, 20(sp) # 4-byte Folded Spill
+; CHECK-NEXT:    fmv.x.w a0, fa0
+; CHECK-NEXT:    slli a0, a0, 16
+; CHECK-NEXT:    fmv.w.x fs0, a0
+; CHECK-NEXT:    mv a0, sp
+; CHECK-NEXT:    fmv.s fa0, fs0
+; CHECK-NEXT:    call frexpf
+; CHECK-NEXT:    fsw fa0, 12(sp)
+; CHECK-NEXT:    fsw fs0, 16(sp)
+; CHECK-NEXT:    lwu a0, 12(sp)
+; CHECK-NEXT:    ld a4, 0(sp)
+; CHECK-NEXT:    slli a3, a0, 41
+; CHECK-NEXT:    srli a3, a3, 41
+; CHECK-NEXT:    slli a1, a0, 44
+; CHECK-NEXT:    snez a1, a1
+; CHECK-NEXT:    bexti a2, a3, 21
+; CHECK-NEXT:    or a1, a1, a2
+; CHECK-NEXT:    srli a0, a0, 20
+; CHECK-NEXT:    and a0, a0, a1
+; CHECK-NEXT:    srli a1, a3, 21
+; CHECK-NEXT:    add a2, a1, a0
+; CHECK-NEXT:    lbu a1, 19(sp)
+; CHECK-NEXT:    slti a0, a2, 4
+; CHECK-NEXT:    xori a5, a0, 1
+; CHECK-NEXT:    add a5, a4, a5
+; CHECK-NEXT:    neg a6, a0
+; CHECK-NEXT:    addi a0, a5, 14
+; CHECK-NEXT:    andi a1, a1, 128
+; CHECK-NEXT:    and a2, a6, a2
+; CHECK-NEXT:    blez a0, .LBB0_2
+; CHECK-NEXT:  # %bb.1:
+; CHECK-NEXT:    slli a3, a0, 2
+; CHECK-NEXT:    or a4, a1, a2
+; CHECK-NEXT:    or a3, a4, a3
+; CHECK-NEXT:    j .LBB0_3
+; CHECK-NEXT:  .LBB0_2:
+; CHECK-NEXT:    li a5, 8
+; CHECK-NEXT:    li a6, 31
+; CHECK-NEXT:    sub a5, a5, a4
+; CHECK-NEXT:    li a4, 1
+; CHECK-NEXT:    minu a5, a5, a6
+; CHECK-NEXT:    maxu a4, a5, a4
+; CHECK-NEXT:    addi a4, a4, -1
+; CHECK-NEXT:    bset a6, zero, a4
+; CHECK-NEXT:    bseti a3, a3, 23
+; CHECK-NEXT:    addi a6, a6, -1
+; CHECK-NEXT:    and a6, a3, a6
+; CHECK-NEXT:    bext a7, a3, a5
+; CHECK-NEXT:    snez a6, a6
+; CHECK-NEXT:    or a6, a6, a7
+; CHECK-NEXT:    srl a4, a3, a4
+; CHECK-NEXT:    seqz a7, a5
+; CHECK-NEXT:    and a4, a4, a6
+; CHECK-NEXT:    addi a7, a7, -1
+; CHECK-NEXT:    and a4, a7, a4
+; CHECK-NEXT:    srl a3, a3, a5
+; CHECK-NEXT:    add a3, a3, a4
+; CHECK-NEXT:    slti a4, a3, 4
+; CHECK-NEXT:    xori a5, a4, 1
+; CHECK-NEXT:    neg a4, a4
+; CHECK-NEXT:    sh2add a5, a5, a1
+; CHECK-NEXT:    and a3, a4, a3
+; CHECK-NEXT:    or a3, a5, a3
+; CHECK-NEXT:  .LBB0_3:
+; CHECK-NEXT:    slti a2, a2, 4
+; CHECK-NEXT:    addi a4, a0, -30
+; CHECK-NEXT:    xori a2, a2, 1
+; CHECK-NEXT:    seqz a4, a4
+; CHECK-NEXT:    slti a0, a0, 31
+; CHECK-NEXT:    and a2, a4, a2
+; CHECK-NEXT:    xori a0, a0, 1
+; CHECK-NEXT:    or a4, a0, a2
+; CHECK-NEXT:    addiw a0, a1, 124
+; CHECK-NEXT:    mv a2, a0
+; CHECK-NEXT:    bnez a4, .LBB0_5
+; CHECK-NEXT:  # %bb.4:
+; CHECK-NEXT:    mv a2, a3
+; CHECK-NEXT:  .LBB0_5:
+; CHECK-NEXT:    fmv.w.x fa5, zero
+; CHECK-NEXT:    feq.s a3, fs0, fa5
+; CHECK-NEXT:    bnez a3, .LBB0_7
+; CHECK-NEXT:  # %bb.6:
+; CHECK-NEXT:    mv a1, a2
+; CHECK-NEXT:  .LBB0_7:
+; CHECK-NEXT:    lui a2, 522240
+; CHECK-NEXT:    fabs.s fa5, fs0
+; CHECK-NEXT:    fmv.w.x fa4, a2
+; CHECK-NEXT:    feq.s a2, fa5, fa4
+; CHECK-NEXT:    bnez a2, .LBB0_9
+; CHECK-NEXT:  # %bb.8:
+; CHECK-NEXT:    mv a0, a1
+; CHECK-NEXT:  .LBB0_9:
+; CHECK-NEXT:    feq.s a1, fs0, fs0
+; CHECK-NEXT:    bnez a1, .LBB0_11
+; CHECK-NEXT:  # %bb.10:
+; CHECK-NEXT:    li a0, 126
+; CHECK-NEXT:  .LBB0_11:
+; CHECK-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
+; CHECK-NEXT:    flw fs0, 20(sp) # 4-byte Folded Reload
+; CHECK-NEXT:    addi sp, sp, 32
+; CHECK-NEXT:    ret
+  %r = call i8 @llvm.convert.to.arbitrary.fp(bfloat %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false)
+  ret i8 %r
+}
+
+define i8 @bf16_fp8e5m2_toward_zero(bfloat %x) nounwind {
+; CHECK-LABEL: bf16_fp8e5m2_toward_zero:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    addi sp, sp, -32
+; CHECK-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; CHECK-NEXT:    fsw fs0, 20(sp) # 4-byte Folded Spill
+; CHECK-NEXT:    fmv.x.w a0, fa0
+; CHECK-NEXT:    slli a0, a0, 16
+; CHECK-NEXT:    fmv.w.x fs0, a0
+; CHECK-NEXT:    mv a0, sp
+; CHECK-NEXT:    fmv.s fa0, fs0
+; CHECK-NEXT:    call frexpf
+; CHECK-NEXT:    fsw fa0, 12(sp)
+; CHECK-NEXT:    fsw fs0, 16(sp)
+; CHECK-NEXT:    lw a0, 12(sp)
+; CHECK-NEXT:    slli a0, a0, 41
+; CHECK-NEXT:    ld a4, 0(sp)
+; CHECK-NEXT:    srli a3, a0, 41
+; CHECK-NEXT:    srli a2, a3, 21
+; CHECK-NEXT:    lbu a1, 19(sp)
+; CHECK-NEXT:    slti a0, a2, 4
+; CHECK-NEXT:    xori a5, a0, 1
+; CHECK-NEXT:    add a5, a4, a5
+; CHECK-NEXT:    neg a6, a0
+; CHECK-NEXT:    addi a0, a5, 14
+; CHECK-NEXT:    andi a1, a1, 128
+; CHECK-NEXT:    and a2, a6, a2
+; CHECK-NEXT:    blez a0, .LBB1_2
+; CHECK-NEXT:  # %bb.1:
+; CHECK-NEXT:    slli a3, a0, 2
+; CHECK-NEXT:    or a4, a1, a2
+; CHECK-NEXT:    or a3, a4, a3
+; CHECK-NEXT:    j .LBB1_3
+; CHECK-NEXT:  .LBB1_2:
+; CHECK-NEXT:    li a5, 8
+; CHECK-NEXT:    sub a5, a5, a4
+; CHECK-NEXT:    li a4, 31
+; CHECK-NEXT:    minu a4, a5, a4
+; CHECK-NEXT:    bseti a3, a3, 23
+; CHECK-NEXT:    srl a3, a3, a4
+; CHECK-NEXT:    slti a4, a3, 4
+; CHECK-NEXT:    xori a5, a4, 1
+; CHECK-NEXT:    neg a4, a4
+; CHECK-NEXT:    sh2add a5, a5, a1
+; CHECK-NEXT:    and a3, a4, a3
+; CHECK-NEXT:    or a3, a5, a3
+; CHECK-NEXT:  .LBB1_3:
+; CHECK-NEXT:    slti a2, a2, 4
+; CHECK-NEXT:    addi a4, a0, -30
+; CHECK-NEXT:    xori a2, a2, 1
+; CHECK-NEXT:    seqz a4, a4
+; CHECK-NEXT:    slti a0, a0, 31
+; CHECK-NEXT:    and a2, a4, a2
+; CHECK-NEXT:    xori a0, a0, 1
+; CHECK-NEXT:    or a4, a0, a2
+; CHECK-NEXT:    addiw a0, a1, 124
+; CHECK-NEXT:    mv a2, a0
+; CHECK-NEXT:    bnez a4, .LBB1_5
+; CHECK-NEXT:  # %bb.4:
+; CHECK-NEXT:    mv a2, a3
+; CHECK-NEXT:  .LBB1_5:
+; CHECK-NEXT:    fmv.w.x fa5, zero
+; CHECK-NEXT:    feq.s a3, fs0, fa5
+; CHECK-NEXT:    bnez a3, .LBB1_7
+; CHECK-NEXT:  # %bb.6:
+; CHECK-NEXT:    mv a1, a2
+; CHECK-NEXT:  .LBB1_7:
+; CHECK-NEXT:    lui a2, 522240
+; CHECK-NEXT:    fabs.s fa5, fs0
+; CHECK-NEXT:    fmv.w.x fa4, a2
+; CHECK-NEXT:    feq.s a2, fa5, fa4
+; CHECK-NEXT:    bnez a2, .LBB1_9
+; CHECK-NEXT:  # %bb.8:
+; CHECK-NEXT:    mv a0, a1
+; CHECK-NEXT:  .LBB1_9:
+; CHECK-NEXT:    feq.s a1, fs0, fs0
+; CHECK-NEXT:    bnez a1, .LBB1_11
+; CHECK-NEXT:  # %bb.10:
+; CHECK-NEXT:    li a0, 126
+; CHECK-NEXT:  .LBB1_11:
+; CHECK-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
+; CHECK-NEXT:    flw fs0, 20(sp) # 4-byte Folded Reload
+; CHECK-NEXT:    addi sp, sp, 32
+; CHECK-NEXT:    ret
+  %r = call i8 @llvm.convert.to.arbitrary.fp(bfloat %x, metadata !"Float8E5M2", metadata !"round.towardzero", i1 false)
+  ret i8 %r
+}
+
+define i8 @bf16_fp8e5m2_nearest_sat(bfloat %x) nounwind {
+; CHECK-LABEL: bf16_fp8e5m2_nearest_sat:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    addi sp, sp, -32
+; CHECK-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; CHECK-NEXT:    fsw fs0, 20(sp) # 4-byte Folded Spill
+; CHECK-NEXT:    fmv.x.w a0, fa0
+; CHECK-NEXT:    slli a0, a0, 16
+; CHECK-NEXT:    fmv.w.x fs0, a0
+; CHECK-NEXT:    mv a0, sp
+; CHECK-NEXT:    fmv.s fa0, fs0
+; CHECK-NEXT:    call frexpf
+; CHECK-NEXT:    fsw fa0, 12(sp)
+; CHECK-NEXT:    fsw fs0, 16(sp)
+; CHECK-NEXT:    lwu a0, 12(sp)
+; CHECK-NEXT:    ld a4, 0(sp)
+; CHECK-NEXT:    slli a3, a0, 41
+; CHECK-NEXT:    srli a3, a3, 41
+; CHECK-NEXT:    slli a1, a0, 44
+; CHECK-NEXT:    snez a1, a1
+; CHECK-NEXT:    bexti a2, a3, 21
+; CHECK-NEXT:    or a1, a1, a2
+; CHECK-NEXT:    srli a0, a0, 20
+; CHECK-NEXT:    and a0, a0, a1
+; CHECK-NEXT:    srli a1, a3, 21
+; CHECK-NEXT:    add a2, a1, a0
+; CHECK-NEXT:    lbu a1, 19(sp)
+; CHECK-NEXT:    slti a0, a2, 4
+; CHECK-NEXT:    xori a5, a0, 1
+; CHECK-NEXT:    add a5, a4, a5
+; CHECK-NEXT:    neg a6, a0
+; CHECK-NEXT:    addi a0, a5, 14
+; CHECK-NEXT:    andi a1, a1, 128
+; CHECK-NEXT:    and a2, a6, a2
+; CHECK-NEXT:    blez a0, .LBB2_2
+; CHECK-NEXT:  # %bb.1:
+; CHECK-NEXT:    slli a3, a0, 2
+; CHECK-NEXT:    or a4, a1, a2
+; CHECK-NEXT:    or a3, a4, a3
+; CHECK-NEXT:    j .LBB2_3
+; CHECK-NEXT:  .LBB2_2:
+; CHECK-NEXT:    li a5, 8
+; CHECK-NEXT:    li a6, 31
+; CHECK-NEXT:    sub a5, a5, a4
+; CHECK-NEXT:    li a4, 1
+; CHECK-NEXT:    minu a5, a5, a6
+; CHECK-NEXT:    maxu a4, a5, a4
+; CHECK-NEXT:    addi a4, a4, -1
+; CHECK-NEXT:    bset a6, zero, a4
+; CHECK-NEXT:    bseti a3, a3, 23
+; CHECK-NEXT:    addi a6, a6, -1
+; CHECK-NEXT:    and a6, a3, a6
+; CHECK-NEXT:    bext a7, a3, a5
+; CHECK-NEXT:    snez a6, a6
+; CHECK-NEXT:    or a6, a6, a7
+; CHECK-NEXT:    srl a4, a3, a4
+; CHECK-NEXT:    seqz a7, a5
+; CHECK-NEXT:    and a4, a4, a6
+; CHECK-NEXT:    addi a7, a7, -1
+; CHECK-NEXT:    and a4, a7, a4
+; CHECK-NEXT:    srl a3, a3, a5
+; CHECK-NEXT:    add a3, a3, a4
+; CHECK-NEXT:    slti a4, a3, 4
+; CHECK-NEXT:    xori a5, a4, 1
+; CHECK-NEXT:    neg a4, a4
+; CHECK-NEXT:    sh2add a5, a5, a1
+; CHECK-NEXT:    and a3, a4, a3
+; CHECK-NEXT:    or a3, a5, a3
+; CHECK-NEXT:  .LBB2_3:
+; CHECK-NEXT:    slti a2, a2, 4
+; CHECK-NEXT:    addi a4, a0, -30
+; CHECK-NEXT:    xori a2, a2, 1
+; CHECK-NEXT:    seqz a4, a4
+; CHECK-NEXT:    slti a0, a0, 31
+; CHECK-NEXT:    and a2, a4, a2
+; CHECK-NEXT:    xori a0, a0, 1
+; CHECK-NEXT:    or a0, a0, a2
+; CHECK-NEXT:    beqz a0, .LBB2_5
+; CHECK-NEXT:  # %bb.4:
+; CHECK-NEXT:    addiw a3, a1, 123
+; CHECK-NEXT:  .LBB2_5:
+; CHECK-NEXT:    fmv.w.x fa5, zero
+; CHECK-NEXT:    feq.s a2, fs0, fa5
+; CHECK-NEXT:    mv a0, a1
+; CHECK-NEXT:    bnez a2, .LBB2_7
+; CHECK-NEXT:  # %bb.6:
+; CHECK-NEXT:    mv a0, a3
+; CHECK-NEXT:  .LBB2_7:
+; CHECK-NEXT:    lui a2, 522240
+; CHECK-NEXT:    fabs.s fa5, fs0
+; CHECK-NEXT:    fmv.w.x fa4, a2
+; CHECK-NEXT:    feq.s a2, fa5, fa4
+; CHECK-NEXT:    beqz a2, .LBB2_9
+; CHECK-NEXT:  # %bb.8:
+; CHECK-NEXT:    addiw a0, a1, 124
+; CHECK-NEXT:  .LBB2_9:
+; CHECK-NEXT:    feq.s a1, fs0, fs0
+; CHECK-NEXT:    bnez a1, .LBB2_11
+; CHECK-NEXT:  # %bb.10:
+; CHECK-NEXT:    li a0, 126
+; CHECK-NEXT:  .LBB2_11:
+; CHECK-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
+; CHECK-NEXT:    flw fs0, 20(sp) # 4-byte Folded Reload
+; CHECK-NEXT:    addi sp, sp, 32
+; CHECK-NEXT:    ret
+  %r = call i8 @llvm.convert.to.arbitrary.fp(bfloat %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 true)
+  ret i8 %r
+}
+
+define i8 @bf16_fp8e5m2_toward_zero_sat(bfloat %x) nounwind {
+; CHECK-LABEL: bf16_fp8e5m2_toward_zero_sat:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    addi sp, sp, -32
+; CHECK-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; CHECK-NEXT:    fsw fs0, 20(sp) # 4-byte Folded Spill
+; CHECK-NEXT:    fmv.x.w a0, fa0
+; CHECK-NEXT:    slli a0, a0, 16
+; CHECK-NEXT:    fmv.w.x fs0, a0
+; CHECK-NEXT:    mv a0, sp
+; CHECK-NEXT:    fmv.s fa0, fs0
+; CHECK-NEXT:    call frexpf
+; CHECK-NEXT:    fsw fa0, 12(sp)
+; CHECK-NEXT:    fsw fs0, 16(sp)
+; CHECK-NEXT:    lw a0, 12(sp)
+; CHECK-NEXT:    slli a0, a0, 41
+; CHECK-NEXT:    ld a4, 0(sp)
+; CHECK-NEXT:    srli a2, a0, 41
+; CHECK-NEXT:    srli a3, a2, 21
+; CHECK-NEXT:    lbu a1, 19(sp)
+; CHECK-NEXT:    slti a0, a3, 4
+; CHECK-NEXT:    xori a5, a0, 1
+; CHECK-NEXT:    add a5, a4, a5
+; CHECK-NEXT:    neg a6, a0
+; CHECK-NEXT:    addi a0, a5, 14
+; CHECK-NEXT:    andi a1, a1, 128
+; CHECK-NEXT:    and a3, a6, a3
+; CHECK-NEXT:    blez a0, .LBB3_2
+; CHECK-NEXT:  # %bb.1:
+; CHECK-NEXT:    slli a2, a0, 2
+; CHECK-NEXT:    or a4, a1, a3
+; CHECK-NEXT:    or a2, a4, a2
+; CHECK-NEXT:    j .LBB3_3
+; CHECK-NEXT:  .LBB3_2:
+; CHECK-NEXT:    li a5, 8
+; CHECK-NEXT:    sub a5, a5, a4
+; CHECK-NEXT:    li a4, 31
+; CHECK-NEXT:    minu a4, a5, a4
+; CHECK-NEXT:    bseti a2, a2, 23
+; CHECK-NEXT:    srl a2, a2, a4
+; CHECK-NEXT:    slti a4, a2, 4
+; CHECK-NEXT:    xori a5, a4, 1
+; CHECK-NEXT:    neg a4, a4
+; CHECK-NEXT:    sh2add a5, a5, a1
+; CHECK-NEXT:    and a2, a4, a2
+; CHECK-NEXT:    or a2, a5, a2
+; CHECK-NEXT:  .LBB3_3:
+; CHECK-NEXT:    slti a3, a3, 4
+; CHECK-NEXT:    addi a4, a0, -30
+; CHECK-NEXT:    xori a3, a3, 1
+; CHECK-NEXT:    seqz a4, a4
+; CHECK-NEXT:    slti a0, a0, 31
+; CHECK-NEXT:    and a3, a4, a3
+; CHECK-NEXT:    xori a0, a0, 1
+; CHECK-NEXT:    or a0, a0, a3
+; CHECK-NEXT:    beqz a0, .LBB3_5
+; CHECK-NEXT:  # %bb.4:
+; CHECK-NEXT:    addiw a2, a1, 123
+; CHECK-NEXT:  .LBB3_5:
+; CHECK-NEXT:    fmv.w.x fa5, zero
+; CHECK-NEXT:    feq.s a3, fs0, fa5
+; CHECK-NEXT:    mv a0, a1
+; CHECK-NEXT:    bnez a3, .LBB3_7
+; CHECK-NEXT:  # %bb.6:
+; CHECK-NEXT:    mv a0, a2
+; CHECK-NEXT:  .LBB3_7:
+; CHECK-NEXT:    lui a2, 522240
+; CHECK-NEXT:    fabs.s fa5, fs0
+; CHECK-NEXT:    fmv.w.x fa4, a2
+; CHECK-NEXT:    feq.s a2, fa5, fa4
+; CHECK-NEXT:    beqz a2, .LBB3_9
+; CHECK-NEXT:  # %bb.8:
+; CHECK-NEXT:    addiw a0, a1, 124
+; CHECK-NEXT:  .LBB3_9:
+; CHECK-NEXT:    feq.s a1, fs0, fs0
+; CHECK-NEXT:    bnez a1, .LBB3_11
+; CHECK-NEXT:  # %bb.10:
+; CHECK-NEXT:    li a0, 126
+; CHECK-NEXT:  .LBB3_11:
+; CHECK-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
+; CHECK-NEXT:    flw fs0, 20(sp) # 4-byte Folded Reload
+; CHECK-NEXT:    addi sp, sp, 32
+; CHECK-NEXT:    ret
+  %r = call i8 @llvm.convert.to.arbitrary.fp(bfloat %x, metadata !"Float8E5M2", metadata !"round.towardzero", i1 true)
+  ret i8 %r
+}
+
+define i8 @f32_fp8e5m2_nearest(float %x) nounwind {
+; CHECK-LABEL: f32_fp8e5m2_nearest:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    addi sp, sp, -32
+; CHECK-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; CHECK-NEXT:    fsw fs0, 20(sp) # 4-byte Folded Spill
+; CHECK-NEXT:    fmv.s fs0, fa0
+; CHECK-NEXT:    mv a0, sp
+; CHECK-NEXT:    call frexpf
+; CHECK-NEXT:    fsw fa0, 12(sp)
+; CHECK-NEXT:    fsw fs0, 16(sp)
+; CHECK-NEXT:    lwu a0, 12(sp)
+; CHECK-NEXT:    ld a4, 0(sp)
+; CHECK-NEXT:    slli a3, a0, 41
+; CHECK-NEXT:    srli a3, a3, 41
+; CHECK-NEXT:    slli a1, a0, 44
+; CHECK-NEXT:    snez a1, a1
+; CHECK-NEXT:    bexti a2, a3, 21
+; CHECK-NEXT:    or a1, a1, a2
+; CHECK-NEXT:    srli a0, a0, 20
+; CHECK-NEXT:    and a0, a0, a1
+; CHECK-NEXT:    srli a1, a3, 21
+; CHECK-NEXT:    add a2, a1, a0
+; CHECK-NEXT:    lbu a1, 19(sp)
+; CHECK-NEXT:    slti a0, a2, 4
+; CHECK-NEXT:    xori a5, a0, 1
+; CHECK-NEXT:    add a5, a4, a5
+; CHECK-NEXT:    neg a6, a0
+; CHECK-NEXT:    addi a0, a5, 14
+; CHECK-NEXT:    andi a1, a1, 128
+; CHECK-NEXT:    and a2, a6, a2
+; CHECK-NEXT:    blez a0, .LBB4_2
----------------
MrSidims wrote:

This looks wrong.

we had:
```
mv a0, sp
call frexpf
...
ld a4, 0(sp)
...
```
aka in 8 bytes frexpr wrote only 4, but 'trash' bytes are used in the arithmetic. 

https://github.com/llvm/llvm-project/pull/221358


More information about the llvm-commits mailing list