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
  // 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.
21 22 23
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
24 25 26 27 28
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    let a;
    a; b; c;
  }
45 46 47
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
48 49 50 51 52
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    const a = 0;
    a; b; c;
  }
65 66 67
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
68 69 70 71 72
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner(a) {
    a; b; c;
  }
84 85 86
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
87 88 89 90 91
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner(...a) {
    a; b; c;
  }
103 104 105
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
106 107 108 109 110
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner([d, a]) {
    a; b; c;
  }
122 123 124
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
125 126 127 128 129
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner({d, a}) {
    a; b; c;
  }
141 142 143
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
144 145 146 147 148
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  (a) => { a; b; c; }
158 159 160
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
161 162 163 164 165
    }
    assertEquals(1, a);
    assertEquals(2, b);
    assertEquals(3, c);
  }
166 167 168
}
%PrepareFunctionForOptimization(TestInnerArrowFunctionParameter);
TestInnerArrowFunctionParameter();
169

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

187
function TestInnerArrowFunctionDestructuredParameter_1() {
188 189 190 191
  var a = 1;
  var b = 2;
  var c = 3;
  ([d, a]) => { a; b; c; }
192 193 194
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
195 196 197 198 199
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  ({d, a}) => { a; b; c;  }
209 210 211
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
212 213 214 215 216
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function innerinner(a) { a; b; c; }
  }
228 229 230
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
231 232 233 234 235
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function innerinner(...a) { a; b; c; }
  }
247 248 249
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
250 251 252 253 254
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function innerinner({d, a}) { a; b; c; }
  }
266 267 268
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
269 270 271 272 273
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function innerinner([d, a]) { a; b; c; }
  }
285 286 287
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
288 289 290 291 292
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var f = a => a + b + c;
  }
304 305 306
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
307 308 309 310 311
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var f = (...a) => a + b + c;
  }
323 324 325
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
326 327 328 329 330
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var f = ([d, a]) => a + b + c;
  }
342 343 344
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
345 346 347 348 349
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var f = ({d, a}) => a + b + c;
  }
361 362 363
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
364 365 366 367 368
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    function a() { }
    a; b; c;
  }
381 382 383
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
384 385 386 387 388
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    if (true) { function a() { } }
    a; b; c;
  }
401 402 403
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
404 405 406 407 408
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    try {
    }
    catch(a) {
      a; b; c;
    }
  }
424 425 426
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
427 428 429 430 431
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    for (var a in {}) {
      a; b; c;
    }
  }
445 446 447
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
448 449 450 451 452
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    for (let a in {}) {
      a; b; c;
    }
  }
466 467 468
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
469 470 471 472 473
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    for (var a of []) {
      a; b; c;
    }
  }
487 488 489
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
490 491 492 493 494
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    for (let a of []) {
      a; b; c;
    }
  }
508 509 510
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
511 512 513 514 515
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    class a {}
    a; b; c;
  }
528 529 530
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
531 532 533 534 535
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var [a, a2] = [1, 2];
    a; b; c;
  }
548 549 550
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
551 552 553 554 555
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    let [a, a2] = [1, 2];
    a; b; c;
  }
568 569 570
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
571 572 573 574 575
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    const [a, a2] = [1, 2];
    a; b; c;
  }
588 589 590
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
591 592 593 594 595
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var [a2, ...a] = [1, 2];
    a; b; c;
  }
608 609 610
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
611 612 613 614 615
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    let [a2, ...a] = [1, 2];
    a; b; c;
  }
628 629 630
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
631 632 633 634 635
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    const [a2, ...a] = [1, 2];
    a; b; c;
  }
648 649 650
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
651 652 653 654 655
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    var {a, a2} = {a: 1, a2: 2};
    a; b; c;
  }
668 669 670
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
671 672 673 674 675
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    let {a, a2} = {a: 1, a2: 2};
    a; b; c;
  }
688 689 690
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
691 692 693 694 695
    }
    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
  var a = 1;
  var b = 2;
  var c = 3;
  function inner() {
    const {a, a2} = {a: 1, a2: 2};
    a; b; c;
  }
708 709 710
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
711 712 713 714 715
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
726 727 728 729 730 731
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
740 741 742
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
754 755 756
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
768 769 770
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
782 783 784
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
796 797 798
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
810 811 812 813 814 815
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
824 825 826 827 828 829
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
838 839 840 841 842 843
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
852 853 854 855 856 857
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
866 867 868 869
    }
    var a;
    function inner(a) {}
  }
870 871 872
}
%PrepareFunctionForOptimization(TestRegress650969_9_parameter);
TestRegress650969_9_parameter();
873

874
function TestRegress650969_9_restParameter() {
875 876 877
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
878 879 880 881
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
890 891 892 893
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
902 903 904 905
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
914 915 916 917 918 919
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
928 929
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
942 943
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
956 957 958 959
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
970 971 972 973 974 975
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
985 986 987 988 989 990
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
999 1000 1001 1002 1003 1004
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1013 1014 1015 1016 1017 1018
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1027 1028 1029 1030 1031 1032
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1041 1042 1043 1044 1045 1046
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1055 1056 1057 1058 1059 1060
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1069 1070 1071 1072 1073 1074
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1083 1084 1085 1086 1087 1088
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1097 1098 1099 1100 1101 1102
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1111 1112 1113 1114 1115 1116
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1125 1126 1127 1128 1129 1130
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1139 1140 1141 1142 1143 1144
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1153 1154 1155 1156 1157 1158
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1167 1168 1169 1170 1171 1172
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1181 1182 1183 1184 1185 1186
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1195 1196 1197 1198 1199 1200
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1209 1210 1211 1212 1213 1214
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1223 1224 1225 1226 1227 1228
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1237 1238 1239 1240 1241 1242
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1251 1252 1253 1254 1255 1256
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1265 1266 1267 1268 1269 1270
    }
    var a;
    function inner() {
      function innerinner([a, b]) {}
    }
  }
1271 1272 1273
}
%PrepareFunctionForOptimization(TestRegress650969_18);
TestRegress650969_18();
1274

1275
function TestRegress650969_18() {
1276 1277 1278
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1279 1280 1281 1282 1283 1284
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1295 1296 1297 1298 1299 1300 1301
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1310 1311 1312 1313 1314 1315 1316
    }
    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
  for (var i = 0; i < 3; ++i) {
    if (i == 1) {
      %OptimizeOsr();
1325 1326 1327 1328 1329 1330 1331
    }
    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();