Commit 05797e77 authored by titzer@chromium.org's avatar titzer@chromium.org

Implement local load/store elimination on basic blocks.

BUG=
R=mstarzinger@chromium.org

Review URL: https://codereview.chromium.org/24117004

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16776 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 9f5edd1b
...@@ -254,6 +254,7 @@ DEFINE_bool(trace_hydrogen_stubs, false, "trace generated hydrogen for stubs") ...@@ -254,6 +254,7 @@ DEFINE_bool(trace_hydrogen_stubs, false, "trace generated hydrogen for stubs")
DEFINE_string(trace_hydrogen_file, NULL, "trace hydrogen to given file name") DEFINE_string(trace_hydrogen_file, NULL, "trace hydrogen to given file name")
DEFINE_string(trace_phase, "HLZ", "trace generated IR for specified phases") DEFINE_string(trace_phase, "HLZ", "trace generated IR for specified phases")
DEFINE_bool(trace_inlining, false, "trace inlining decisions") DEFINE_bool(trace_inlining, false, "trace inlining decisions")
DEFINE_bool(trace_load_elimination, false, "trace load elimination")
DEFINE_bool(trace_alloc, false, "trace register allocator") DEFINE_bool(trace_alloc, false, "trace register allocator")
DEFINE_bool(trace_all_uses, false, "trace all use positions") DEFINE_bool(trace_all_uses, false, "trace all use positions")
DEFINE_bool(trace_range, false, "trace range analysis") DEFINE_bool(trace_range, false, "trace range analysis")
...@@ -288,6 +289,7 @@ DEFINE_bool(array_index_dehoisting, true, ...@@ -288,6 +289,7 @@ DEFINE_bool(array_index_dehoisting, true,
"perform array index dehoisting") "perform array index dehoisting")
DEFINE_bool(analyze_environment_liveness, true, DEFINE_bool(analyze_environment_liveness, true,
"analyze liveness of environment slots and zap dead values") "analyze liveness of environment slots and zap dead values")
DEFINE_bool(load_elimination, false, "use load elimination")
DEFINE_bool(dead_code_elimination, true, "use dead code elimination") DEFINE_bool(dead_code_elimination, true, "use dead code elimination")
DEFINE_bool(fold_constants, true, "use constant folding") DEFINE_bool(fold_constants, true, "use constant folding")
DEFINE_bool(trace_dead_code_elimination, false, "trace dead code elimination") DEFINE_bool(trace_dead_code_elimination, false, "trace dead code elimination")
......
This diff is collapsed.
// Copyright 2013 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef V8_HYDROGEN_LOAD_ELIMINATION_H_
#define V8_HYDROGEN_LOAD_ELIMINATION_H_
#include "hydrogen.h"
namespace v8 {
namespace internal {
class HLoadEliminationPhase : public HPhase {
public:
explicit HLoadEliminationPhase(HGraph* graph)
: HPhase("H_Load elimination", graph) { }
void Run();
private:
void EliminateLoads(HBasicBlock* block);
};
} } // namespace v8::internal
#endif // V8_HYDROGEN_LOAD_ELIMINATION_H_
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "hydrogen-escape-analysis.h" #include "hydrogen-escape-analysis.h"
#include "hydrogen-infer-representation.h" #include "hydrogen-infer-representation.h"
#include "hydrogen-infer-types.h" #include "hydrogen-infer-types.h"
#include "hydrogen-load-elimination.h"
#include "hydrogen-gvn.h" #include "hydrogen-gvn.h"
#include "hydrogen-mark-deoptimize.h" #include "hydrogen-mark-deoptimize.h"
#include "hydrogen-minus-zero.h" #include "hydrogen-minus-zero.h"
...@@ -2971,6 +2972,8 @@ bool HGraph::Optimize(BailoutReason* bailout_reason) { ...@@ -2971,6 +2972,8 @@ bool HGraph::Optimize(BailoutReason* bailout_reason) {
if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>(); if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>();
if (FLAG_load_elimination) Run<HLoadEliminationPhase>();
CollectPhis(); CollectPhis();
if (has_osr()) osr()->FinishOsrValues(); if (has_osr()) osr()->FinishOsrValues();
......
// Copyright 2013 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Flags: --allow-natives-syntax --load-elimination
// Test local load elimination of redundant loads and stores.
function B(x, y) {
this.x = x;
this.y = y;
return this;
}
function test_load() {
var a = new B(1, 2);
return a.x + a.x + a.x + a.x;
}
function test_store_load() {
var a = new B(1, 2);
a.x = 4;
var f = a.x;
a.x = 5;
var g = a.x;
a.x = 6;
var h = a.x;
a.x = 7;
return f + g + h + a.x;
}
function test_nonaliasing_store1() {
var a = new B(2, 3), b = new B(3, 4);
b.x = 4;
var f = a.x;
b.x = 5;
var g = a.x;
b.x = 6;
var h = a.x;
b.x = 7;
return f + g + h + a.x;
}
function killall() {
try { } catch(e) { }
}
%NeverOptimizeFunction(killall);
function test_store_load_kill() {
var a = new B(1, 2);
a.x = 4;
var f = a.x;
a.x = 5;
var g = a.x;
killall();
a.x = 6;
var h = a.x;
a.x = 7;
return f + g + h + a.x;
}
function test_store_store() {
var a = new B(6, 7);
a.x = 7;
a.x = 7;
a.x = 7;
a.x = 7;
return a.x;
}
function test(x, f) {
assertEquals(x, f());
assertEquals(x, f());
%OptimizeFunctionOnNextCall(f);
assertEquals(x, f());
}
test(4, test_load);
test(22, test_store_load);
test(8, test_nonaliasing_store1);
test(22, test_store_load_kill);
test(7, test_store_store);
...@@ -353,6 +353,8 @@ ...@@ -353,6 +353,8 @@
'../../src/hydrogen-infer-representation.h', '../../src/hydrogen-infer-representation.h',
'../../src/hydrogen-infer-types.cc', '../../src/hydrogen-infer-types.cc',
'../../src/hydrogen-infer-types.h', '../../src/hydrogen-infer-types.h',
'../../src/hydrogen-load-elimination.cc',
'../../src/hydrogen-load-elimination.h',
'../../src/hydrogen-mark-deoptimize.cc', '../../src/hydrogen-mark-deoptimize.cc',
'../../src/hydrogen-mark-deoptimize.h', '../../src/hydrogen-mark-deoptimize.h',
'../../src/hydrogen-minus-zero.cc', '../../src/hydrogen-minus-zero.cc',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment