[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:
parent
517ab73fd7
commit
d267c3373f
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user