add a handy helper method to instruction, useful for determining

whether it is used outside of some block.  This can be used to see
if there are any non-local references, for example.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50004 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2008-04-20 22:11:30 +00:00
parent f9065a904f
commit 7ae40e7d8a
2 changed files with 30 additions and 0 deletions

View File

@ -72,6 +72,13 @@ public:
/// @brief Determine if one instruction is the same operation as another.
bool isSameOperationAs(Instruction *I) const;
/// isUsedOutsideOfBlock - Return true if there are any uses of this
/// instruction in blocks other than the specified block. Note that PHI nodes
/// are considered to evaluate their operands in the corresponding predecessor
/// block.
bool isUsedOutsideOfBlock(const BasicBlock *BB) const;
/// use_back - Specialize the methods defined in Value, as we know that an
/// instruction can only be used by other instructions.
Instruction *use_back() { return cast<Instruction>(*use_begin());}

View File

@ -198,6 +198,29 @@ bool Instruction::isSameOperationAs(Instruction *I) const {
return true;
}
/// isUsedOutsideOfBlock - Return true if there are any uses of I outside of the
/// specified block. Note that PHI nodes are considered to evaluate their
/// operands in the corresponding predecessor block.
bool Instruction::isUsedOutsideOfBlock(const BasicBlock *BB) const {
for (use_const_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) {
// PHI nodes uses values in the corresponding predecessor block. For other
// instructions, just check to see whether the parent of the use matches up.
const PHINode *PN = dyn_cast<PHINode>(*UI);
if (PN == 0) {
if (cast<Instruction>(*UI)->getParent() != BB)
return true;
continue;
}
unsigned UseOperand = UI.getOperandNo();
if (PN->getIncomingBlock(UseOperand/2) != BB)
return true;
}
return false;
}
/// mayWriteToMemory - Return true if this instruction may modify memory.
///
bool Instruction::mayWriteToMemory() const {