fixed-context-shapes-when-recompiling.js 27.7 KB
Newer Older
1 2 3 4
// Copyright 2016 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.

5
// Flags: --allow-natives-syntax --lazy-inner-functions
6 7 8 9

// Test that the information on which variables to allocate in context doesn't
// change when recompiling.

10
function TestVarInInnerFunction() {
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  // Introduce variables which would potentially be context allocated, depending
  // on whether an inner function refers to them or not.
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var a; // This will make "a" actually not be context allocated.
    a; b; c;
  }
  // Force recompilation.
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
29 30 31
}
%PrepareFunctionForOptimization(TestVarInInnerFunction);
TestVarInInnerFunction();
32 33 34 35 36


// Other tests are the same, except that the shadowing variable "a" in inner
// functions is declared differently.

37
function TestLetInInnerFunction() {
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    let a;
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
53 54 55
}
%PrepareFunctionForOptimization(TestLetInInnerFunction);
TestLetInInnerFunction();
56

57
function TestConstInInnerFunction() {
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    const a = 0;
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
73 74 75
}
%PrepareFunctionForOptimization(TestConstInInnerFunction);
TestConstInInnerFunction();
76

77
function TestInnerFunctionParameter() {
78 79 80 81 82 83 84 85 86 87 88 89 90 91
  var a = 1;
  var b = 2;
  var c = 3;
  function inner(a) {
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
92 93 94
}
%PrepareFunctionForOptimization(TestInnerFunctionParameter);
TestInnerFunctionParameter();
95

96
function TestInnerFunctionRestParameter() {
97 98 99 100 101 102 103 104 105 106 107 108 109 110
  var a = 1;
  var b = 2;
  var c = 3;
  function inner(...a) {
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
111 112 113
}
%PrepareFunctionForOptimization(TestInnerFunctionRestParameter);
TestInnerFunctionRestParameter();
114

115
function TestInnerFunctionDestructuredParameter_1() {
116 117 118 119 120 121 122 123 124 125 126 127 128 129
  var a = 1;
  var b = 2;
  var c = 3;
  function inner([d, a]) {
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
130 131 132
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuredParameter_1);
TestInnerFunctionDestructuredParameter_1();
133

134
function TestInnerFunctionDestructuredParameter_2() {
135 136 137 138 139 140 141 142 143 144 145 146 147 148
  var a = 1;
  var b = 2;
  var c = 3;
  function inner({d, a}) {
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
149 150 151
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuredParameter_2);
TestInnerFunctionDestructuredParameter_2();
152

153
function TestInnerArrowFunctionParameter() {
154 155 156 157 158 159 160 161 162 163 164 165
  var a = 1;
  var b = 2;
  var c = 3;
  (a) => { a; b; c; }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
166 167 168
}
%PrepareFunctionForOptimization(TestInnerArrowFunctionParameter);
TestInnerArrowFunctionParameter();
169

170
function TestInnerArrowFunctionRestParameter() {
171 172 173 174 175 176 177 178 179 180 181 182
  var a = 1;
  var b = 2;
  var c = 3;
  (...a) => { a; b; c; }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
183 184 185
}
%PrepareFunctionForOptimization(TestInnerArrowFunctionRestParameter);
TestInnerArrowFunctionRestParameter();
186

187
function TestInnerArrowFunctionDestructuredParameter_1() {
188 189 190 191 192 193 194 195 196 197 198 199
  var a = 1;
  var b = 2;
  var c = 3;
  ([d, a]) => { a; b; c; }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
200 201 202
}
%PrepareFunctionForOptimization(TestInnerArrowFunctionDestructuredParameter_1);
TestInnerArrowFunctionDestructuredParameter_1();
203

204
function TestInnerArrowFunctionDestructuredParameter_2() {
205 206 207 208 209 210 211 212 213 214 215 216
  var a = 1;
  var b = 2;
  var c = 3;
  ({d, a}) => { a; b; c;  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
217 218 219
}
%PrepareFunctionForOptimization(TestInnerArrowFunctionDestructuredParameter_2);
TestInnerArrowFunctionDestructuredParameter_2();
220

221
function TestInnerInnerFunctionParameter() {
222 223 224 225 226 227 228 229 230 231 232 233 234 235
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function innerinner(a) { a; b; c; }
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
236 237 238
}
%PrepareFunctionForOptimization(TestInnerInnerFunctionParameter);
TestInnerInnerFunctionParameter();
239

240
function TestInnerInnerFunctionRestParameter() {
241 242 243 244 245 246 247 248 249 250 251 252 253 254
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function innerinner(...a) { a; b; c; }
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
255 256 257
}
%PrepareFunctionForOptimization(TestInnerInnerFunctionRestParameter);
TestInnerInnerFunctionRestParameter();
258

259
function TestInnerInnerFunctionDestructuredParameter_1() {
260 261 262 263 264 265 266 267 268 269 270 271 272 273
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function innerinner({d, a}) { a; b; c; }
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
274 275 276
}
%PrepareFunctionForOptimization(TestInnerInnerFunctionDestructuredParameter_1);
TestInnerInnerFunctionDestructuredParameter_1();
277

278
function TestInnerInnerFunctionDestructuredParameter_2() {
279 280 281 282 283 284 285 286 287 288 289 290 291 292
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function innerinner([d, a]) { a; b; c; }
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
293 294 295
}
%PrepareFunctionForOptimization(TestInnerInnerFunctionDestructuredParameter_2);
TestInnerInnerFunctionDestructuredParameter_2();
296

297
function TestInnerInnerArrowFunctionParameter() {
298 299 300 301 302 303 304 305 306 307 308 309 310 311
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var f = a => a + b + c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
312 313 314
}
%PrepareFunctionForOptimization(TestInnerInnerArrowFunctionParameter);
TestInnerInnerArrowFunctionParameter();
315

316
function TestInnerInnerArrowFunctionRestParameter() {
317 318 319 320 321 322 323 324 325 326 327 328 329 330
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var f = (...a) => a + b + c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
331 332 333
}
%PrepareFunctionForOptimization(TestInnerInnerArrowFunctionRestParameter);
TestInnerInnerArrowFunctionRestParameter();
334

335
function TestInnerInnerArrowFunctionDestructuredParameter_1() {
336 337 338 339 340 341 342 343 344 345 346 347 348 349
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var f = ([d, a]) => a + b + c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
350 351 352
}
%PrepareFunctionForOptimization(TestInnerInnerArrowFunctionDestructuredParameter_1);
TestInnerInnerArrowFunctionDestructuredParameter_1();
353

354
function TestInnerInnerArrowFunctionDestructuredParameter_2() {
355 356 357 358 359 360 361 362 363 364 365 366 367 368
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var f = ({d, a}) => a + b + c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
369 370 371
}
%PrepareFunctionForOptimization(TestInnerInnerArrowFunctionDestructuredParameter_2);
TestInnerInnerArrowFunctionDestructuredParameter_2();
372

373
function TestInnerFunctionInnerFunction() {
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function a() { }
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
389 390 391
}
%PrepareFunctionForOptimization(TestInnerFunctionInnerFunction);
TestInnerFunctionInnerFunction();
392

393
function TestInnerFunctionSloppyBlockFunction() {
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    if (true) { function a() { } }
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
409 410 411
}
%PrepareFunctionForOptimization(TestInnerFunctionSloppyBlockFunction);
TestInnerFunctionSloppyBlockFunction();
412

413
function TestInnerFunctionCatchVariable() {
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    try {
    }
    catch(a) {
      a; b; c;
    }
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
432 433 434
};
%PrepareFunctionForOptimization(TestInnerFunctionCatchVariable);
TestInnerFunctionCatchVariable();
435

436
function TestInnerFunctionLoopVariable1() {
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    for (var a in {}) {
      a; b; c;
    }
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
453 454 455
}
%PrepareFunctionForOptimization(TestInnerFunctionLoopVariable1);
TestInnerFunctionLoopVariable1();
456

457
function TestInnerFunctionLoopVariable2() {
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    for (let a in {}) {
      a; b; c;
    }
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
474 475 476
}
%PrepareFunctionForOptimization(TestInnerFunctionLoopVariable2);
TestInnerFunctionLoopVariable2();
477

478
function TestInnerFunctionLoopVariable3() {
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    for (var a of []) {
      a; b; c;
    }
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
495 496 497
}
%PrepareFunctionForOptimization(TestInnerFunctionLoopVariable3);
TestInnerFunctionLoopVariable3();
498

499
function TestInnerFunctionLoopVariable4() {
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    for (let a of []) {
      a; b; c;
    }
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
516 517 518
}
%PrepareFunctionForOptimization(TestInnerFunctionLoopVariable4);
TestInnerFunctionLoopVariable4();
519

520
function TestInnerFunctionClass() {
521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    class a {}
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
536 537 538
}
%PrepareFunctionForOptimization(TestInnerFunctionClass);
TestInnerFunctionClass();
539

540
function TestInnerFunctionDestructuring1() {
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var [a, a2] = [1, 2];
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
556 557 558
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuring1);
TestInnerFunctionDestructuring1();
559

560
function TestInnerFunctionDestructuring2() {
561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    let [a, a2] = [1, 2];
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
576 577 578
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuring2);
TestInnerFunctionDestructuring2();
579

580
function TestInnerFunctionDestructuring3() {
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    const [a, a2] = [1, 2];
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
596 597 598
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuring3);
TestInnerFunctionDestructuring3();
599

600
function TestInnerFunctionDestructuring4() {
601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var [a2, ...a] = [1, 2];
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
616 617 618
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuring4);
TestInnerFunctionDestructuring4();
619

620
function TestInnerFunctionDestructuring5() {
621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    let [a2, ...a] = [1, 2];
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
636 637 638
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuring5);
TestInnerFunctionDestructuring5();
639

640
function TestInnerFunctionDestructuring6() {
641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    const [a2, ...a] = [1, 2];
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
656 657 658
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuring6);
TestInnerFunctionDestructuring6();
659

660
function TestInnerFunctionDestructuring7() {
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var {a, a2} = {a: 1, a2: 2};
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
676 677 678
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuring7);
TestInnerFunctionDestructuring7();
679

680
function TestInnerFunctionDestructuring8() {
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    let {a, a2} = {a: 1, a2: 2};
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
696 697 698
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuring8);
TestInnerFunctionDestructuring8();
699

700
function TestInnerFunctionDestructuring9() {
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    const {a, a2} = {a: 1, a2: 2};
    a; b; c;
  }
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
716 717 718
}
%PrepareFunctionForOptimization(TestInnerFunctionDestructuring9);
TestInnerFunctionDestructuring9();
719

720 721
// A cluster of similar tests where the inner function only declares a variable
// whose name clashes with an outer function variable name, but doesn't use it.
722
function TestRegress650969_1_var() {
723 724 725 726 727 728 729 730 731
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      var a;
    }
  }
732 733 734
}
%PrepareFunctionForOptimization(TestRegress650969_1_var);
TestRegress650969_1_var();
735

736
function TestRegress650969_1_let() {
737 738 739 740 741 742
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
743
      let a;
744 745
    }
  }
746 747 748
}
%PrepareFunctionForOptimization(TestRegress650969_1_let);
TestRegress650969_1_let();
749

