// 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.

// Flags: --allow-natives-syntax --use-osr

"use strict";

function test(expected, func) {
  assertEquals(expected, func());
  assertEquals(expected, func());
  assertEquals(expected, func());
}

function foo() {
  var result = 0;
  {
    let x = 0;
    var temp_x = x;
    var first = 1;
    outer: while (true) {
      let x = temp_x;
      if (first == 1) first = 0;
      else x = x + 1 | 0;
      var flag = 1;
      for (; flag == 1; (flag = 0, temp_x = x)) {
        if (x < 2) {
          result = x; %OptimizeOsr();
        } else {
          break outer;
        }
      }
      if (flag == 1) break;
    }
  }
  return result;
}

test(1, foo);


function smo() {
  var result = 0;
  {
    let x = 11;
    outer: while (true) {
      let y = x;
      for (var i = 0; i < 5; i++) {
        %OptimizeOsr();
        if (i) break outer;
        else result = y;
      }
    }
  }
  return result;
}

test(11, smo);
