Move parsing details to Parser.cpp.
[oota-llvm.git] / lib / CodeGen / TwoAddressInstructionPass.cpp
index 8dc2ffe365d7060478d24615957e915cc2d9216b..066260c241afa560d4cb71f4a48bde244621c904 100644 (file)
@@ -28,6 +28,7 @@
 //===----------------------------------------------------------------------===//
 
 #define DEBUG_TYPE "twoaddrinstr"
+#include "llvm/Function.h"
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/CodeGen/LiveVariables.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
@@ -38,6 +39,7 @@
 #include "llvm/Target/TargetMachine.h"
 #include "Support/Debug.h"
 #include "Support/Statistic.h"
+#include "Support/STLExtras.h"
 #include <iostream>
 using namespace llvm;
 
@@ -64,9 +66,7 @@ const PassInfo *llvm::TwoAddressInstructionPassID = X.getPassInfo();
 void TwoAddressInstructionPass::getAnalysisUsage(AnalysisUsage &AU) const
 {
     AU.addPreserved<LiveVariables>();
-    AU.addRequired<LiveVariables>();
     AU.addPreservedID(PHIEliminationID);
-    AU.addRequiredID(PHIEliminationID);
     MachineFunctionPass::getAnalysisUsage(AU);
 }
 
@@ -77,11 +77,15 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
     DEBUG(std::cerr << "Machine Function\n");
     const TargetMachine &TM = MF.getTarget();
     const MRegisterInfo &MRI = *TM.getRegisterInfo();
-    const TargetInstrInfo &TII = TM.getInstrInfo();
-    LiveVariables &LV = getAnalysis<LiveVariables>();
+    const TargetInstrInfo &TII = *TM.getInstrInfo();
+    LiveVariables* LV = getAnalysisToUpdate<LiveVariables>();
 
     bool MadeChange = false;
 
+    DEBUG(std::cerr << "********** REWRITING TWO-ADDR INSTRS **********\n");
+    DEBUG(std::cerr << "********** Function: "
+          << MF.getFunction()->getName() << '\n');
+
     for (MachineFunction::iterator mbbi = MF.begin(), mbbe = MF.end();
          mbbi != mbbe; ++mbbi) {
         for (MachineBasicBlock::iterator mi = mbbi->begin(), me = mbbi->end();
@@ -94,7 +98,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
 
             ++numTwoAddressInstrs;
 
-            DEBUG(std::cerr << "\tinstruction: "; mi->print(std::cerr, TM));
+            DEBUG(std::cerr << '\t'; mi->print(std::cerr, TM));
 
             assert(mi->getOperand(1).isRegister() &&
                    mi->getOperand(1).getReg() &&
@@ -134,23 +138,24 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
                 unsigned Added = MRI.copyRegToReg(*mbbi, mi, regA, regB, rc);
                 numInstrsAdded += Added;
 
-                MachineBasicBlock::iterator prevMi = mi;
-                --prevMi;
-                DEBUG(std::cerr << "\t\tadded instruction: ";
+                MachineBasicBlock::iterator prevMi = prior(mi);
+                DEBUG(std::cerr << "\t\tprepend:\t";
                       prevMi->print(std::cerr, TM));
 
-                // update live variables for regA
-                assert(Added == 1 &&
-                       "Cannot handle multi-instruction copies yet!");
-                LiveVariables::VarInfo& varInfo = LV.getVarInfo(regA);
-                varInfo.DefInst = prevMi;
+                if (LV) {
+                    // update live variables for regA
+                    assert(Added == 1 &&
+                           "Cannot handle multi-instruction copies yet!");
+                    LiveVariables::VarInfo& varInfo = LV->getVarInfo(regA);
+                    varInfo.DefInst = prevMi;
 
-                // update live variables for regB
-                if (LV.removeVirtualRegisterKilled(regB, &*mbbi, mi))
-                    LV.addVirtualRegisterKilled(regB, &*mbbi, prevMi);
+                    // update live variables for regB
+                    if (LV->removeVirtualRegisterKilled(regB, &*mbbi, mi))
+                        LV->addVirtualRegisterKilled(regB, &*mbbi, prevMi);
 
-                if (LV.removeVirtualRegisterDead(regB, &*mbbi, mi))
-                    LV.addVirtualRegisterDead(regB, &*mbbi, prevMi);
+                    if (LV->removeVirtualRegisterDead(regB, &*mbbi, mi))
+                        LV->addVirtualRegisterDead(regB, &*mbbi, prevMi);
+                }
 
                 // replace all occurences of regB with regA
                 for (unsigned i = 1, e = mi->getNumOperands(); i != e; ++i) {
@@ -164,7 +169,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
             mi->getOperand(0).setUse();
             mi->RemoveOperand(1);
 
-            DEBUG(std::cerr << "\t\tmodified original to: ";
+            DEBUG(std::cerr << "\t\trewrite to:\t";
                   mi->print(std::cerr, TM));
         }
     }