Add TargetInstrInfo::isMoveInstr() to support coalescing in register
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Sun, 28 Dec 2003 17:35:08 +0000 (17:35 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Sun, 28 Dec 2003 17:35:08 +0000 (17:35 +0000)
allocation.

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

include/llvm/Target/TargetInstrInfo.h
lib/Target/X86/X86InstrInfo.cpp
lib/Target/X86/X86InstrInfo.h

index c6afba5a15624ddb3cc9dd4cb9e7cd2a65a20198..e36c89fd59611f1241f410af7a6cc2c03d86660d 100644 (file)
@@ -214,6 +214,16 @@ public:
     return get(Opcode).Flags & M_TERMINATOR_FLAG;
   }
 
+  //
+  // Return true if the instruction is a register to register move and
+  // leave the source and dest operands in the passed parameters.
+  //
+  virtual bool isMoveInstr(const MachineInstr& MI,
+                           unsigned& sourceReg,
+                           unsigned& destReg) const {
+    return false;
+  }
+
   // Check if an instruction can be issued before its operands are ready,
   // or if a subsequent instruction that uses its result can be issued
   // before the results are ready.
index 681bf023d990f4c3f1a107f36c3f065db353ab7a..ab41e9ec252c41b7ebcdaf0e5ab1926be8e9d6c5 100644 (file)
@@ -51,3 +51,18 @@ bool X86InstrInfo::isNOPinstr(const MachineInstr &MI) const {
   return false;
 }
 
+bool X86InstrInfo::isMoveInstr(const MachineInstr& MI,
+                               unsigned& sourceReg,
+                               unsigned& destReg) const {
+  MachineOpCode oc = MI.getOpcode();
+  if (oc == X86::MOVrr8 || oc == X86::MOVrr16 || oc == X86::MOVrr32) {
+      assert(MI.getNumOperands() == 2 &&
+             MI.getOperand(0).isRegister() &&
+             MI.getOperand(1).isRegister() &&
+             "invalid register-register move instruction");
+      sourceReg = MI.getOperand(1).getAllocatedRegNum();
+      destReg = MI.getOperand(0).getAllocatedRegNum();
+      return true;
+  }
+  return false;
+}
index 5e371dd99ac9943cf8121015bae700fcf2c22222..0639c2d05378dd5d469d6eaf6e0a2e162b49ce1c 100644 (file)
@@ -169,6 +169,14 @@ public:
   ///
   MachineInstr* createNOPinstr() const;
 
+  //
+  // Return true if the instruction is a register to register move and
+  // leave the source and dest operands in the passed parameters.
+  //
+  virtual bool isMoveInstr(const MachineInstr& MI,
+                           unsigned& sourceReg,
+                           unsigned& destReg) const;
+
   /// isNOPinstr - not having a special NOP opcode, we need to know if a given
   /// instruction is interpreted as an `official' NOP instr, i.e., there may be
   /// more than one way to `do nothing' but only one canonical way to slack off.