bool pop = true;
while (fw_stack.back().second != node->use_edges().end()) {
Edge edge = *(fw_stack.back().second);
+ Node* succ = edge.from();
if (NodeProperties::IsControlEdge(edge) &&
- edge.from()->op()->ControlOutputCount() > 0) {
+ succ->op()->ControlOutputCount() > 0) {
// Only walk control edges to control nodes.
- Node* succ = edge.from();
-
if (marked.IsOnStack(succ) && !marked.IsReachableFromEnd(succ)) {
// {succ} is on stack and not reachable from end.
Node* added = ConnectNTL(succ);
}
if (!marked.IsReachableFromStart(succ)) {
// {succ} is not yet reached from start.
- marked.Push(succ);
marked.SetReachableFromStart(succ);
- fw_stack.push_back(FwIter(succ, succ->use_edges().begin()));
- pop = false; // "recurse" into successor control node.
- break;
+ if (succ->opcode() != IrOpcode::kOsrLoopEntry) {
+ // Skip OsrLoopEntry; forms a confusing irredducible loop.
+ marked.Push(succ);
+ fw_stack.push_back(FwIter(succ, succ->use_edges().begin()));
+ pop = false; // "recurse" into successor control node.
+ break;
+ }
}
}
++fw_stack.back().second;
--- /dev/null
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+function counter() {
+ var i = 10000;
+ return function() {
+ if (i-- > 0) return i;
+ throw "done";
+ }
+}
+
+
+var f = (function() {
+ "use asm";
+ return function f(i, c1, c2) {
+ i = i|0;
+ do {
+ if (i > 0) { while (0 ? this : this) { c1(); } }
+ else c2();
+ } while (true);
+ }
+})();
+
+assertThrows(function() { f(0, counter(), counter()); });
+assertThrows(function() { f(1, counter(), counter()); });