Skip to content

Commit 9b25edd

Browse files
committed
[RISCV][GISel] Fold G_FCONSTANT 0.0 store into sw x0
1 parent 9225aa9 commit 9b25edd

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,19 @@ void RISCVInstructionSelector::preISelLower(MachineInstr &MI,
10491049
MRI->setType(DstReg, sXLen);
10501050
break;
10511051
}
1052+
case TargetOpcode::G_STORE: {
1053+
Register SrcReg = MI.getOperand(0).getReg();
1054+
MachineInstr *Def = MRI->getVRegDef(SrcReg);
1055+
if (Def && Def->getOpcode() == TargetOpcode::G_FCONSTANT) {
1056+
if (Def->getOperand(1).getFPImm()->getValueAPF().isPosZero()) {
1057+
MI.getOperand(0).setReg(RISCV::X0);
1058+
1059+
if (MRI->use_nodbg_empty(SrcReg))
1060+
Def->eraseFromParent();
1061+
}
1062+
}
1063+
break;
1064+
}
10521065
}
10531066
}
10541067

llvm/test/CodeGen/RISCV/GlobalISel/store-fp-zero-to-x0.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@
77
define void @zero_f32(ptr %i) {
88
; RV32-LABEL: zero_f32:
99
; RV32: # %bb.0: # %entry
10-
; RV32-NEXT: fmv.w.x fa5, zero
11-
; RV32-NEXT: fsw fa5, 0(a0)
10+
; RV32-NEXT: sw zero, 0(a0)
1211
; RV32-NEXT: ret
1312
;
1413
; RV64-LABEL: zero_f32:
1514
; RV64: # %bb.0: # %entry
16-
; RV64-NEXT: fmv.w.x fa5, zero
17-
; RV64-NEXT: fsw fa5, 0(a0)
15+
; RV64-NEXT: sw zero, 0(a0)
1816
; RV64-NEXT: ret
1917
entry:
2018
store float 0.000000e+00, ptr %i, align 4
@@ -35,8 +33,7 @@ define void @zero_f64(ptr %i) {
3533
;
3634
; RV64-LABEL: zero_f64:
3735
; RV64: # %bb.0: # %entry
38-
; RV64-NEXT: fmv.d.x fa5, zero
39-
; RV64-NEXT: fsd fa5, 0(a0)
36+
; RV64-NEXT: sd zero, 0(a0)
4037
; RV64-NEXT: ret
4138
entry:
4239
store double 0.000000e+00, ptr %i, align 8

0 commit comments

Comments
 (0)