mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-01 00:17:01 +00:00
Add a Debug bit to MachineOperand, for uses that
are from debug info. Add an iterator to MachineRegisterInfo to skip Debug operands when walking the use list. No functional change yet. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95473 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -78,12 +78,12 @@ public:
|
||||
/// reg_begin/reg_end - Provide iteration support to walk over all definitions
|
||||
/// and uses of a register within the MachineFunction that corresponds to this
|
||||
/// MachineRegisterInfo object.
|
||||
template<bool Uses, bool Defs>
|
||||
template<bool Uses, bool Defs, bool SkipDebug>
|
||||
class defusechain_iterator;
|
||||
|
||||
/// reg_iterator/reg_begin/reg_end - Walk all defs and uses of the specified
|
||||
/// register.
|
||||
typedef defusechain_iterator<true,true> reg_iterator;
|
||||
typedef defusechain_iterator<true,true,false> reg_iterator;
|
||||
reg_iterator reg_begin(unsigned RegNo) const {
|
||||
return reg_iterator(getRegUseDefListHead(RegNo));
|
||||
}
|
||||
@@ -94,7 +94,7 @@ public:
|
||||
bool reg_empty(unsigned RegNo) const { return reg_begin(RegNo) == reg_end(); }
|
||||
|
||||
/// def_iterator/def_begin/def_end - Walk all defs of the specified register.
|
||||
typedef defusechain_iterator<false,true> def_iterator;
|
||||
typedef defusechain_iterator<false,true,false> def_iterator;
|
||||
def_iterator def_begin(unsigned RegNo) const {
|
||||
return def_iterator(getRegUseDefListHead(RegNo));
|
||||
}
|
||||
@@ -105,7 +105,7 @@ public:
|
||||
bool def_empty(unsigned RegNo) const { return def_begin(RegNo) == def_end(); }
|
||||
|
||||
/// use_iterator/use_begin/use_end - Walk all uses of the specified register.
|
||||
typedef defusechain_iterator<true,false> use_iterator;
|
||||
typedef defusechain_iterator<true,false,false> use_iterator;
|
||||
use_iterator use_begin(unsigned RegNo) const {
|
||||
return use_iterator(getRegUseDefListHead(RegNo));
|
||||
}
|
||||
@@ -115,7 +115,20 @@ public:
|
||||
/// register.
|
||||
bool use_empty(unsigned RegNo) const { return use_begin(RegNo) == use_end(); }
|
||||
|
||||
/// use_nodbg_iterator/use_nodbg_begin/use_nodbg_end - Walk all uses of the
|
||||
/// specified register, skipping those marked as Debug.
|
||||
typedef defusechain_iterator<true,false,true> use_nodbg_iterator;
|
||||
use_nodbg_iterator use_nodbg_begin(unsigned RegNo) const {
|
||||
return use_nodbg_iterator(getRegUseDefListHead(RegNo));
|
||||
}
|
||||
static use_nodbg_iterator use_nodbg_end() { return use_nodbg_iterator(0); }
|
||||
|
||||
/// use_nodbg_empty - Return true if there are no non-Debug instructions
|
||||
/// using the specified register.
|
||||
bool use_nodbg_empty(unsigned RegNo) const {
|
||||
return use_nodbg_begin(RegNo) == use_nodbg_end();
|
||||
}
|
||||
|
||||
/// replaceRegWith - Replace all instances of FromReg with ToReg in the
|
||||
/// machine function. This is like llvm-level X->replaceAllUsesWith(Y),
|
||||
/// except that it also changes any definitions of the register as well.
|
||||
@@ -258,8 +271,9 @@ public:
|
||||
/// operands in the function that use or define a specific register. If
|
||||
/// ReturnUses is true it returns uses of registers, if ReturnDefs is true it
|
||||
/// returns defs. If neither are true then you are silly and it always
|
||||
/// returns end().
|
||||
template<bool ReturnUses, bool ReturnDefs>
|
||||
/// returns end(). If SkipDebug is true it skips uses marked Debug
|
||||
/// when incrementing.
|
||||
template<bool ReturnUses, bool ReturnDefs, bool SkipDebug>
|
||||
class defusechain_iterator
|
||||
: public std::iterator<std::forward_iterator_tag, MachineInstr, ptrdiff_t> {
|
||||
MachineOperand *Op;
|
||||
@@ -268,7 +282,8 @@ public:
|
||||
// we are interested in.
|
||||
if (op) {
|
||||
if ((!ReturnUses && op->isUse()) ||
|
||||
(!ReturnDefs && op->isDef()))
|
||||
(!ReturnDefs && op->isDef()) ||
|
||||
(SkipDebug && op->isDebug()))
|
||||
++*this;
|
||||
}
|
||||
}
|
||||
@@ -299,7 +314,8 @@ public:
|
||||
|
||||
// If this is an operand we don't care about, skip it.
|
||||
while (Op && ((!ReturnUses && Op->isUse()) ||
|
||||
(!ReturnDefs && Op->isDef())))
|
||||
(!ReturnDefs && Op->isDef()) ||
|
||||
(SkipDebug && Op->isDebug())))
|
||||
Op = Op->getNextOperandForReg();
|
||||
|
||||
return *this;
|
||||
|
||||
Reference in New Issue
Block a user