bool SideEffectsAnalysis::Run() { // In DEBUG mode, ensure side effects are properly initialized to empty. if (kIsDebugBuild) { for (HBasicBlock* block : graph_->GetReversePostOrder()) {
SideEffects effects = GetBlockEffects(block);
DCHECK(effects.DoesNothing()); if (block->IsLoopHeader()) {
effects = GetLoopEffects(block);
DCHECK(effects.DoesNothing());
}
}
}
// Do a post order visit to ensure we visit a loop header after its loop body. for (HBasicBlock* block : graph_->GetPostOrder()) {
SideEffects effects = SideEffects::None(); // Update `effects` with the side effects of all instructions in this block. for (HInstructionIteratorPrefetchNext inst_it(block->GetInstructions()); !inst_it.Done();
inst_it.Advance()) {
HInstruction* instruction = inst_it.Current();
effects = effects.Union(instruction->GetSideEffects()); // If all side effects are represented, scanning further will not add any // more information to side-effects of this block. if (effects.DoesAll()) { break;
}
}
block_effects_[block->GetBlockId()] = effects;
if (block->IsLoopHeader()) { // The side effects of the loop header are part of the loop.
UpdateLoopEffects(block->GetLoopInformation(), effects);
HBasicBlock* pre_header = block->GetLoopInformation()->GetPreHeader(); if (pre_header->IsInLoop()) { // Update the side effects of the outer loop with the side effects of the inner loop. // Note that this works because we know all the blocks of the inner loop are visited // before the loop header of the outer loop.
UpdateLoopEffects(pre_header->GetLoopInformation(), GetLoopEffects(block));
}
} elseif (block->IsInLoop()) { // Update the side effects of the loop with the side effects of this block.
UpdateLoopEffects(block->GetLoopInformation(), effects);
}
}
has_run_ = true; returntrue;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.