15533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 25533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// Redistribution and use in source and binary forms, with or without 35533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// modification, are permitted provided that the following conditions are 45533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// met: 55533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// 65533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// * Redistributions of source code must retain the above copyright 75533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// notice, this list of conditions and the following disclaimer. 85533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// * Redistributions in binary form must reproduce the above 95533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// copyright notice, this list of conditions and the following 105533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// disclaimer in the documentation and/or other materials provided 115533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// with the distribution. 125533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// * Neither the name of Google Inc. nor the names of its 135533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// contributors may be used to endorse or promote products derived 145533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// from this software without specific prior written permission. 155533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// 165533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 285533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org// Flags: --allow-natives-syntax --check-elimination 295533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 305533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgfunction A(x, y) { 315533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org this.x = x; 325533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org this.y = y; 335533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org} 345533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 355533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgfunction B(x, y) { 365533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org this.x = x; 375533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org this.y = y; 385533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org} 395533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 405533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgfunction F1(a, b) { 415533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org if (a == b) return a.x; 425533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org else return b.x; 435533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org} 445533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 455533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgfunction F2(a, b) { 465533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org if (a == b) return a.x; 475533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org else return b.x; 485533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org} 495533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 505533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgfunction F3(a, b) { 515533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org var f = a.y; 525533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org if (a == b) return a.x; 535533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org else return b.x; 545533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org} 555533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 565533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgfunction F4(a, b) { 575533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org var f = b.y; 585533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org if (a == b) return a.x; 595533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org else return b.x; 605533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org} 615533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 625533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org%NeverOptimizeFunction(test); 635533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 645533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgfunction test(f, a, b) { 655533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org f(a, a); 665533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org f(a, b); 675533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org f(b, a); 685533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org f(b, c); 695533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org f(b, b); 705533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org f(c, c); 715533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 725533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org %OptimizeFunctionOnNextCall(f) 735533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 745533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org assertEquals(a.x, f(a, a)); 755533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org assertEquals(b.x, f(b, b)); 765533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org} 775533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 785533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgvar a = new A(3, 5); 795533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgvar b = new B(2, 6); 805533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgvar c = new A(1, 7); 815533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.org 825533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgtest(F1, a, c); 835533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgtest(F2, a, b); 845533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgtest(F3, a, b); 855533f7fe6473bcffd84fdefc0b9ea9f92bdab978machenbach@chromium.orgtest(F4, a, b); 86