Skip to content

Commit b19c5df

Browse files
committed
[RISCV] Rematerialize vfmv.v.f
This is the same principle as vmv.v.x in llvm#107993, but for floats. Program regalloc.NumSpills regalloc.NumReloads regalloc.NumRemats lhs rhs diff lhs rhs diff lhs rhs diff 519.lbm_r 73.00 73.00 0.0% 75.00 75.00 0.0% 1.00 1.00 0.0% 544.nab_r 753.00 753.00 0.0% 1183.00 1183.00 0.0% 318.00 318.00 0.0% 619.lbm_s 68.00 68.00 0.0% 70.00 70.00 0.0% 1.00 1.00 0.0% 644.nab_s 753.00 753.00 0.0% 1183.00 1183.00 0.0% 318.00 318.00 0.0% 508.namd_r 6598.00 6597.00 -0.0% 15509.00 15503.00 -0.0% 2387.00 2393.00 0.3% 526.blender_r 13105.00 13084.00 -0.2% 26478.00 26443.00 -0.1% 18991.00 18996.00 0.0% 510.parest_r 42740.00 42665.00 -0.2% 82400.00 82309.00 -0.1% 5612.00 5648.00 0.6% 511.povray_r 1937.00 1929.00 -0.4% 3629.00 3620.00 -0.2% 517.00 525.00 1.5% 538.imagick_r 4181.00 4150.00 -0.7% 11342.00 11125.00 -1.9% 3366.00 3366.00 0.0% 638.imagick_s 4181.00 4150.00 -0.7% 11342.00 11125.00 -1.9% 3366.00 3366.00 0.0% Geomean difference -0.2% -0.4% 0.2%
1 parent f31cc90 commit b19c5df

File tree

3 files changed

+49
-29
lines changed

3 files changed

