Add implicit def / use operands to MachineInstr.
authorEvan Cheng <evan.cheng@apple.com>
Fri, 10 Nov 2006 08:43:01 +0000 (08:43 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 10 Nov 2006 08:43:01 +0000 (08:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31633 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveIntervalAnalysis.cpp
lib/CodeGen/LiveVariables.cpp
lib/CodeGen/MachineInstr.cpp
lib/CodeGen/RegAllocLocal.cpp
lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
lib/Target/X86/X86RegisterInfo.cpp

index 472a8d71361d7e19bd316736b25e53d5d7cf018f..730ad239141d4cc9216c0982ff62ff3c462dfbe3 100644 (file)
@@ -658,16 +658,9 @@ void LiveIntervals::computeIntervals() {
     }
     
     for (; MI != miEnd; ++MI) {
-      const TargetInstrDescriptor &TID = tii_->get(MI->getOpcode());
       DEBUG(std::cerr << MIIndex << "\t" << *MI);
-      
-      // Handle implicit defs.
-      if (TID.ImplicitDefs) {
-        for (const unsigned *ImpDef = TID.ImplicitDefs; *ImpDef; ++ImpDef)
-          handleRegisterDef(MBB, MI, MIIndex, *ImpDef);
-      }
 
-      // Handle explicit defs.
+      // Handle defs.
       for (int i = MI->getNumOperands() - 1; i >= 0; --i) {
         MachineOperand &MO = MI->getOperand(i);
         // handle register defs - build intervals
index 29686558adc1395a020d6d168bebe7c9f4ef70ac..3424f45bc1ca0001cf6f0d1a7e44ad227ce8a16a 100644 (file)
@@ -228,7 +228,6 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) {
     for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
          I != E; ++I) {
       MachineInstr *MI = I;
-      const TargetInstrDescriptor &MID = TII.get(MI->getOpcode());
 
       // Process all of the operands of the instruction...
       unsigned NumOperandsToProcess = MI->getNumOperands();
@@ -238,14 +237,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) {
       if (MI->getOpcode() == TargetInstrInfo::PHI)
         NumOperandsToProcess = 1;
 
-      // Loop over implicit uses, using them.
-      if (MID.ImplicitUses) {
-        for (const unsigned *ImplicitUses = MID.ImplicitUses;
-             *ImplicitUses; ++ImplicitUses)
-          HandlePhysRegUse(*ImplicitUses, MI);
-      }
-
-      // Process all explicit uses...
+      // Process all uses...
       for (unsigned i = 0; i != NumOperandsToProcess; ++i) {
         MachineOperand &MO = MI->getOperand(i);
         if (MO.isRegister() && MO.isUse() && MO.getReg()) {
@@ -258,14 +250,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) {
         }
       }
 
-      // Loop over implicit defs, defining them.
-      if (MID.ImplicitDefs) {
-        for (const unsigned *ImplicitDefs = MID.ImplicitDefs;
-             *ImplicitDefs; ++ImplicitDefs)
-          HandlePhysRegDef(*ImplicitDefs, MI);
-      }
-
-      // Process all explicit defs...
+      // Process all defs...
       for (unsigned i = 0; i != NumOperandsToProcess; ++i) {
         MachineOperand &MO = MI->getOperand(i);
         if (MO.isRegister() && MO.isDef() && MO.getReg()) {
index a47293e048be4249e8b99d7d73d6fbc882e1a0f4..ba75e736239fa25b816a656c261df72b73d4605e 100644 (file)
@@ -205,8 +205,12 @@ void MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const {
     OS << " ";
     ::print(mop, OS, TM);
 
-    if (mop.isReg() && mop.isDef())
-      OS << "<def>";
+    if (mop.isReg()) {
+      if (mop.isImplicit())
+        OS << (mop.isDef() ? "<imp-def>" : "<imp-use>");
+      else if (mop.isDef())
+        OS << "<def>";
+    }
   }
 
   OS << "\n";
index e42603e62993a90ba6a4dab291430843ead9fdea..f91166667ccb1c9c6ef87b330e4e676a6afc2753 100644 (file)
@@ -561,7 +561,7 @@ void RA::AllocateBasicBlock(MachineBasicBlock &MBB) {
     for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
       MachineOperand& MO = MI->getOperand(i);
       // here we are looking for only used operands (never def&use)
-      if (MO.isRegister() && !MO.isDef() && MO.getReg() &&
+      if (MO.isRegister() && !MO.isDef() && !MO.isImplicit() && MO.getReg() &&
           MRegisterInfo::isVirtualRegister(MO.getReg()))
         MI = reloadVirtReg(MBB, MI, i);
     }
@@ -596,7 +596,7 @@ void RA::AllocateBasicBlock(MachineBasicBlock &MBB) {
     // are defined, and marking explicit destinations in the PhysRegsUsed map.
     for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
       MachineOperand& MO = MI->getOperand(i);
-      if (MO.isRegister() && MO.isDef() && MO.getReg() &&
+      if (MO.isRegister() && MO.isDef() && !MO.isImplicit() && MO.getReg() &&
           MRegisterInfo::isPhysicalRegister(MO.getReg())) {
         unsigned Reg = MO.getReg();
         if (PhysRegsUsed[Reg] == -2) continue;  // Something like ESP.
index dd968ed4544b51a2336ab806f91d13ba0bedae6c..307b2b9b70c664e8d5c374db68e8fa134c5379d7 100644 (file)
@@ -441,6 +441,18 @@ void ScheduleDAG::EmitNode(SDNode *Node,
       }
     }
 
+    // Emit implicit def / use operands.
+    if (II.ImplicitDefs) {
+      for (const unsigned *ImplicitDefs = II.ImplicitDefs;
+           *ImplicitDefs; ++ImplicitDefs)
+        MI->addRegOperand(*ImplicitDefs, true, true);
+    }
+    if (II.ImplicitUses) {
+      for (const unsigned *ImplicitUses = II.ImplicitUses;
+           *ImplicitUses; ++ImplicitUses)
+        MI->addRegOperand(*ImplicitUses, false, true);
+    }
+
     // Now that we have emitted all operands, emit this instruction itself.
     if ((II.Flags & M_USES_CUSTOM_DAG_SCHED_INSERTION) == 0) {
       BB->insert(BB->end(), MI);
index 6363f122087c86a28a38d32d57d7d13c0c864ace..74d446132b5bcfbcb9d4a06f8751c756665e86da 100644 (file)
@@ -196,7 +196,7 @@ static MachineInstr *FuseInst(unsigned Opcode, unsigned OpNo,
       assert(MO.isReg() && "Expected to fold into reg operand!");
       MIB = addFrameReference(MIB, FrameIndex);
     } else if (MO.isReg())
-      MIB = MIB.addReg(MO.getReg(), MO.isDef());
+      MIB = MIB.addReg(MO.getReg(), MO.isDef(), MO.isImplicit());
     else if (MO.isImm())
       MIB = MIB.addImm(MO.getImm());
     else if (MO.isGlobalAddress())