Factory methods for FunctionPasses now return type FunctionPass *.
[oota-llvm.git] / lib / CodeGen / MachineInstr.cpp
index ffb2ae9c4e0a820a9cede09432762b91b70cd3fe..248adc2d4da775dc156b87a1531173b33219d127 100644 (file)
@@ -8,8 +8,6 @@
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetInstrInfo.h"
 #include "llvm/Target/MRegisterInfo.h"
-using std::cerr;
-
 
 // Global variable holding an array of descriptors for machine instructions.
 // The actual object needs to be created separately for each target machine.
@@ -82,24 +80,13 @@ void MachineInstr::replace(MachineOpCode Opcode, unsigned numOperands)
   operands.resize(numOperands, MachineOperand());
 }
 
-void
-MachineInstr::SetMachineOperandVal(unsigned i,
-                                   MachineOperand::MachineOperandType opType,
-                                   Value* V,
-                                   bool isdef,
-                                   bool isDefAndUse)
-{
+void MachineInstr::SetMachineOperandVal(unsigned i,
+                                        MachineOperand::MachineOperandType opTy,
+                                        Value* V) {
   assert(i < operands.size());          // may be explicit or implicit op
-  operands[i].opType = opType;
+  operands[i].opType = opTy;
   operands[i].value = V;
   operands[i].regNum = -1;
-
-  if (isDefAndUse)
-    operands[i].flags = MachineOperand::DEFUSEFLAG;
-  else if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
-    operands[i].flags = MachineOperand::DEFONLYFLAG;
-  else
-    operands[i].flags = 0;
 }
 
 void
@@ -118,22 +105,12 @@ MachineInstr::SetMachineOperandConst(unsigned i,
   operands[i].flags = 0;
 }
 
-void
-MachineInstr::SetMachineOperandReg(unsigned i,
-                                   int regNum,
-                                   bool isdef) {
+void MachineInstr::SetMachineOperandReg(unsigned i, int regNum) {
   assert(i < getNumOperands());          // must be explicit op
 
   operands[i].opType = MachineOperand::MO_MachineRegister;
   operands[i].value = NULL;
   operands[i].regNum = regNum;
-
-  if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
-    operands[i].flags = MachineOperand::DEFONLYFLAG;
-  else
-    operands[i].flags = 0;
-
-  insertUsedReg(regNum);
 }
 
 void
@@ -141,41 +118,53 @@ MachineInstr::SetRegForOperand(unsigned i, int regNum)
 {
   assert(i < getNumOperands());          // must be explicit op
   operands[i].setRegForValue(regNum);
-  insertUsedReg(regNum);
 }
 
 void
 MachineInstr::SetRegForImplicitRef(unsigned i, int regNum)
 {
   getImplicitOp(i).setRegForValue(regNum);
-  insertUsedReg(regNum);
 }
 
 
 // Subsitute all occurrences of Value* oldVal with newVal in all operands
-// and all implicit refs.  If defsOnly == true, substitute defs only.
+// and all implicit refs.
+// If defsOnly == true, substitute defs only.
 unsigned
-MachineInstr::substituteValue(const Value* oldVal, Value* newVal, bool defsOnly)
+MachineInstr::substituteValue(const Value* oldVal, Value* newVal,
+                              bool defsOnly, bool notDefsAndUses,
+                              bool& someArgsWereIgnored)
 {
+  assert((!defsOnly || !notDefsAndUses) &&
+         "notDefsAndUses is irrelevant if defsOnly == true.");
+  
   unsigned numSubst = 0;
 
   // Subsitute operands
   for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O)
     if (*O == oldVal)
-      if (!defsOnly || !O.isUseOnly())
+      if (!defsOnly ||
+          notDefsAndUses && O.isDefOnly() ||
+          !notDefsAndUses && !O.isUseOnly())
         {
           O.getMachineOperand().value = newVal;
           ++numSubst;
         }
+      else
+        someArgsWereIgnored = true;
 
   // Subsitute implicit refs
   for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i)
     if (getImplicitRef(i) == oldVal)
-      if (!defsOnly || !getImplicitOp(i).opIsUse())
+      if (!defsOnly ||
+          notDefsAndUses && getImplicitOp(i).opIsDefOnly() ||
+          !notDefsAndUses && !getImplicitOp(i).opIsUse())
         {
           getImplicitOp(i).value = newVal;
           ++numSubst;
         }
+      else
+        someArgsWereIgnored = true;
 
   return numSubst;
 }
@@ -184,17 +173,17 @@ MachineInstr::substituteValue(const Value* oldVal, Value* newVal, bool defsOnly)
 void
 MachineInstr::dump() const 
 {
-  cerr << "  " << *this;
+  std::cerr << "  " << *this;
 }
 
 static inline std::ostream&
 OutputValue(std::ostream &os, const Value* val)
 {
   os << "(val ";
+  os << (void*) val;                    // print address always
   if (val && val->hasName())
-    return os << val->getName() << ")";
-  else
-    return os << (void*) val << ")";              // print address only
+    os << " " << val->getName() << ")"; // print name also, if available
+  return os;
 }
 
 static inline void OutputReg(std::ostream &os, unsigned RegNo,