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