本文整理汇总了C++中MDefinition::hasUses方法的典型用法代码示例。如果您正苦于以下问题:C++ MDefinition::hasUses方法的具体用法?C++ MDefinition::hasUses怎么用?C++ MDefinition::hasUses使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MDefinition
的用法示例。
在下文中一共展示了MDefinition::hasUses方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: discardDefsRecursively
// |block| is unreachable. Mine it for opportunities to delete more dead
// code, and then discard it.
bool
ValueNumberer::visitUnreachableBlock(MBasicBlock* block)
{
JitSpew(JitSpew_GVN, " Visiting unreachable block%u%s%s%s", block->id(),
block->isLoopHeader() ? " (loop header)" : "",
block->isSplitEdge() ? " (split edge)" : "",
block->immediateDominator() == block ? " (dominator root)" : "");
MOZ_ASSERT(block->isMarked(), "Visiting unmarked (and therefore reachable?) block");
MOZ_ASSERT(block->numPredecessors() == 0, "Block marked unreachable still has predecessors");
MOZ_ASSERT(block != graph_.entryBlock(), "Removing normal entry block");
MOZ_ASSERT(block != graph_.osrBlock(), "Removing OSR entry block");
MOZ_ASSERT(deadDefs_.empty(), "deadDefs_ not cleared");
// Disconnect all outgoing CFG edges.
for (size_t i = 0, e = block->numSuccessors(); i < e; ++i) {
MBasicBlock* succ = block->getSuccessor(i);
if (succ->isDead() || succ->isMarked())
continue;
if (!removePredecessorAndCleanUp(succ, block))
return false;
if (succ->isMarked())
continue;
// |succ| is still reachable. Make a note of it so that we can scan
// it for interesting dominator tree changes later.
if (!rerun_) {
if (!remainingBlocks_.append(succ))
return false;
}
}
// Discard any instructions with no uses. The remaining instructions will be
// discarded when their last use is discarded.
MOZ_ASSERT(nextDef_ == nullptr);
for (MDefinitionIterator iter(block); iter; ) {
MDefinition* def = *iter++;
if (def->hasUses())
continue;
nextDef_ = *iter;
if (!discardDefsRecursively(def))
return false;
}
nextDef_ = nullptr;
MControlInstruction* control = block->lastIns();
return discardDefsRecursively(control);
}
示例2: IonSpew
bool
ValueNumberer::eliminateRedundancies()
{
// A definition is 'redundant' iff it is dominated by another definition
// with the same value number.
//
// So, we traverse the dominator tree in pre-order, maintaining a hashmap
// from value numbers to instructions.
//
// For each definition d with value number v, we look up v in the hashmap.
//
// If there is a definition d' in the hashmap, and the current traversal
// index is within that instruction's dominated range, then we eliminate d,
// replacing all uses of d with uses of d'.
//
// If there is no valid definition in the hashtable (the current definition
// is not in dominated scope), then we insert the current instruction,
// since it is the most dominant instruction with the given value number.
InstructionMap defs;
if (!defs.init())
return false;
IonSpew(IonSpew_GVN, "Eliminating redundant instructions");
// Stack for pre-order CFG traversal.
Vector<MBasicBlock *, 1, IonAllocPolicy> worklist;
// The index of the current block in the CFG traversal.
size_t index = 0;
// Add all self-dominating blocks to the worklist.
// This includes all roots. Order does not matter.
for (MBasicBlockIterator i(graph_.begin()); i != graph_.end(); i++) {
MBasicBlock *block = *i;
if (block->immediateDominator() == block) {
if (!worklist.append(block))
return false;
}
}
// Starting from each self-dominating block, traverse the CFG in pre-order.
while (!worklist.empty()) {
MBasicBlock *block = worklist.popCopy();
IonSpew(IonSpew_GVN, "Looking at block %d", block->id());
// Add all immediate dominators to the front of the worklist.
for (size_t i = 0; i < block->numImmediatelyDominatedBlocks(); i++) {
if (!worklist.append(block->getImmediatelyDominatedBlock(i)))
return false;
}
// For each instruction, attempt to look up a dominating definition.
for (MDefinitionIterator iter(block); iter; ) {
MDefinition *ins = simplify(*iter, true);
// Instruction was replaced, and all uses have already been fixed.
if (ins != *iter) {
iter = block->discardDefAt(iter);
continue;
}
// Instruction has side-effects and cannot be folded.
if (!ins->isMovable() || ins->isEffectful()) {
iter++;
continue;
}
MDefinition *dom = findDominatingDef(defs, ins, index);
if (!dom)
return false; // Insertion failed.
if (dom == ins || !dom->updateForReplacement(ins)) {
iter++;
continue;
}
IonSpew(IonSpew_GVN, "instruction %d is dominated by instruction %d (from block %d)",
ins->id(), dom->id(), dom->block()->id());
ins->replaceAllUsesWith(dom);
JS_ASSERT(!ins->hasUses());
JS_ASSERT(ins->block() == block);
JS_ASSERT(!ins->isEffectful());
JS_ASSERT(ins->isMovable());
iter = ins->block()->discardDefAt(iter);
}
index++;
}
JS_ASSERT(index == graph_.numBlocks());
return true;
}