aboutsummaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2017-04-17 12:20:05 +0200
committerMichaƫl Zasso <targos@protonmail.com>2017-05-06 20:02:35 +0200
commit14dc300085e8bf2379a6dde0342f9a13ce1dd787 (patch)
tree12b55a5cb45d45899373be03d341fdebdc348adf /deps
parent7becb1969c0697f08d7763c217694a266c98657a (diff)
downloadandroid-node-v8-14dc300085e8bf2379a6dde0342f9a13ce1dd787.tar.gz
android-node-v8-14dc300085e8bf2379a6dde0342f9a13ce1dd787.tar.bz2
android-node-v8-14dc300085e8bf2379a6dde0342f9a13ce1dd787.zip
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: https://github.com/nodejs/node/issues/11991 PR-URL: https://github.com/nodejs/node/pull/12460 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Yang Guo <yangguo@chromium.org>
Diffstat (limited to 'deps')
-rw-r--r--deps/v8/src/crankshaft/hydrogen-gvn.cc28
1 files changed, 17 insertions, 11 deletions
diff --git a/deps/v8/src/crankshaft/hydrogen-gvn.cc b/deps/v8/src/crankshaft/hydrogen-gvn.cc
index 70320052b0..e586f4778f 100644
--- a/deps/v8/src/crankshaft/hydrogen-gvn.cc
+++ b/deps/v8/src/crankshaft/hydrogen-gvn.cc
@@ -5,6 +5,8 @@
#include "src/crankshaft/hydrogen-gvn.h"
#include "src/crankshaft/hydrogen.h"
+#include "src/list.h"
+#include "src/list-inl.h"
#include "src/objects-inl.h"
#include "src/v8.h"
@@ -651,19 +653,23 @@ SideEffects
HGlobalValueNumberingPhase::CollectSideEffectsOnPathsToDominatedBlock(
HBasicBlock* dominator, HBasicBlock* dominated) {
SideEffects side_effects;
- for (int i = 0; i < dominated->predecessors()->length(); ++i) {
- HBasicBlock* block = dominated->predecessors()->at(i);
- if (dominator->block_id() < block->block_id() &&
- block->block_id() < dominated->block_id() &&
- !visited_on_paths_.Contains(block->block_id())) {
- visited_on_paths_.Add(block->block_id());
- side_effects.Add(block_side_effects_[block->block_id()]);
- if (block->IsLoopHeader()) {
- side_effects.Add(loop_side_effects_[block->block_id()]);
+ List<HBasicBlock*> blocks;
+ for (;;) {
+ for (int i = 0; i < dominated->predecessors()->length(); ++i) {
+ HBasicBlock* block = dominated->predecessors()->at(i);
+ if (dominator->block_id() < block->block_id() &&
+ block->block_id() < dominated->block_id() &&
+ !visited_on_paths_.Contains(block->block_id())) {
+ visited_on_paths_.Add(block->block_id());
+ side_effects.Add(block_side_effects_[block->block_id()]);
+ if (block->IsLoopHeader()) {
+ side_effects.Add(loop_side_effects_[block->block_id()]);
+ }
+ blocks.Add(block);
}
- side_effects.Add(CollectSideEffectsOnPathsToDominatedBlock(
- dominator, block));
}
+ if (blocks.is_empty()) break;
+ dominated = blocks.RemoveLast();
}
return side_effects;
}