Skip to content

Commit 157b3cb

Browse files
committed
[RISCV] Fold vfmv.f.s into load from stack
This is the f64/f32 version of llvm#109774. I've left out f16 and bf16 for now because there's a separate issue where we can't select extract_vector_elt when f16/bf16 is a legal type, see llvm#110126.
1 parent 44c90eb commit 157b3cb

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,26 @@ MachineInstr *RISCVInstrInfo::foldMemoryOperandImpl(
784784
}
785785
break;
786786
}
787+
if (RISCV::getRVVMCOpcode(MI.getOpcode()) == RISCV::VFMV_F_S) {
788+
unsigned Log2SEW =
789+
MI.getOperand(RISCVII::getSEWOpNum(MI.getDesc())).getImm();
790+
if (STI.getXLen() < (1 << Log2SEW))
791+
return nullptr;
792+
switch (Log2SEW) {
793+
case 4:
794+
// TODO: Support f16/bf16
795+
return nullptr;
796+
case 5:
797+
LoadOpc = RISCV::FLW;
798+
break;
799+
case 6:
800+
LoadOpc = RISCV::FLD;
801+
break;
802+
default:
803+
llvm_unreachable("Unexpected SEW");
804+
}
805+
break;
806+
}
787807
return nullptr;
788808
case RISCV::SEXT_H:
789809
LoadOpc = RISCV::LH;

llvm/test/CodeGen/RISCV/rvv/stack-folding.ll

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,7 @@ define double @f64(<vscale x 1 x double> %v, i1 %c) {
206206
; RV64-NEXT: #NO_APP
207207
; RV64-NEXT: beqz a0, .LBB4_2
208208
; RV64-NEXT: # %bb.1: # %truebb
209-
; RV64-NEXT: addi a0, sp, 16
210-
; RV64-NEXT: vl1r.v v8, (a0) # Unknown-size Folded Reload
211-
; RV64-NEXT: vsetivli zero, 1, e64, m1, ta, ma
212-
; RV64-NEXT: vfmv.f.s fa0, v8
209+
; RV64-NEXT: fld fa0, 16(sp) # 8-byte Folded Reload
213210
; RV64-NEXT: j .LBB4_3
214211
; RV64-NEXT: .LBB4_2: # %falsebb
215212
; RV64-NEXT: fmv.d.x fa0, zero
@@ -244,10 +241,7 @@ define float @f32(<vscale x 2 x float> %v, i1 %c) {
244241
; CHECK-NEXT: #NO_APP
245242
; CHECK-NEXT: beqz a0, .LBB5_2
246243
; CHECK-NEXT: # %bb.1: # %truebb
247-
; CHECK-NEXT: addi a0, sp, 16
248-
; CHECK-NEXT: vl1r.v v8, (a0) # Unknown-size Folded Reload
249-
; CHECK-NEXT: vsetivli zero, 1, e32, m1, ta, ma
250-
; CHECK-NEXT: vfmv.f.s fa0, v8
244+
; CHECK-NEXT: flw fa0, 16(sp) # 8-byte Folded Reload
251245
; CHECK-NEXT: j .LBB5_3
252246
; CHECK-NEXT: .LBB5_2: # %falsebb
253247
; CHECK-NEXT: fmv.w.x fa0, zero

0 commit comments

Comments
 (0)