1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without 33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are 43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met: 53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Redistributions of source code must retain the above copyright 73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// notice, this list of conditions and the following disclaimer. 83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Redistributions in binary form must reproduce the above 93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// copyright notice, this list of conditions and the following 103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// disclaimer in the documentation and/or other materials provided 113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// with the distribution. 123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Neither the name of Google Inc. nor the names of its 133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// contributors may be used to endorse or promote products derived 143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// from this software without specific prior written permission. 153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --allow-natives-syntax --expose-gc 293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// IC and Crankshaft support for smi-only elements in dynamic array literals. 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction get(foo) { return foo; } // Used to generate dynamic values. 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction array_literal_test() { 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a0 = [1, 2, 3]; 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(%HasFastSmiElements(a0)); 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var a1 = [get(1), get(2), get(3)]; 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(%HasFastSmiElements(a1)); 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var b0 = [1, 2, get("three")]; 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(%HasFastObjectElements(b0)); 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var b1 = [get(1), get(2), get("three")]; 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(%HasFastObjectElements(b1)); 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var c0 = [1, 2, get(3.5)]; 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HasFastDoubleElements(c0)); 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(3.5, c0[2]); 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2, c0[1]); 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(1, c0[0]); 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var c1 = [1, 2, 3.5]; 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HasFastDoubleElements(c1)); 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(3.5, c1[2]); 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2, c1[1]); 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(1, c1[0]); 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var c2 = [get(1), get(2), get(3.5)]; 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HasFastDoubleElements(c2)); 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(3.5, c2[2]); 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2, c2[1]); 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(1, c2[0]); 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var object = new Object(); 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var d0 = [1, 2, object]; 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(%HasFastObjectElements(d0)); 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(object, d0[2]); 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2, d0[1]); 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(1, d0[0]); 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var e0 = [1, 2, 3.5]; 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertTrue(%HasFastDoubleElements(e0)); 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(3.5, e0[2]); 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2, e0[1]); 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(1, e0[0]); 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var f0 = [1, 2, [1, 2]]; 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(%HasFastObjectElements(f0)); 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals([1,2], f0[2]); 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(2, f0[1]); 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertEquals(1, f0[0]); 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 3; i++) { 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch array_literal_test(); 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %OptimizeFunctionOnNextCall(array_literal_test); 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray_literal_test(); 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction test_large_literal() { 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function d() { 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch gc(); 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 2.5; 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function o() { 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch gc(); 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new Object(); 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch large = 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch [ 0, 1, 2, 3, 4, 5, d(), d(), d(), d(), d(), d(), o(), o(), o(), o() ]; 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertFalse(%HasDictionaryElements(large)); 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertFalse(%HasFastSmiElements(large)); 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertFalse(%HasFastDoubleElements(large)); 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(%HasFastObjectElements(large)); 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(large, 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch [0, 1, 2, 3, 4, 5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new Object(), new Object(), new Object(), new Object()]); 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 3; i++) { 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch test_large_literal(); 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch %OptimizeFunctionOnNextCall(test_large_literal); 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtest_large_literal(); 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction deopt_array(use_literal) { 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (use_literal) { 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return [.5, 3, 4]; 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new Array(); 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array(false); 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array(false); 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array(false); 1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch %OptimizeFunctionOnNextCall(deopt_array); 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar array = deopt_array(false); 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertOptimized(deopt_array); 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array(true); 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertOptimized(deopt_array); 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray = deopt_array(false); 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertOptimized(deopt_array); 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Check that unexpected changes in the objects stored into the boilerplate 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// also force a deopt. 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction deopt_array_literal_all_smis(a) { 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return [0, 1, a]; 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array_literal_all_smis(2); 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array_literal_all_smis(3); 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array_literal_all_smis(4); 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray = deopt_array_literal_all_smis(4); 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(0, array[0]); 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, array[1]); 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(4, array[2]); 1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch %OptimizeFunctionOnNextCall(deopt_array_literal_all_smis); 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray = deopt_array_literal_all_smis(5); 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray = deopt_array_literal_all_smis(6); 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertOptimized(deopt_array_literal_all_smis); 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(0, array[0]); 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, array[1]); 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(6, array[2]); 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray = deopt_array_literal_all_smis(.5); 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertUnoptimized(deopt_array_literal_all_smis); 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(0, array[0]); 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, array[1]); 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(.5, array[2]); 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction deopt_array_literal_all_doubles(a) { 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return [0.5, 1, a]; 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array_literal_all_doubles(.5); 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array_literal_all_doubles(.5); 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdeopt_array_literal_all_doubles(.5); 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray = deopt_array_literal_all_doubles(0.5); 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(0.5, array[0]); 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, array[1]); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(0.5, array[2]); 1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch %OptimizeFunctionOnNextCall(deopt_array_literal_all_doubles); 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray = deopt_array_literal_all_doubles(5); 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray = deopt_array_literal_all_doubles(6); 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertOptimized(deopt_array_literal_all_doubles); 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(0.5, array[0]); 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, array[1]); 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(6, array[2]); 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar foo = new Object(); 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdocharray = deopt_array_literal_all_doubles(foo); 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertUnoptimized(deopt_array_literal_all_doubles); 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(0.5, array[0]); 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(1, array[1]); 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(foo, array[2]); 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function literals_after_osr() { 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var color = [0]; 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Trigger OSR, if optimization is not disabled. 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (%GetOptimizationStatus(literals_after_osr) != 4) { 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (%GetOptimizationCount(literals_after_osr) == 0) {} 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return [color[0]]; 1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})(); 197