mirror of
https://github.com/nodejs/node.git
synced 2026-10-14 10:26:26 -04:00
v8: fix stack overflow in recursive method
HGlobalValueNumberingPhase::CollectSideEffectsOnPathsToDominatedBlock() used to self-recurse before this commit, causing stack overflows on systems with small stack sizes. Make it non-recursive by storing intermediate results in a heap-allocated list. Fixes: https://github.com/nodejs/node/issues/11991 Refs: https://github.com/nodejs/node/pull/12460 PR-URL: https://github.com/nodejs/node/pull/14004 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
1 parent
ebd13c333c
commit
28aa7d0066
1 file changed
+17
-11
+17
-11
@@ -5,6 +5,8 @@
|
||||
#include "src/crankshaft/hydrogen-gvn.h"
|
||||
|
||||
#include "src/crankshaft/hydrogen.h"
|
||||
#include "src/list.h"
|
||||
#include "src/list-inl.h"
|
||||
#include "src/objects-inl.h"
|
||||
#include "src/v8.h"
|
||||
|
||||
@@ -651,19 +653,23 @@ SideEffects
|
||||
HGlobalValueNumberingPhase::CollectSideEffectsOnPathsToDominatedBlock(
|
||||
HBasicBlock* dominator, HBasicBlock* dominated) {
|
||||
SideEffects side_effects;
|
||||
for (int i = 0; i < dominated->predecessors()->length(); ++i) {
|
||||
HBasicBlock* block = dominated->predecessors()->at(i);
|
||||
if (dominator->block_id() < block->block_id() &&
|
||||
block->block_id() < dominated->block_id() &&
|
||||
!visited_on_paths_.Contains(block->block_id())) {
|
||||
visited_on_paths_.Add(block->block_id());
|
||||
side_effects.Add(block_side_effects_[block->block_id()]);
|
||||
if (block->IsLoopHeader()) {
|
||||
side_effects.Add(loop_side_effects_[block->block_id()]);
|
||||
List<HBasicBlock*> blocks;
|
||||
for (;;) {
|
||||
for (int i = 0; i < dominated->predecessors()->length(); ++i) {
|
||||
HBasicBlock* block = dominated->predecessors()->at(i);
|
||||
if (dominator->block_id() < block->block_id() &&
|
||||
block->block_id() < dominated->block_id() &&
|
||||
!visited_on_paths_.Contains(block->block_id())) {
|
||||
visited_on_paths_.Add(block->block_id());
|
||||
side_effects.Add(block_side_effects_[block->block_id()]);
|
||||
if (block->IsLoopHeader()) {
|
||||
side_effects.Add(loop_side_effects_[block->block_id()]);
|
||||
}
|
||||
blocks.Add(block);
|
||||
}
|
||||
side_effects.Add(CollectSideEffectsOnPathsToDominatedBlock(
|
||||
dominator, block));
|
||||
}
|
||||
if (blocks.is_empty()) break;
|
||||
dominated = blocks.RemoveLast();
|
||||
}
|
||||
return side_effects;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user