+49
-29
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ bool RISCVInstrInfo::isReallyTriviallyReMaterializable(
170170
const MachineInstr &MI) const {
171171
switch (RISCV::getRVVMCOpcode(MI.getOpcode())) {
172172
case RISCV::VMV_V_X:
173+
case RISCV::VFMV_V_F:
173174
case RISCV::VMV_V_I:
174175
case RISCV::VID_V:
175176
if (MI.getOperand(1).isUndef() &&

llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6558,6 +6558,7 @@ defm PseudoVFMERGE : VPseudoVMRG_FM;
65586558
//===----------------------------------------------------------------------===//
65596559
// 13.16. Vector Floating-Point Move Instruction
65606560
//===----------------------------------------------------------------------===//
6561+
let isReMaterializable = 1 in
65616562
defm PseudoVFMV_V : VPseudoVMV_F;
65626563

65636564
//===----------------------------------------------------------------------===//

llvm/test/CodeGen/RISCV/rvv/remat.ll

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -314,35 +314,53 @@ define void @vmv.v.x_live(ptr %p, i64 %x) {
314314
}
315315

316316
define void @vfmv.v.f(ptr %p, double %x) {
317-
; CHECK-LABEL: vfmv.v.f:
318-
; CHECK: # %bb.0:
319-
; CHECK-NEXT: addi sp, sp, -16
320-
; CHECK-NEXT: .cfi_def_cfa_offset 16
321-
; CHECK-NEXT: csrr a1, vlenb
322-
; CHECK-NEXT: slli a1, a1, 3
323-
; CHECK-NEXT: sub sp, sp, a1
324-
; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
325-
; CHECK-NEXT: vsetvli a1, zero, e64, m8, ta, ma
326-
; CHECK-NEXT: vfmv.v.f v8, fa0
327-
; CHECK-NEXT: vs8r.v v8, (a0)
328-
; CHECK-NEXT: vl8re64.v v16, (a0)
329-
; CHECK-NEXT: addi a1, sp, 16
330-
; CHECK-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
331-
; CHECK-NEXT: vl8re64.v v24, (a0)
332-
; CHECK-NEXT: vl8re64.v v0, (a0)
333-
; CHECK-NEXT: vl8re64.v v16, (a0)
334-
; CHECK-NEXT: vs8r.v v16, (a0)
335-
; CHECK-NEXT: vs8r.v v0, (a0)
336-
; CHECK-NEXT: vs8r.v v24, (a0)
337-
; CHECK-NEXT: vl8r.v v16, (a1) # Unknown-size Folded Reload
338-
; CHECK-NEXT: vs8r.v v16, (a0)
339-
; CHECK-NEXT: vs8r.v v8, (a0)
340-
; CHECK-NEXT: fsd fa0, 0(a0)
341-
; CHECK-NEXT: csrr a0, vlenb
342-
; CHECK-NEXT: slli a0, a0, 3
343-
; CHECK-NEXT: add sp, sp, a0
344-
; CHECK-NEXT: addi sp, sp, 16
345-
; CHECK-NEXT: ret
317+
; POSTRA-LABEL: vfmv.v.f:
318+
; POSTRA: # %bb.0:
319+
; POSTRA-NEXT: vsetvli a1, zero, e64, m8, ta, ma
320+
; POSTRA-NEXT: vfmv.v.f v8, fa0
321+
; POSTRA-NEXT: vs8r.v v8, (a0)
322+
; POSTRA-NEXT: vl8re64.v v16, (a0)
323+
; POSTRA-NEXT: vl8re64.v v24, (a0)
324+
; POSTRA-NEXT: vl8re64.v v0, (a0)
325+
; POSTRA-NEXT: vl8re64.v v8, (a0)
326+
; POSTRA-NEXT: vs8r.v v8, (a0)
327+
; POSTRA-NEXT: vs8r.v v0, (a0)
328+
; POSTRA-NEXT: vs8r.v v24, (a0)
329+
; POSTRA-NEXT: vs8r.v v16, (a0)
330+
; POSTRA-NEXT: vfmv.v.f v8, fa0
331+
; POSTRA-NEXT: vs8r.v v8, (a0)
332+
; POSTRA-NEXT: fsd fa0, 0(a0)
333+
; POSTRA-NEXT: ret
334+
;
335+
; PRERA-LABEL: vfmv.v.f:
336+
; PRERA: # %bb.0:
337+
; PRERA-NEXT: addi sp, sp, -16
338+
; PRERA-NEXT: .cfi_def_cfa_offset 16
339+
; PRERA-NEXT: csrr a1, vlenb
340+
; PRERA-NEXT: slli a1, a1, 3
341+
; PRERA-NEXT: sub sp, sp, a1
342+
; PRERA-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
343+
; PRERA-NEXT: vsetvli a1, zero, e64, m8, ta, ma
344+
; PRERA-NEXT: vfmv.v.f v8, fa0
345+
; PRERA-NEXT: vs8r.v v8, (a0)
346+
; PRERA-NEXT: vl8re64.v v16, (a0)
347+
; PRERA-NEXT: addi a1, sp, 16
348+
; PRERA-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill
349+
; PRERA-NEXT: vl8re64.v v24, (a0)
350+
; PRERA-NEXT: vl8re64.v v0, (a0)
351+
; PRERA-NEXT: vl8re64.v v16, (a0)
352+
; PRERA-NEXT: vs8r.v v16, (a0)
353+
; PRERA-NEXT: vs8r.v v0, (a0)
354+
; PRERA-NEXT: vs8r.v v24, (a0)
355+
; PRERA-NEXT: vl8r.v v16, (a1) # Unknown-size Folded Reload
356+
; PRERA-NEXT: vs8r.v v16, (a0)
357+
; PRERA-NEXT: vs8r.v v8, (a0)
358+
; PRERA-NEXT: fsd fa0, 0(a0)
359+
; PRERA-NEXT: csrr a0, vlenb
360+
; PRERA-NEXT: slli a0, a0, 3
361+
; PRERA-NEXT: add sp, sp, a0
362+
; PRERA-NEXT: addi sp, sp, 16
363+
; PRERA-NEXT: ret
346364
%vfmv.v.f = call <vscale x 8 x double> @llvm.riscv.vfmv.v.f.nxv8f64(<vscale x 8 x double> poison, double %x, i64 -1)
347365
store volatile <vscale x 8 x double> %vfmv.v.f, ptr %p
348366

0 commit comments

Comments
 (0)