750
function TestRegress650969_2_var() {
751 752 753 754 755 756
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
757
      var a = 6;
758 759
    }
  }
760 761 762
}
%PrepareFunctionForOptimization(TestRegress650969_2_var);
TestRegress650969_2_var();
763

764
function TestRegress650969_2_let() {
765 766 767 768 769 770
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
771
      let a = 6;
772 773
    }
  }
774 775 776
}
%PrepareFunctionForOptimization(TestRegress650969_2_let);
TestRegress650969_2_let();
777

778
function TestRegress650969_2_const() {
779 780 781 782 783 784
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
785
      const a = 6;
786 787
    }
  }
788 789 790
}
%PrepareFunctionForOptimization(TestRegress650969_2_const);
TestRegress650969_2_const();
791

792
function TestRegress650969_3_var() {
793 794 795 796 797 798
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
799
      var a, b;
800 801
    }
  }
802 803 804
}
%PrepareFunctionForOptimization(TestRegress650969_3_var);
TestRegress650969_3_var();
805

806
function TestRegress650969_3_let() {
807 808 809 810 811 812 813 814 815
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      let a, b;
    }
  }
816 817 818
}
%PrepareFunctionForOptimization(TestRegress650969_3_let);
TestRegress650969_3_let();
819

820
function TestRegress650969_4_var() {
821 822 823 824 825 826 827 828 829
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      var a = 6, b;
    }
  }
