Home | History | Annotate | Download | only in compiler
      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 global load elimination of redundant loads and stores.
     31 
     32 var X = true;  // For forcing branches.
     33 X = false;
     34 X = true;
     35 X = false;
     36 
     37 function B(x, y) {
     38   this.x = x;
     39   this.y = y;
     40   return this;
     41 }
     42 
     43 function test_load() {
     44   var a = new B(1, 2);
     45   var f = a.x + a.x;
     46   if (false) ;
     47   return f + a.x + a.x;
     48 }
     49 
     50 function test_load2() {
     51   var a = new B(1, 2);
     52   var f = a.x + a.x;
     53   if (true) ;
     54   return f + a.x + a.x;
     55 }
     56 
     57 function test_store_load() {
     58   var a = new B(1, 2);
     59   a.x = 4;
     60   var b = X ? a.x : a.x;
     61   return b + a.x;
     62 }
     63 
     64 function test_store_load2() {
     65   var a = new B(1, 2);
     66   var c = 6;
     67   if (X) a.x = c;
     68   else a.x = c;
     69   return a.x + a.x;
     70 }
     71 
     72 function test_nonaliasing_store1() {
     73   var a = new B(2, 3), b = new B(3, 4);
     74   if (X) ;
     75   b.x = 4;
     76   if (X) ;
     77   var f = a.x;
     78   if (X) ;
     79   b.x = 5;
     80   if (X) ;
     81   var g = a.x;
     82   if (X) ;
     83   b.x = 6;
     84   if (X) ;
     85   var h = a.x;
     86   if (X) ;
     87   b.x = 7;
     88   if (X) ;
     89   return f + g + h + a.x;
     90 }
     91 
     92 function test_loop(x) {
     93   var a = new B(2, 3);
     94   var v = a.x;
     95   var total = v;
     96   var i = 0;
     97   while (i++ < 10) {
     98     total = a.x;
     99     a.y = 4;
    100   }
    101   return total;
    102 }
    103 
    104 function test_loop2(x) {
    105   var a = new B(2, 3);
    106   var v = a.x;
    107   var total = v;
    108   var i = 0;
    109   while (i++ < 10) {
    110     total = a.x;  // a.x not affected by loop
    111     a.y = 4;
    112 
    113     var j = 0;
    114     while (j++ < 10) {
    115       total = a.x;  // a.x not affected by loop
    116       a.y = 5;
    117     }
    118 
    119     total = a.x;
    120     a.y = 6;
    121 
    122     j = 0;
    123     while (j++ < 10) {
    124       total = a.x;  // a.x not affected by loop
    125       a.y = 7;
    126     }
    127   }
    128   return total;
    129 }
    130 
    131 function killall() {
    132   try { } catch(e) { }
    133 }
    134 
    135 %NeverOptimizeFunction(killall);
    136 
    137 function test_store_load_kill() {
    138   var a = new B(1, 2);
    139   if (X) ;
    140   a.x = 4;
    141   if (X) ;
    142   var f = a.x;
    143   if (X) ;
    144   a.x = 5;
    145   if (X) ;
    146   var g = a.x;
    147   if (X) ;
    148   killall();
    149   if (X) ;
    150   a.x = 6;
    151   if (X) ;
    152   var h = a.x;
    153   if (X) ;
    154   a.x = 7;
    155   if (X) ;
    156   return f + g + h + a.x;
    157 }
    158 
    159 function test_store_store() {
    160   var a = new B(6, 7);
    161   if (X) ;
    162   a.x = 7;
    163   if (X) ;
    164   a.x = 7;
    165   if (X) ;
    166   a.x = 7;
    167   if (X) ;
    168   a.x = 7;
    169   if (X) ;
    170   return a.x;
    171 }
    172 
    173 function test(x, f) {
    174   X = true;
    175   assertEquals(x, f());
    176   assertEquals(x, f());
    177   X = false;
    178   assertEquals(x, f());
    179   assertEquals(x, f());
    180   X = true;
    181   %OptimizeFunctionOnNextCall(f);
    182   assertEquals(x, f());
    183   assertEquals(x, f());
    184   X = false;
    185   assertEquals(x, f());
    186   assertEquals(x, f());
    187 }
    188 
    189 test(4, test_load);
    190 test(8, test_store_load);
    191 test(12, test_store_load2);
    192 test(8, test_nonaliasing_store1);
    193 test(22, test_store_load_kill);
    194 test(7, test_store_store);
    195 test(2, test_loop);
    196 test(2, test_loop2);
    197