Skip to content

Commit 357873d

Browse files
bnoordhuisaddaleax
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 Refs: #12460 Backport-PR-URL: #14574 Backport-Reviewed-By: Anna Henningsen <[email protected]> Backport-Reviewed-By: Refael Ackermann <[email protected]> PR-URL: #14004 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Franziska Hinkelmann <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Colin Ihrig <[email protected]>
1 parent 160e2f0 commit 357873d

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/objects-inl.h"
911
#include "src/v8.h"
1012

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

0 commit comments

Comments
 (0)