830 831 832
}
%PrepareFunctionForOptimization(TestRegress650969_4_var);
TestRegress650969_4_var();
833

834
function TestRegress650969_4_let() {
835 836 837 838 839 840 841 842 843
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      let a = 6, b;
    }
  }
844 845 846
}
%PrepareFunctionForOptimization(TestRegress650969_4_let);
TestRegress650969_4_let();
847

848
function TestRegress650969_4_const() {
849 850 851 852 853 854 855 856 857
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      const a = 0, b = 0;
    }
  }
858 859 860
}
%PrepareFunctionForOptimization(TestRegress650969_4_const);
TestRegress650969_4_const();
861

862
function TestRegress650969_9_parameter() {
863 864 865 866 867 868 869
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner(a) {}
  }
870 871 872
}
%PrepareFunctionForOptimization(TestRegress650969_9_parameter);
TestRegress650969_9_parameter();
873

874
function TestRegress650969_9_restParameter() {
875 876 877 878 879 880 881
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner(...a) {}
  }
882 883 884
}
%PrepareFunctionForOptimization(TestRegress650969_9_restParameter);
TestRegress650969_9_restParameter();
885

886
function TestRegress650969_9_destructuredParameter_1() {
887 888 889 890 891 892 893
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner([d, a]) {}
  }
