[PATCH] D25991: [PPC] Peephole to remove extra fcmp that checks for NaN

Nemanja Ivanovic via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 27 00:35:47 PDT 2016


nemanjai added inline comments.


================
Comment at: lib/Target/PowerPC/PPCInstrInfo.cpp:1567
+  MachineRegisterInfo::use_iterator Op = MRI->use_begin(CRReg);
+  unsigned sub = Op->getSubReg();
+  if (sub != PPC::sub_un)
----------------
s/sub/Sub?


================
Comment at: lib/Target/PowerPC/PPCInstrInfo.cpp:1585
+  unsigned otherReg =
+    (CROp->getOperand(1).getReg() == CopyReg ?
+                                     CROp->getOperand(2).getReg() :
----------------
amehsan wrote:
> hfinkel wrote:
> > amehsan wrote:
> > > hfinkel wrote:
> > > > What is the conditional here on CopyReg actually testing. How could it be zero (i.e. an invalid register) if hasOneUse(CopyReg) was true?
> > > The CROp has two source operands (Operands 1 and 2). If Operand(1) is the same Reg that was defined by Copy insn we just visited (CopyReg), then we look at Operand (2) and go to its definition. Otherwise, Operand(2) will be CopyReg and we should start from Operand(1) and go to its definition, etc. 
> > I still don't understand. CopyReg is defined above as:
> > 
> >   unsigned CopyReg = CopyMI->getOperand(0).getReg();
> >   if (!MRI->hasOneUse(CopyReg))
> >     return false;
> > 
> > under what conditions is CopyReg zero (i.e. an invalid register)?
> > 
> I am probably missing something. CopyReg is the register that contains the output of COPY instruction. It should not be zero.  Maybe there are edge cases that I am not aware of ?
But the condition is not for whether CopyReg is zero but rather whether it is the same register as the first operand of the CROR/CRNOR.


================
Comment at: lib/Target/PowerPC/PPCInstrInfo.cpp:1589
+
+  auto *MI = MRI->getUniqueVRegDef(otherReg);
+  if (MI->getOpcode() != PPC::COPY)
----------------
I haven't thought about this enough to decipher whether this is possible so I'd rather ask...
Are all of these `getUniqueVRegDef` calls guaranteed to succeed? Namely, is it impossible that any of the arguments are physical registers at this point?


================
Comment at: lib/Target/PowerPC/PPCInstrInfo.cpp:1619
   // comparison with zero.
   if (OpC == PPC::FCMPUS || OpC == PPC::FCMPUD)
+    return optimizeFPCmpInstr(CmpInstr, SrcReg, SrcReg2, Mask, Value, MRI);
----------------
This may be a naive question since I don't really know under which conditions we emit XSCMPUDP vs. FCMPUD, but can this not be done with XSCMPUDP as well? Or perhaps there is no need for this.


https://reviews.llvm.org/D25991





More information about the llvm-commits mailing list