1fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
27979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// Redistribution and use in source and binary forms, with or without
37979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// modification, are permitted provided that the following conditions are
47979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// met:
57979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//
67979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//     * Redistributions of source code must retain the above copyright
77979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//       notice, this list of conditions and the following disclaimer.
87979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//     * Redistributions in binary form must reproduce the above
97979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//       copyright notice, this list of conditions and the following
107979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//       disclaimer in the documentation and/or other materials provided
117979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//       with the distribution.
127979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//     * Neither the name of Google Inc. nor the names of its
137979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//       contributors may be used to endorse or promote products derived
147979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//       from this software without specific prior written permission.
157979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org//
167979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
28935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org// Flags: --allow-natives-syntax
297979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
30935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgvar S1 = "string1";
31935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgvar S2 = "@@string2";
327ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org
33935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgfunction dead1(a, b) {
34935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    var x = %StringCharCodeAt(a, 4);
35935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    return a; // x is dead code
36935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org}
377979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
38935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgfunction dead2(a, b) {
39935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    var x = %StringCharCodeAt(a, 3);
40935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    var y = %StringCharCodeAt(b, 1);
41935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    return a; // x and y are both dead
42fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
437979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
44935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgfunction dead3(a, b) {
45935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    a = a ? "11" : "12";
46935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    b = b ? "13" : "14";
47935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    var x = %StringCharCodeAt(a, 2);
48935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    var y = %StringCharCodeAt(b, 0);
49935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org    return a; // x and y are both dead
507979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org}
517979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
52935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgfunction test() {
53935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  var S3 = S1 + S2;
54935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org
55935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals(S1, dead1(S1, S2));
56935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals(S1, dead2(S1, S2));
57935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals("11", dead3(S1, S2));
58fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
59935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals(S2, dead1(S2, 677));
60935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals(S2, dead2(S2, S3));
61935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals("11", dead3(S2, S3));
627979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
63935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals(S3, dead1(S3, 399));
64935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals(S3, dead2(S3, "false"));
65935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals("12", dead3(0, 32));
66935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org
67935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals(S3, dead1(S3, 0));
68935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals(S3, dead2(S3, S1));
69935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals("11", dead3(S3, 0));
70935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org
71935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals("true", dead1("true", 0));
72935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals("true", dead2("true", S3));
73935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org  assertEquals("11", dead3("true", 0));
74935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org}
757979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
76935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgtest();
77935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgtest();
78935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org%OptimizeFunctionOnNextCall(dead1);
79935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org%OptimizeFunctionOnNextCall(dead2);
80935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org%OptimizeFunctionOnNextCall(dead3);
81935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgtest();
82