894 895 896
}
%PrepareFunctionForOptimization(TestRegress650969_9_destructuredParameter_1);
TestRegress650969_9_destructuredParameter_1();
897

898
function TestRegress650969_9_destructuredParameter_2() {
899 900 901 902 903 904 905
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner({d, a}) {}
  }
906 907 908
}
%PrepareFunctionForOptimization(TestRegress650969_9_destructuredParameter_2);
TestRegress650969_9_destructuredParameter_2();
909

910
function TestRegress650969_10_parameter() {
911 912 913 914 915 916 917 918 919
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      function innerinner(a) {}
    }
  }
920 921 922
}
%PrepareFunctionForOptimization(TestRegress650969_10_parameter);
TestRegress650969_10_parameter();
923

924
function TestRegress650969_10_restParameter() {
925 926 927 928 929
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
930 931
    function inner() {
      function innerinner(...a) {}
932 933
    }
  }
934 935 936
}
%PrepareFunctionForOptimization(TestRegress650969_10_restParameter);
TestRegress650969_10_restParameter();
937

938
function TestRegress650969_10_destructuredParameter_1() {
939 940 941 942 943
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
944 945 946 947
    function inner() {
      function innerinner([d, a]) {}
    }
  }
948 949 950
}
%PrepareFunctionForOptimization( TestRegress650969_10_destructuredParameter_1);
TestRegress650969_10_destructuredParameter_1();
951

952
function TestRegress650969_10_destructuredParameter_2() {
953 954 955 956 957 958 959
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      function innerinner({d, a}) {}
960 961
    }
  }
962 963 964
}
%PrepareFunctionForOptimization(TestRegress650969_10_destructuredParameter_2);
TestRegress650969_10_destructuredParameter_2();
965

966
function TestRegress650969_11_var() {
967 968 969 970 971 972 973 974 975
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      var [a, b] = [1, 2];
    }
  }
976 977 978
}
%PrepareFunctionForOptimization(TestRegress650969_11_var);
TestRegress650969_11_var();
979

980 981

function TestRegress650969_11_let() {
982 983 984 985 986 987 988 989 990
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      let [a, b] = [1, 2];
    }
  }
