[llvm] [RISCV]: Implemented softening of `FCANONICALIZE` (PR #169234)

Kevin Per via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 28 05:29:15 PST 2025


================
@@ -10,6 +11,42 @@ declare float @llvm.fcanonicalize.f32(float)
 declare double @llvm.fcanonicalize.f64(double)
 
 define half @fcanonicalize_f16(half %x) {
+; RV64-SOFT-LABEL: fcanonicalize_f16:
+; RV64-SOFT:       # %bb.0:
+; RV64-SOFT-NEXT:    addi sp, sp, -16
+; RV64-SOFT-NEXT:    .cfi_def_cfa_offset 16
+; RV64-SOFT-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
+; RV64-SOFT-NEXT:    .cfi_offset ra, -8
+; RV64-SOFT-NEXT:    slli a0, a0, 48
+; RV64-SOFT-NEXT:    srli a0, a0, 48
+; RV64-SOFT-NEXT:    call __extendhfsf2
----------------
kper wrote:

```
from z3 import *

f16 = FP('f16', Float16())
val1 = FPVal(1.0, Float32())

def extend(rm, var):
  return fpFPToFP(rm, var, Float32())

def trunc(rm, var):
  return fpFPToFP(rm, var, Float16())

def src(rm):
  return trunc(rm, fpMul(rm, extend(rm, f16), val1))

def prove(f):
  s = Solver()
  s.add(Not(f))
  if s.check() == unsat:
    print("proved")
  else:
    print("failed to prove")

tgt = f16
prove(src(RTZ()) == tgt)
prove(src(RTN()) == tgt)
prove(src(RTP()) == tgt)
prove(src(RNE()) == tgt)
prove(src(RNA()) == tgt)
```

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


More information about the llvm-commits mailing list