From 627eb31cd791f808eaa048478d01222577a30a1a Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Thu, 10 Jul 2003 19:45:07 +0000 Subject: [PATCH] Change interface to MachineInstr::substituteValue to specify more precisely which args can be substituted: defsOnly, defsAndUses or usesOnly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7154 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineInstr.h | 3 ++- lib/CodeGen/MachineInstr.cpp | 28 +++++++++++++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/include/llvm/CodeGen/MachineInstr.h b/include/llvm/CodeGen/MachineInstr.h index 9bc59f3ff41..924c3b2449d 100644 --- a/include/llvm/CodeGen/MachineInstr.h +++ b/include/llvm/CodeGen/MachineInstr.h @@ -646,7 +646,8 @@ public: unsigned substituteValue(const Value* oldVal, Value* newVal, - bool defsOnly = true); + bool defsOnly, bool notDefsAndUses, + bool& someArgsWereIgnored); void setOperandHi32(unsigned i) { operands[i].markHi32(); } void setOperandLo32(unsigned i) { operands[i].markLo32(); } diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp index ffb2ae9c4e0..b0e1779f285 100644 --- a/lib/CodeGen/MachineInstr.cpp +++ b/lib/CodeGen/MachineInstr.cpp @@ -153,29 +153,43 @@ MachineInstr::SetRegForImplicitRef(unsigned i, int 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 == false."); + 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; } @@ -191,10 +205,10 @@ 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,