Skip to content

Commit 0bcd62b

Browse files
bnoordhuisMylesBorins
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 Backport-PR-URL: #13080 PR-URL: #12460 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Yang Guo <[email protected]>
1 parent 64f5b73 commit 0bcd62b

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

deps/v8/src/hydrogen-gvn.cc

+17-11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
#include "src/hydrogen.h"
66
#include "src/hydrogen-gvn.h"
7+
#include "src/list.h"
8+
#include "src/list-inl.h"
79
#include "src/v8.h"
810

911
namespace v8 {
@@ -654,19 +656,23 @@ SideEffects
654656
HGlobalValueNumberingPhase::CollectSideEffectsOnPathsToDominatedBlock(
655657
HBasicBlock* dominator, HBasicBlock* dominated) {
656658
SideEffects side_effects;
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()]);
659+
List<HBasicBlock*> blocks;
660+
for (;;) {
661+
for (int i = 0; i < dominated->predecessors()->length(); ++i) {
662+
HBasicBlock* block = dominated->predecessors()->at(i);
663+
if (dominator->block_id() < block->block_id() &&
664+
block->block_id() < dominated->block_id() &&
665+
!visited_on_paths_.Contains(block->block_id())) {
666+
visited_on_paths_.Add(block->block_id());
667+
side_effects.Add(block_side_effects_[block->block_id()]);
668+
if (block->IsLoopHeader()) {
669+
side_effects.Add(loop_side_effects_[block->block_id()]);
670+
}
671+
blocks.Add(block);
666672
}
667-
side_effects.Add(CollectSideEffectsOnPathsToDominatedBlock(
668-
dominator, block));
669673
}
674+
if (blocks.is_empty()) break;
675+
dominated = blocks.RemoveLast();
670676
}
671677
return side_effects;
672678
}

0 commit comments

Comments
 (0)