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 a0f9d59

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

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/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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.