991 992 993
}
%PrepareFunctionForOptimization(TestRegress650969_11_let);
TestRegress650969_11_let();
994

995
function TestRegress650969_11_const() {
996 997 998 999 1000 1001 1002 1003 1004
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      const [a, b] = [1, 2];
    }
  }
1005 1006 1007
}
%PrepareFunctionForOptimization(TestRegress650969_11_const);
TestRegress650969_11_const();
1008

1009
function TestRegress650969_12_var() {
1010 1011 1012 1013 1014 1015 1016 1017 1018
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      var [b, a] = [1, 2];
    }
  }
1019 1020 1021
}
%PrepareFunctionForOptimization(TestRegress650969_12_var);
TestRegress650969_12_var();
1022

1023
function TestRegress650969_12_let() {
1024 1025 1026 1027 1028 1029 1030 1031 1032
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      let [b, a] = [1, 2];
    }
  }
1033 1034 1035
}
%PrepareFunctionForOptimization(TestRegress650969_12_let);
TestRegress650969_12_let();
1036

1037
function TestRegress650969_12_const() {
1038 1039 1040 1041 1042 1043 1044 1045 1046
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      const [b, a] = [1, 2];
    }
  }
1047 1048 1049
}
%PrepareFunctionForOptimization(TestRegress650969_12_const);
TestRegress650969_12_const();
1050

1051
function TestRegress650969_13_var() {
1052 1053 1054 1055 1056 1057 1058 1059 1060
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      var [b, ...a] = [1, 2];
    }
  }
1061 1062 1063
}
%PrepareFunctionForOptimization(TestRegress650969_13_var);
TestRegress650969_13_var();
1064

1065
function TestRegress650969_13_let() {
1066 1067 1068 1069 1070 1071 1072 1073 1074
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      let [b, ...a] = [1, 2];
    }
  }
1075 1076 1077
}
%PrepareFunctionForOptimization(TestRegress650969_13_let);
TestRegress650969_13_let();
1078

1079
function TestRegress650969_13_const() {
1080 1081 1082 1083 1084 1085 1086 1087 1088
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      const [b, ...a] = [1, 2];
    }
  }
1089 1090 1091
}
%PrepareFunctionForOptimization(TestRegress650969_13_const);
TestRegress650969_13_const();
1092

1093
function TestRegress650969_14_var() {
1094 1095 1096 1097 1098 1099 1100 1101 1102
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      var {a, b} = {a: 1, b: 2};
    }
  }
1103 1104 1105
}
%PrepareFunctionForOptimization(TestRegress650969_14_var);
TestRegress650969_14_var();
1106

1107
function TestRegress650969_14_let() {
1108 1109 1110 1111 1112 1113 1114 1115 1116
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      let {a, b} = {a: 1, b: 2};
    }
  }
1117 1118 1119
}
%PrepareFunctionForOptimization(TestRegress650969_14_let);
TestRegress650969_14_let();
1120

1121
function TestRegress650969_14_const() {
1122 1123 1124 1125 1126 1127 1128 1129 1130
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      const {a, b} = {a: 1, b: 2};
    }
  }
1131 1132 1133
}
%PrepareFunctionForOptimization(TestRegress650969_14_const);
TestRegress650969_14_const();
1134

1135
function TestRegress650969_15_var() {
1136 1137 1138 1139 1140 1141 1142 1143 1144
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      var {b: {a}, c} = {b: {a: 1}, c: 2};
    }
  }
1145 1146 1147
}
%PrepareFunctionForOptimization(TestRegress650969_15_var);
TestRegress650969_15_var();
1148

1149
function TestRegress650969_15_let() {
1150 1151 1152 1153 1154 1155 1156 1157 1158
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      let {b: {a}, c} = {b: {a: 1}, c: 2};
    }
  }
1159 1160 1161
}
%PrepareFunctionForOptimization(TestRegress650969_15_let);
TestRegress650969_15_let();
1162

1163
function TestRegress650969_15_const() {
1164 1165 1166 1167 1168 1169 1170 1171 1172
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      const {b: {a}, c} = {b: {a: 1}, c: 2};
    }
  }
