[compiler] Allocate in a temporary zone inside ComputeLoopState

Even in the most basic case (the task queue only ever contains a single
element), this function triggers ~4KB in zone allocations. These
allocations are basically lost and can never be reused. Avoid this by
allocating inside a new temporary zone that is only alive during the
ComputeLoopState function call.

This reduces allocation size for the zone used during load elimination
from ~30KB to ~15KB when compiling a trivial for-loop example.

An alternative solution would be to switch to something similar to
SmallVector (which uses a statically-sized stack storage before
switching to heap allocations), but based on zones instead of malloc.

Bug: v8:9427,v8:6150
Change-Id: Ic25abe6d48ac718c9ced2f9ef581f244030980fa
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1714869
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Reviewed-by: Georg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#62883}
This commit is contained in:
Jakob Gruber 2019-07-23 15:20:28 +02:00 committed by Commit Bot
parent 517ab73fd7
commit d267c3373f

View File

@ -1197,9 +1197,12 @@ LoadElimination::AbstractState const* LoadElimination::ComputeLoopState(
ElementsTransition transition;
Node* object;
};
ZoneVector<TransitionElementsKindInfo> element_transitions_(zone());
ZoneQueue<Node*> queue(zone());
ZoneSet<Node*> visited(zone());
// Allocate zone data structures in a temporary zone with a lifetime limited
// to this function to avoid blowing up the size of the stage-global zone.
Zone temp_zone(zone()->allocator(), "Temporary scoped zone");
ZoneVector<TransitionElementsKindInfo> element_transitions_(&temp_zone);
ZoneQueue<Node*> queue(&temp_zone);
ZoneSet<Node*> visited(&temp_zone);
visited.insert(node);
for (int i = 1; i < control->InputCount(); ++i) {
queue.push(node->InputAt(i));