[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