Skip to content

Commit e77f1e2

Browse files
bnoordhuisevanlucas
authored andcommitted
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: #11991 PR-URL: #12460 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Yang Guo <[email protected]>
1 parent 96b2faa commit e77f1e2

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

deps/v8/src/crankshaft/hydrogen-gvn.cc

+17-11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#include "src/crankshaft/hydrogen-gvn.h"
66

77
#include "src/crankshaft/hydrogen.h"
8+
#include "src/list.h"
9+
#include "src/list-inl.h"
810
#include "src/v8.h"
911

1012
namespace v8 {
@@ -650,19 +652,23 @@ SideEffects
650652
HGlobalValueNumberingPhase::CollectSideEffectsOnPathsToDominatedBlock(
651653
HBasicBlock* dominator, HBasicBlock* dominated) {
652654
SideEffects side_effects;
653-
for (int i = 0; i < dominated->predecessors()->length(); ++i) {
654-
HBasicBlock* block = dominated->predecessors()->at(i);
655-
if (dominator->block_id() < block->block_id() &&
656-
block->block_id() < dominated->block_id() &&
657-
!visited_on_paths_.Contains(block->block_id())) {
658-
visited_on_paths_.Add(block->block_id());
659-
side_effects.Add(block_side_effects_[block->block_id()]);
660-
if (block->IsLoopHeader()) {
661-
side_effects.Add(loop_side_effects_[block->block_id()]);
655+
List<HBasicBlock*> blocks;
656+
for (;;) {
657+
for (int i = 0; i < dominated->predecessors()->length(); ++i) {
658+
HBasicBlock* block = dominated->predecessors()->at(i);
659+
if (dominator->block_id() < block->block_id() &&
660+
block->block_id() < dominated->block_id() &&
661+
!visited_on_paths_.Contains(block->block_id())) {
662+
visited_on_paths_.Add(block->block_id());
663+
side_effects.Add(block_side_effects_[block->block_id()]);
664+
if (block->IsLoopHeader()) {
665+
side_effects.Add(loop_side_effects_[block->block_id()]);
666+
}
667+
blocks.Add(block);
662668
}
663-
side_effects.Add(CollectSideEffectsOnPathsToDominatedBlock(
664-
dominator, block));
665669
}
670+
if (blocks.is_empty()) break;
671+
dominated = blocks.RemoveLast();
666672
}
667673
return side_effects;
668674
}

0 commit comments

Comments
 (0)