1173 1174 1175
}
%PrepareFunctionForOptimization(TestRegress650969_15_const);
TestRegress650969_15_const();
1176

1177
function TestRegress650969_16_var() {
1178 1179 1180 1181 1182 1183 1184 1185 1186
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      var {a: {b}, c} = {a: {b: 1}, c: 2};
    }
  }
1187 1188 1189
}
%PrepareFunctionForOptimization(TestRegress650969_16_var);
TestRegress650969_16_var();
1190

1191
function TestRegress650969_16_let() {
1192 1193 1194 1195 1196 1197 1198 1199 1200
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      let {a: {b}, c} = {a: {b: 1}, c: 2};
    }
  }
1201 1202 1203
}
%PrepareFunctionForOptimization(TestRegress650969_16_let);
TestRegress650969_16_let();
1204

1205
function TestRegress650969_16_const() {
1206 1207 1208 1209 1210 1211 1212 1213 1214
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      const {a: {b}, c} = {a: {b: 1}, c: 2};
    }
  }
1215 1216 1217
}
%PrepareFunctionForOptimization(TestRegress650969_16_const);
TestRegress650969_16_const();
1218

1219
function TestRegress650969_17_var() {
1220 1221 1222 1223 1224 1225 1226 1227 1228
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      for (var a = 0; 0 == 1; ) { }
    }
  }
1229 1230 1231
}
%PrepareFunctionForOptimization(TestRegress650969_17_var);
TestRegress650969_17_var();
1232

1233
function TestRegress650969_17_let() {
1234 1235 1236 1237 1238 1239 1240 1241 1242
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      for (let a = 0; 0 == 1; ) { }
    }
  }
1243 1244 1245
}
%PrepareFunctionForOptimization(TestRegress650969_17_let);
TestRegress650969_17_let();
1246

1247
function TestRegress650969_17_const() {
1248 1249 1250 1251 1252 1253 1254 1255 1256
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      for (const a = 0; 0 == 1; ) { }
    }
  }
1257 1258 1259
}
%PrepareFunctionForOptimization(TestRegress650969_17_const);
TestRegress650969_17_const();
1260

1261
function TestRegress650969_18() {
1262 1263 1264 1265 1266 1267 1268 1269 1270
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      function innerinner([a, b]) {}
    }
  }
1271 1272 1273
}
%PrepareFunctionForOptimization(TestRegress650969_18);
TestRegress650969_18();
1274

1275
function TestRegress650969_18() {
1276 1277 1278 1279 1280 1281 1282 1283 1284
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a;
    function inner() {
      function innerinner(a) {}
    }
  }
1285 1286 1287
}
%PrepareFunctionForOptimization(TestRegress650969_18);
TestRegress650969_18();
1288

1289 1290
// Regression tests for an intermediate stage where unresolved references were
// discarded too aggressively.
1291
function TestRegress650969_sidetrack_var() {
1292 1293 1294 1295 1296 1297 1298 1299 1300 1301
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a = 0;
    function inner() {
      return a;
      var {b: {a}, c} = {b: {a: 1}, c: 2};
    }
  }
1302 1303 1304
}
%PrepareFunctionForOptimization(TestRegress650969_sidetrack_var);
TestRegress650969_sidetrack_var();
1305

1306
function TestRegress650969_sidetrack_let() {
1307 1308 1309 1310 1311 1312 1313 1314 1315 1316
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a = 0;
    function inner() {
      return a;
      let {b: {a}, c} = {b: {a: 1}, c: 2};
    }
  }
1317 1318 1319
}
%PrepareFunctionForOptimization(TestRegress650969_sidetrack_let);
TestRegress650969_sidetrack_let();
1320

1321
function TestRegress650969_sidetrack_const() {
1322 1323 1324 1325 1326 1327 1328 1329 1330 1331
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
    }
    var a = 0;
    function inner() {
      return a;
      const {b: {a}, c} = {b: {a: 1}, c: 2};
    }
  }
1332 1333 1334
}
%PrepareFunctionForOptimization(TestRegress650969_sidetrack_const);
TestRegress650969_sidetrack_const();