[llvm] [RISCV][GlobalIsel] Remove redundant sext.w for ADDIW (PR #159597)

Shaoce SUN via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 18 09:29:01 PDT 2025


================
@@ -147,6 +147,11 @@ def : Pat<(i32 (trunc GPR:$src)), (COPY GPR:$src)>;
 def : Pat<(zext_is_sext (i32 GPR:$src)), (ADDIW GPR:$src, 0)>;
 }
 
+let Predicates = [IsRV64, NoStdExtF] in {
----------------
sunshaoce wrote:

Without this will cause `llvm/test/CodeGen/RISCV/GlobalISel/double-convert.ll` to generate an extra `addiw`.

Before:
```llvm
define signext i32 @fcvt_d_w_demanded_bits(i32 signext %0, ptr %1) nounwind {
; RV64IFD-LABEL: fcvt_d_w_demanded_bits:
; RV64IFD:       # %bb.0:
; RV64IFD-NEXT:    addiw a0, a0, 1
; RV64IFD-NEXT:    fcvt.d.w fa5, a0
; RV64IFD-NEXT:    fsd fa5, 0(a1)
; RV64IFD-NEXT:    ret
  %3 = add i32 %0, 1
  %4 = sitofp i32 %3 to double
  store double %4, ptr %1, align 8
  ret i32 %3
}
```

After:
```llvm
define signext i32 @fcvt_d_w_demanded_bits(i32 signext %0, ptr %1) nounwind {
; RV64IFD-LABEL: fcvt_d_w_demanded_bits:
; RV64IFD:       # %bb.0:
; RV64IFD-NEXT:    addi a2, a0, 1
; RV64IFD-NEXT:    addiw a0, a0, 1
; RV64IFD-NEXT:    fcvt.d.w fa5, a2
; RV64IFD-NEXT:    fsd fa5, 0(a1)
; RV64IFD-NEXT:    ret
  %3 = add i32 %0, 1
  %4 = sitofp i32 %3 to double
  store double %4, ptr %1, align 8
  ret i32 %3
}
```

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


More information about the llvm-commits mailing list