/** *Replaceinstructionswithmemoryoperandforms.
*/ class MemoryOperandVisitor final : public HGraphVisitor { public:
MemoryOperandVisitor(HGraph* graph, bool do_implicit_null_checks)
: HGraphVisitor(graph),
do_implicit_null_checks_(do_implicit_null_checks) {}
private: void VisitBoundsCheck(HBoundsCheck* check) override { // Replace the length by the array itself, so that we can do compares to memory.
HArrayLength* array_len = check->InputAt(1)->AsArrayLengthOrNull();
// We only want to replace an ArrayLength. if (array_len == nullptr) { return;
}
// Don't apply this optimization when the array is nullptr. if (array->IsConstant() || (array->IsNullCheck() && array->InputAt(0)->IsConstant())) { return;
}
// Is there a null check that could be an implicit check? if (array->IsNullCheck() && do_implicit_null_checks_) { // The ArrayLen may generate the implicit null check. Can the // bounds check do so as well? if (array_len->GetNextDisregardingMoves() != check) { // No, it won't. Leave as is. return;
}
}
// Can we suppress the ArrayLength and generate at BoundCheck? if (array_len->HasOnlyOneNonEnvironmentUse()) {
array_len->MarkEmittedAtUseSite(); // We need the ArrayLength just before the BoundsCheck.
array_len->MoveBefore(check);
}
}
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.