2727#include " llvm/CodeGen/MachineDominators.h"
2828#include " llvm/CodeGen/MachineFunctionPass.h"
2929#include " llvm/CodeGen/TargetPassConfig.h"
30+ #include " llvm/Support/FormatVariadic.h"
3031
3132#define GET_GICOMBINER_DEPS
3233#include " RISCVGenPostLegalizeGICombiner.inc"
@@ -42,6 +43,56 @@ namespace {
4243#include " RISCVGenPostLegalizeGICombiner.inc"
4344#undef GET_GICOMBINER_TYPES
4445
46+ // / Match: G_STORE (G_FCONSTANT +0.0), addr
47+ // / Return the source vreg in MatchInfo if matched.
48+ bool matchFoldFPZeroStore (MachineInstr &MI, MachineRegisterInfo &MRI,
49+ const RISCVSubtarget &STI, Register &MatchInfo) {
50+ if (MI.getOpcode () != TargetOpcode::G_STORE)
51+ return false ;
52+
53+ Register SrcReg = MI.getOperand (0 ).getReg ();
54+ if (!SrcReg.isVirtual ())
55+ return false ;
56+
57+ MachineInstr *Def = MRI.getVRegDef (SrcReg);
58+ if (!Def || Def->getOpcode () != TargetOpcode::G_FCONSTANT)
59+ return false ;
60+
61+ auto *CFP = Def->getOperand (1 ).getFPImm ();
62+ if (!CFP || !CFP->getValueAPF ().isPosZero ())
63+ return false ;
64+
65+ unsigned ValBits = MRI.getType (SrcReg).getSizeInBits ();
66+ if ((ValBits == 16 && !STI.hasStdExtZfh ()) ||
67+ (ValBits == 32 && !STI.hasStdExtF ()) ||
68+ (ValBits == 64 && (!STI.hasStdExtD () || !STI.is64Bit ())))
69+ return false ;
70+
71+ MatchInfo = SrcReg;
72+ return true ;
73+ }
74+
75+ // / Apply: rewrite to G_STORE (G_CONSTANT 0 [XLEN]), addr
76+ void applyFoldFPZeroStore (MachineInstr &MI, MachineRegisterInfo &MRI,
77+ MachineIRBuilder &B, const RISCVSubtarget &STI,
78+ Register &MatchInfo) {
79+ const unsigned XLen = STI.getXLen ();
80+
81+ auto Zero = B.buildConstant (LLT::scalar (XLen), 0 );
82+ MI.getOperand (0 ).setReg (Zero.getReg (0 ));
83+
84+ MachineInstr *Def = MRI.getVRegDef (MatchInfo);
85+ if (Def && MRI.use_nodbg_empty (MatchInfo))
86+ Def->eraseFromParent ();
87+
88+ #ifndef NDEBUG
89+ unsigned ValBits = MRI.getType (MatchInfo).getSizeInBits ();
90+ LLVM_DEBUG (dbgs () << formatv (" [{0}] Fold FP zero store -> int zero "
91+ " (XLEN={1}, ValBits={2}):\n {3}\n " ,
92+ DEBUG_TYPE, XLen, ValBits, MI));
93+ #endif
94+ }
95+
4596class RISCVPostLegalizerCombinerImpl : public Combiner {
4697protected:
4798 const CombinerHelper Helper;
0 commit comments