Reviewers: titzer,
Description:
[turbofan] Turn JSContextSpecializer into an AdvancedReducer.
This in turn allows usage of AdvancedReducer::ReplaceWithValue which
has access to the underlying graph reducer.
[email protected]
Please review this at https://codereview.chromium.org/1162903006/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+21, -17 lines):
M src/compiler/js-context-specialization.h
M src/compiler/js-context-specialization.cc
M src/compiler/js-inlining.cc
M src/compiler/pipeline.cc
M test/cctest/compiler/test-js-context-specialization.cc
Index: src/compiler/js-context-specialization.cc
diff --git a/src/compiler/js-context-specialization.cc
b/src/compiler/js-context-specialization.cc
index
1bf19ac7d6876017ef4cba9f634f85b0251a4738..a39b66fbc85a002665117d75a26ad20cc7ce8114
100644
--- a/src/compiler/js-context-specialization.cc
+++ b/src/compiler/js-context-specialization.cc
@@ -70,7 +70,7 @@ Reduction JSContextSpecializer::ReduceJSLoadContext(Node*
node) {
// TODO(titzer): record the specialization for sharing code across
multiple
// contexts that have the same value in the corresponding context slot.
Node* constant = jsgraph_->Constant(value);
- NodeProperties::ReplaceWithValue(node, constant);
+ ReplaceWithValue(node, constant);
return Replace(constant);
}
Index: src/compiler/js-context-specialization.h
diff --git a/src/compiler/js-context-specialization.h
b/src/compiler/js-context-specialization.h
index
4a2ce9829ad55c070c6165c6b1c848e72dce74e5..f01ac3f9707e702bb15c1299d5a7d57c7901e7d5
100644
--- a/src/compiler/js-context-specialization.h
+++ b/src/compiler/js-context-specialization.h
@@ -15,9 +15,10 @@ namespace compiler {
// Specializes a given JSGraph to a given context, potentially constant
folding
// some {LoadContext} nodes or strength reducing some {StoreContext} nodes.
-class JSContextSpecializer : public Reducer {
+class JSContextSpecializer : public AdvancedReducer {
public:
- explicit JSContextSpecializer(JSGraph* jsgraph) : jsgraph_(jsgraph) {}
+ JSContextSpecializer(Editor* editor, JSGraph* jsgraph)
+ : AdvancedReducer(editor), jsgraph_(jsgraph) {}
Reduction Reduce(Node* node) override;
Index: src/compiler/js-inlining.cc
diff --git a/src/compiler/js-inlining.cc b/src/compiler/js-inlining.cc
index
e587f882bcdec0e2f485630f68be241df4fa3f3b..b26b40502de250ee685c736aea4424f0ba221957
100644
--- a/src/compiler/js-inlining.cc
+++ b/src/compiler/js-inlining.cc
@@ -276,8 +276,8 @@ Reduction JSInliner::Reduce(Node* node) {
// type feedback in the compiler.
AstGraphBuilder graph_builder(local_zone_, &info, &jsgraph);
graph_builder.CreateGraph(true, false);
- JSContextSpecializer context_specializer(&jsgraph);
GraphReducer graph_reducer(local_zone_, &graph);
+ JSContextSpecializer context_specializer(&graph_reducer, &jsgraph);
graph_reducer.AddReducer(&context_specializer);
graph_reducer.ReduceGraph();
Index: src/compiler/pipeline.cc
diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc
index
20f3d60daab8cd33f27a6c5d61c3be0fd71a4fc7..e83281453437fe87062e728674be4253a3248c05
100644
--- a/src/compiler/pipeline.cc
+++ b/src/compiler/pipeline.cc
@@ -496,8 +496,8 @@ struct ContextSpecializerPhase {
static const char* phase_name() { return "context specializing"; }
void Run(PipelineData* data, Zone* temp_zone) {
- JSContextSpecializer spec(data->jsgraph());
JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
+ JSContextSpecializer spec(&graph_reducer, data->jsgraph());
AddReducer(data, &graph_reducer, &spec);
graph_reducer.ReduceGraph();
}
Index: test/cctest/compiler/test-js-context-specialization.cc
diff --git a/test/cctest/compiler/test-js-context-specialization.cc
b/test/cctest/compiler/test-js-context-specialization.cc
index
7eb50085b6fde35515ce22298d109689074e37f4..6148a12a40f558ec00645a6996adfce886ad625c
100644
--- a/test/cctest/compiler/test-js-context-specialization.cc
+++ b/test/cctest/compiler/test-js-context-specialization.cc
@@ -22,8 +22,11 @@ class ContextSpecializationTester : public
HandleAndZoneScope {
javascript_(main_zone()),
machine_(main_zone()),
simplified_(main_zone()),
- jsgraph_(main_isolate(), graph(), common(), &javascript_,
&machine_) {}
+ jsgraph_(main_isolate(), graph(), common(), &javascript_,
&machine_),
+ reducer_(main_zone(), graph()),
+ spec_(&reducer_, jsgraph()) {}
+ JSContextSpecializer* spec() { return &spec_; }
Factory* factory() { return main_isolate()->factory(); }
CommonOperatorBuilder* common() { return &common_; }
JSOperatorBuilder* javascript() { return &javascript_; }
@@ -38,6 +41,8 @@ class ContextSpecializationTester : public
HandleAndZoneScope {
MachineOperatorBuilder machine_;
SimplifiedOperatorBuilder simplified_;
JSGraph jsgraph_;
+ GraphReducer reducer_;
+ JSContextSpecializer spec_;
};
@@ -60,13 +65,12 @@ TEST(ReduceJSLoadContext) {
Node* const_context = t.jsgraph()->Constant(native);
Node* deep_const_context = t.jsgraph()->Constant(subcontext2);
Node* param_context = t.graph()->NewNode(t.common()->Parameter(0),
start);
- JSContextSpecializer spec(t.jsgraph());
{
// Mutable slot, constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, 0,
false),
const_context, const_context, start);
- Reduction r = spec.ReduceJSLoadContext(load);
+ Reduction r = t.spec()->ReduceJSLoadContext(load);
CHECK(!r.Changed());
}
@@ -74,7 +78,7 @@ TEST(ReduceJSLoadContext) {
// Mutable slot, non-constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, 0,
false),
param_context, param_context, start);
- Reduction r = spec.ReduceJSLoadContext(load);
+ Reduction r = t.spec()->ReduceJSLoadContext(load);
CHECK(!r.Changed());
}
@@ -83,7 +87,7 @@ TEST(ReduceJSLoadContext) {
Node* load = t.graph()->NewNode(
t.javascript()->LoadContext(2, Context::GLOBAL_EVAL_FUN_INDEX,
false),
deep_const_context, deep_const_context, start);
- Reduction r = spec.ReduceJSLoadContext(load);
+ Reduction r = t.spec()->ReduceJSLoadContext(load);
CHECK(r.Changed());
Node* new_context_input =
NodeProperties::GetValueInput(r.replacement(), 0);
CHECK_EQ(IrOpcode::kHeapConstant, new_context_input->opcode());
@@ -99,7 +103,7 @@ TEST(ReduceJSLoadContext) {
// Immutable slot, constant context, depth = 0 => specialize.
Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, slot,
true),
const_context, const_context, start);
- Reduction r = spec.ReduceJSLoadContext(load);
+ Reduction r = t.spec()->ReduceJSLoadContext(load);
CHECK(r.Changed());
CHECK(r.replacement() != load);
@@ -132,13 +136,12 @@ TEST(ReduceJSStoreContext) {
Node* const_context = t.jsgraph()->Constant(native);
Node* deep_const_context = t.jsgraph()->Constant(subcontext2);
Node* param_context = t.graph()->NewNode(t.common()->Parameter(0),
start);
- JSContextSpecializer spec(t.jsgraph());
{
// Mutable slot, constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, 0),
const_context, const_context, start);
- Reduction r = spec.ReduceJSStoreContext(load);
+ Reduction r = t.spec()->ReduceJSStoreContext(load);
CHECK(!r.Changed());
}
@@ -146,7 +149,7 @@ TEST(ReduceJSStoreContext) {
// Mutable slot, non-constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, 0),
param_context, param_context, start);
- Reduction r = spec.ReduceJSStoreContext(load);
+ Reduction r = t.spec()->ReduceJSStoreContext(load);
CHECK(!r.Changed());
}
@@ -154,7 +157,7 @@ TEST(ReduceJSStoreContext) {
// Immutable slot, constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, slot),
const_context, const_context, start);
- Reduction r = spec.ReduceJSStoreContext(load);
+ Reduction r = t.spec()->ReduceJSStoreContext(load);
CHECK(!r.Changed());
}
@@ -163,7 +166,7 @@ TEST(ReduceJSStoreContext) {
Node* load = t.graph()->NewNode(
t.javascript()->StoreContext(2, Context::GLOBAL_EVAL_FUN_INDEX),
deep_const_context, deep_const_context, start);
- Reduction r = spec.ReduceJSStoreContext(load);
+ Reduction r = t.spec()->ReduceJSStoreContext(load);
CHECK(r.Changed());
Node* new_context_input =
NodeProperties::GetValueInput(r.replacement(), 0);
CHECK_EQ(IrOpcode::kHeapConstant, new_context_input->opcode());
@@ -197,7 +200,6 @@ TEST(SpecializeToContext) {
Node* const_context = t.jsgraph()->Constant(native);
Node* param_context = t.graph()->NewNode(t.common()->Parameter(0),
start);
- JSContextSpecializer spec(t.jsgraph());
{
// Check that specialization replaces values and forwards effects
@@ -232,6 +234,7 @@ TEST(SpecializeToContext) {
// Perform the reduction on the entire graph.
GraphReducer graph_reducer(t.main_zone(), t.graph());
+ JSContextSpecializer spec(&graph_reducer, t.jsgraph());
graph_reducer.AddReducer(&spec);
graph_reducer.ReduceGraph();
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.