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 PR-URL: https://github.com/nodejs/node/pull/12460 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Yang Guo <yangguo@chromium.org>
This commit is contained in:
parent
90476ac6ee
commit
30989d30db
28
deps/v8/src/crankshaft/hydrogen-gvn.cc
vendored
28
deps/v8/src/crankshaft/hydrogen-gvn.cc
vendored
@ -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/v8.h"
|
||||
|
||||
namespace v8 {
|
||||
@ -650,19 +652,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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user