Use the "isCompare" machine instruction attribute instead of calling the
authorBill Wendling <isanbard@gmail.com>
Sun, 8 Aug 2010 05:04:59 +0000 (05:04 +0000)
committerBill Wendling <isanbard@gmail.com>
Sun, 8 Aug 2010 05:04:59 +0000 (05:04 +0000)
relatively expensive comparison analyzer on each instruction. Also rename the
comparison analyzer method to something more in line with what it actually does.

This pass is will eventually be folded into the Machine CSE pass.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110539 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetInstrInfo.h
lib/CodeGen/OptimizeCmps.cpp
lib/Target/ARM/ARMBaseInstrInfo.cpp
lib/Target/ARM/ARMBaseInstrInfo.h
lib/Target/ARM/ARMInstrThumb2.td

index 1c6ac1a61c772e9f422d764675aa812d59d65436..520c41be742883df074acc2bb09431ecf129f48b 100644 (file)
@@ -577,17 +577,17 @@ public:
   virtual ScheduleHazardRecognizer*
   CreateTargetPostRAHazardRecognizer(const InstrItineraryData&) const = 0;
 
-  /// isCompareInstr - If the machine instruction is a comparison instruction,
-  /// then return true. Also return the source register in SrcReg and the value
-  /// it compares against in CmpValue.
-  virtual bool isCompareInstr(const MachineInstr *MI,
+  /// AnalyzeCompare - For a comparison instruction, return the source register
+  /// in SrcReg and the value it compares against in CmpValue. Return true if
+  /// the comparison instruction can be analyzed.
+  virtual bool AnalyzeCompare(const MachineInstr *MI,
                               unsigned &SrcReg, int &CmpValue) const {
     return false;
   }
 
-  /// convertToSetZeroFlag - Convert the instruction to set the zero flag so
+  /// ConvertToSetZeroFlag - Convert the instruction to set the zero flag so
   /// that we can remove a "comparison with zero".
-  virtual bool convertToSetZeroFlag(MachineInstr *Instr,
+  virtual bool ConvertToSetZeroFlag(MachineInstr *Instr,
                                     MachineInstr *CmpInstr) const {
     return false;
   }
index 5b524cd6414d506750001538ff2bce566886f8a7..209c8b9504720b54807cfa5b9dc2daccada0d0b8 100644 (file)
@@ -72,9 +72,8 @@ bool OptimizeCmps::OptimizeCmpInstr(MachineInstr *MI, MachineBasicBlock *MBB) {
   // physical register, we can try to optimize it.
   unsigned SrcReg;
   int CmpValue;
-  if (!TII->isCompareInstr(MI, SrcReg, CmpValue) ||
-      TargetRegisterInfo::isPhysicalRegister(SrcReg) ||
-      CmpValue != 0)
+  if (!TII->AnalyzeCompare(MI, SrcReg, CmpValue) ||
+      TargetRegisterInfo::isPhysicalRegister(SrcReg) || CmpValue != 0)
     return false;
 
   MachineRegisterInfo::def_iterator DI = MRI->def_begin(SrcReg);
@@ -83,7 +82,7 @@ bool OptimizeCmps::OptimizeCmpInstr(MachineInstr *MI, MachineBasicBlock *MBB) {
     return false;
 
   // Attempt to convert the defining instruction to set the "zero" flag.
-  if (TII->convertToSetZeroFlag(&*DI, MI)) {
+  if (TII->ConvertToSetZeroFlag(&*DI, MI)) {
     ++NumEliminated;
     return true;
   }
@@ -104,7 +103,8 @@ bool OptimizeCmps::runOnMachineFunction(MachineFunction &MF) {
     for (MachineBasicBlock::iterator
            MII = MBB->begin(), ME = MBB->end(); MII != ME; ) {
       MachineInstr *MI = &*MII++;
-      Changed |= OptimizeCmpInstr(MI, MBB);
+      if (MI->getDesc().isCompare())
+        Changed |= OptimizeCmpInstr(MI, MBB);
     }
   }
 
index 68e35ed75e37f244d8949b9db61fc1413829467d..7e1c84e1a67cd9a839a7477dbb18d04a94809342 100644 (file)
@@ -1355,7 +1355,7 @@ bool llvm::rewriteARMFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
 }
 
 bool ARMBaseInstrInfo::
-isCompareInstr(const MachineInstr *MI, unsigned &SrcReg, int &CmpValue) const {
+AnalyzeCompare(const MachineInstr *MI, unsigned &SrcReg, int &CmpValue) const {
   switch (MI->getOpcode()) {
   default: break;
   case ARM::t2CMPri:
@@ -1368,10 +1368,10 @@ isCompareInstr(const MachineInstr *MI, unsigned &SrcReg, int &CmpValue) const {
   return false;
 }
 
-/// convertToSetZeroFlag - Convert the instruction to set the "zero" flag so
+/// ConvertToSetZeroFlag - Convert the instruction to set the "zero" flag so
 /// that we can remove a "comparison with zero".
 bool ARMBaseInstrInfo::
-convertToSetZeroFlag(MachineInstr *MI, MachineInstr *CmpInstr) const {
+ConvertToSetZeroFlag(MachineInstr *MI, MachineInstr *CmpInstr) const {
   // Conservatively refuse to convert an instruction which isn't in the same BB
   // as the comparison.
   if (MI->getParent() != CmpInstr->getParent())
index 4f1c4539243136ee6cf411ab295b85a4f0e2a784..2547ad1c22df203d9d018e8b2fa9425372be280a 100644 (file)
@@ -337,15 +337,15 @@ public:
     return NumInstrs && NumInstrs == 1;
   }
 
-  /// isCompareInstr - If the machine instruction is a comparison instruction,
-  /// then return true. Also return the source register in SrcReg and the value
-  /// it compares against in CmpValue.
-  virtual bool isCompareInstr(const MachineInstr *MI, unsigned &SrcReg,
+  /// AnalyzeCompare - For a comparison instruction, return the source register
+  /// in SrcReg and the value it compares against in CmpValue. Return true if
+  /// the comparison instruction can be analyzed.
+  virtual bool AnalyzeCompare(const MachineInstr *MI, unsigned &SrcReg,
                               int &CmpValue) const;
 
-  /// convertToSetZeroFlag - Convert the instruction to set the zero flag so
+  /// ConvertToSetZeroFlag - Convert the instruction to set the zero flag so
   /// that we can remove a "comparison with zero".
-  virtual bool convertToSetZeroFlag(MachineInstr *Instr,
+  virtual bool ConvertToSetZeroFlag(MachineInstr *Instr,
                                     MachineInstr *CmpInstr) const;
 };
 
index 4ec71c46e135db58d871ccce291a68720ae83377..a73aefcacdef57764e660ea0bf6322d7e8cbd81a 100644 (file)
@@ -2155,11 +2155,12 @@ def : T2Pat<(or (and rGPR:$src1, 0xFFFF0000),
 //===----------------------------------------------------------------------===//
 //  Comparison Instructions...
 //
-
+let isCompare = 1 in {
 defm t2CMP  : T2I_cmp_irs<0b1101, "cmp",
                           BinOpFrag<(ARMcmp node:$LHS, node:$RHS)>>;
 defm t2CMPz : T2I_cmp_irs<0b1101, "cmp",
                           BinOpFrag<(ARMcmpZ node:$LHS, node:$RHS)>>;
+}
 
 //FIXME: Disable CMN, as CCodes are backwards from compare expectations
 //       Compare-to-zero still works out, just not the relationals