Skip to content

Commit de1197f

Browse files
bnoordhuisandrew749
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: nodejs/node#11991 PR-URL: nodejs/node#12460 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Yang Guo <[email protected]>
1 parent 5efb302 commit de1197f

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 {
@@ -655,19 +657,23 @@ SideEffects
655657
HGlobalValueNumberingPhase::CollectSideEffectsOnPathsToDominatedBlock(
656658
HBasicBlock* dominator, HBasicBlock* dominated) {
657659
SideEffects side_effects;
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()]);
660+
List<HBasicBlock*> blocks;
661+
for (;;) {
662+
for (int i = 0; i < dominated->predecessors()->length(); ++i) {
663+
HBasicBlock* block = dominated->predecessors()->at(i);
664+
if (dominator->block_id() < block->block_id() &&
665+
block->block_id() < dominated->block_id() &&
666+
!visited_on_paths_.Contains(block->block_id())) {
667+
visited_on_paths_.Add(block->block_id());
668+
side_effects.Add(block_side_effects_[block->block_id()]);
669+
if (block->IsLoopHeader()) {
670+
side_effects.Add(loop_side_effects_[block->block_id()]);
671+
}
672+
blocks.Add(block);
667673
}
668-
side_effects.Add(CollectSideEffectsOnPathsToDominatedBlock(
669-
dominator, block));
670674
}
675+
if (blocks.is_empty()) break;
676+
dominated = blocks.RemoveLast();
671677
}
672678
return side_effects;
673679
}

0 commit comments

Comments
 (0)