Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 1906077

Browse filesBrowse 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 PR-URL: #12460 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Yang Guo <yangguo@chromium.org>
1 parent 5fb7a0b commit 1906077
Copy full SHA for 1906077

File tree

Expand file treeCollapse file tree

1 file changed

+17
-11
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

1 file changed

+17
-11
lines changed
Open diff view settings
Collapse file

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

Copy file name to clipboardExpand all lines: deps/v8/src/crankshaft/hydrogen-gvn.cc
+17-11Lines changed: 17 additions & 11 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.