1// Copyright 2013 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28// Flags: --allow-natives-syntax --load-elimination 29 30// Test local load elimination of redundant loads and stores. 31 32function B(x, y) { 33 this.x = x; 34 this.y = y; 35 return this; 36} 37 38function test_load() { 39 var a = new B(1, 2); 40 return a.x + a.x + a.x + a.x; 41} 42 43function test_store_load() { 44 var a = new B(1, 2); 45 a.x = 4; 46 var f = a.x; 47 a.x = 5; 48 var g = a.x; 49 a.x = 6; 50 var h = a.x; 51 a.x = 7; 52 return f + g + h + a.x; 53} 54 55function test_nonaliasing_store1() { 56 var a = new B(2, 3), b = new B(3, 4); 57 b.x = 4; 58 var f = a.x; 59 b.x = 5; 60 var g = a.x; 61 b.x = 6; 62 var h = a.x; 63 b.x = 7; 64 return f + g + h + a.x; 65} 66 67function killall() { 68 try { } catch(e) { } 69} 70 71%NeverOptimizeFunction(killall); 72 73function test_store_load_kill() { 74 var a = new B(1, 2); 75 a.x = 4; 76 var f = a.x; 77 a.x = 5; 78 var g = a.x; 79 killall(); 80 a.x = 6; 81 var h = a.x; 82 a.x = 7; 83 return f + g + h + a.x; 84} 85 86function test_store_store() { 87 var a = new B(6, 7); 88 a.x = 7; 89 a.x = 7; 90 a.x = 7; 91 a.x = 7; 92 return a.x; 93} 94 95function test(x, f) { 96 assertEquals(x, f()); 97 assertEquals(x, f()); 98 %OptimizeFunctionOnNextCall(f); 99 assertEquals(x, f()); 100} 101 102test(4, test_load); 103test(22, test_store_load); 104test(8, test_nonaliasing_store1); 105test(22, test_store_load_kill); 106test(7, test_store_store); 107