Commit ed13ea1e authored by mstarzinger's avatar mstarzinger Committed by Commit bot

[turbofan] Turn JSContextSpecializer into an AdvancedReducer.

This in turn allows usage of AdvancedReducer::ReplaceWithValue which
has access to the underlying graph reducer.

R=titzer@chromium.org

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

Cr-Commit-Position: refs/heads/master@{#28838}
parent b3d4bce5
...@@ -70,7 +70,7 @@ Reduction JSContextSpecializer::ReduceJSLoadContext(Node* node) { ...@@ -70,7 +70,7 @@ Reduction JSContextSpecializer::ReduceJSLoadContext(Node* node) {
// TODO(titzer): record the specialization for sharing code across multiple // TODO(titzer): record the specialization for sharing code across multiple
// contexts that have the same value in the corresponding context slot. // contexts that have the same value in the corresponding context slot.
Node* constant = jsgraph_->Constant(value); Node* constant = jsgraph_->Constant(value);
NodeProperties::ReplaceWithValue(node, constant); ReplaceWithValue(node, constant);
return Replace(constant); return Replace(constant);
} }
......
...@@ -15,9 +15,10 @@ namespace compiler { ...@@ -15,9 +15,10 @@ namespace compiler {
// Specializes a given JSGraph to a given context, potentially constant folding // Specializes a given JSGraph to a given context, potentially constant folding
// some {LoadContext} nodes or strength reducing some {StoreContext} nodes. // some {LoadContext} nodes or strength reducing some {StoreContext} nodes.
class JSContextSpecializer : public Reducer { class JSContextSpecializer : public AdvancedReducer {
public: public:
explicit JSContextSpecializer(JSGraph* jsgraph) : jsgraph_(jsgraph) {} JSContextSpecializer(Editor* editor, JSGraph* jsgraph)
: AdvancedReducer(editor), jsgraph_(jsgraph) {}
Reduction Reduce(Node* node) override; Reduction Reduce(Node* node) override;
......
...@@ -276,8 +276,8 @@ Reduction JSInliner::Reduce(Node* node) { ...@@ -276,8 +276,8 @@ Reduction JSInliner::Reduce(Node* node) {
// type feedback in the compiler. // type feedback in the compiler.
AstGraphBuilder graph_builder(local_zone_, &info, &jsgraph); AstGraphBuilder graph_builder(local_zone_, &info, &jsgraph);
graph_builder.CreateGraph(true, false); graph_builder.CreateGraph(true, false);
JSContextSpecializer context_specializer(&jsgraph);
GraphReducer graph_reducer(local_zone_, &graph); GraphReducer graph_reducer(local_zone_, &graph);
JSContextSpecializer context_specializer(&graph_reducer, &jsgraph);
graph_reducer.AddReducer(&context_specializer); graph_reducer.AddReducer(&context_specializer);
graph_reducer.ReduceGraph(); graph_reducer.ReduceGraph();
......
...@@ -496,8 +496,8 @@ struct ContextSpecializerPhase { ...@@ -496,8 +496,8 @@ struct ContextSpecializerPhase {
static const char* phase_name() { return "context specializing"; } static const char* phase_name() { return "context specializing"; }
void Run(PipelineData* data, Zone* temp_zone) { void Run(PipelineData* data, Zone* temp_zone) {
JSContextSpecializer spec(data->jsgraph());
JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); JSGraphReducer graph_reducer(data->jsgraph(), temp_zone);
JSContextSpecializer spec(&graph_reducer, data->jsgraph());
AddReducer(data, &graph_reducer, &spec); AddReducer(data, &graph_reducer, &spec);
graph_reducer.ReduceGraph(); graph_reducer.ReduceGraph();
} }
......
...@@ -22,8 +22,11 @@ class ContextSpecializationTester : public HandleAndZoneScope { ...@@ -22,8 +22,11 @@ class ContextSpecializationTester : public HandleAndZoneScope {
javascript_(main_zone()), javascript_(main_zone()),
machine_(main_zone()), machine_(main_zone()),
simplified_(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(); } Factory* factory() { return main_isolate()->factory(); }
CommonOperatorBuilder* common() { return &common_; } CommonOperatorBuilder* common() { return &common_; }
JSOperatorBuilder* javascript() { return &javascript_; } JSOperatorBuilder* javascript() { return &javascript_; }
...@@ -38,6 +41,8 @@ class ContextSpecializationTester : public HandleAndZoneScope { ...@@ -38,6 +41,8 @@ class ContextSpecializationTester : public HandleAndZoneScope {
MachineOperatorBuilder machine_; MachineOperatorBuilder machine_;
SimplifiedOperatorBuilder simplified_; SimplifiedOperatorBuilder simplified_;
JSGraph jsgraph_; JSGraph jsgraph_;
GraphReducer reducer_;
JSContextSpecializer spec_;
}; };
...@@ -60,13 +65,12 @@ TEST(ReduceJSLoadContext) { ...@@ -60,13 +65,12 @@ TEST(ReduceJSLoadContext) {
Node* const_context = t.jsgraph()->Constant(native); Node* const_context = t.jsgraph()->Constant(native);
Node* deep_const_context = t.jsgraph()->Constant(subcontext2); Node* deep_const_context = t.jsgraph()->Constant(subcontext2);
Node* param_context = t.graph()->NewNode(t.common()->Parameter(0), start); Node* param_context = t.graph()->NewNode(t.common()->Parameter(0), start);
JSContextSpecializer spec(t.jsgraph());
{ {
// Mutable slot, constant context, depth = 0 => do nothing. // Mutable slot, constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, 0, false), Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, 0, false),
const_context, const_context, start); const_context, const_context, start);
Reduction r = spec.ReduceJSLoadContext(load); Reduction r = t.spec()->ReduceJSLoadContext(load);
CHECK(!r.Changed()); CHECK(!r.Changed());
} }
...@@ -74,7 +78,7 @@ TEST(ReduceJSLoadContext) { ...@@ -74,7 +78,7 @@ TEST(ReduceJSLoadContext) {
// Mutable slot, non-constant context, depth = 0 => do nothing. // Mutable slot, non-constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, 0, false), Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, 0, false),
param_context, param_context, start); param_context, param_context, start);
Reduction r = spec.ReduceJSLoadContext(load); Reduction r = t.spec()->ReduceJSLoadContext(load);
CHECK(!r.Changed()); CHECK(!r.Changed());
} }
...@@ -83,7 +87,7 @@ TEST(ReduceJSLoadContext) { ...@@ -83,7 +87,7 @@ TEST(ReduceJSLoadContext) {
Node* load = t.graph()->NewNode( Node* load = t.graph()->NewNode(
t.javascript()->LoadContext(2, Context::GLOBAL_EVAL_FUN_INDEX, false), t.javascript()->LoadContext(2, Context::GLOBAL_EVAL_FUN_INDEX, false),
deep_const_context, deep_const_context, start); deep_const_context, deep_const_context, start);
Reduction r = spec.ReduceJSLoadContext(load); Reduction r = t.spec()->ReduceJSLoadContext(load);
CHECK(r.Changed()); CHECK(r.Changed());
Node* new_context_input = NodeProperties::GetValueInput(r.replacement(), 0); Node* new_context_input = NodeProperties::GetValueInput(r.replacement(), 0);
CHECK_EQ(IrOpcode::kHeapConstant, new_context_input->opcode()); CHECK_EQ(IrOpcode::kHeapConstant, new_context_input->opcode());
...@@ -99,7 +103,7 @@ TEST(ReduceJSLoadContext) { ...@@ -99,7 +103,7 @@ TEST(ReduceJSLoadContext) {
// Immutable slot, constant context, depth = 0 => specialize. // Immutable slot, constant context, depth = 0 => specialize.
Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, slot, true), Node* load = t.graph()->NewNode(t.javascript()->LoadContext(0, slot, true),
const_context, const_context, start); const_context, const_context, start);
Reduction r = spec.ReduceJSLoadContext(load); Reduction r = t.spec()->ReduceJSLoadContext(load);
CHECK(r.Changed()); CHECK(r.Changed());
CHECK(r.replacement() != load); CHECK(r.replacement() != load);
...@@ -132,13 +136,12 @@ TEST(ReduceJSStoreContext) { ...@@ -132,13 +136,12 @@ TEST(ReduceJSStoreContext) {
Node* const_context = t.jsgraph()->Constant(native); Node* const_context = t.jsgraph()->Constant(native);
Node* deep_const_context = t.jsgraph()->Constant(subcontext2); Node* deep_const_context = t.jsgraph()->Constant(subcontext2);
Node* param_context = t.graph()->NewNode(t.common()->Parameter(0), start); Node* param_context = t.graph()->NewNode(t.common()->Parameter(0), start);
JSContextSpecializer spec(t.jsgraph());
{ {
// Mutable slot, constant context, depth = 0 => do nothing. // Mutable slot, constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, 0), Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, 0),
const_context, const_context, start); const_context, const_context, start);
Reduction r = spec.ReduceJSStoreContext(load); Reduction r = t.spec()->ReduceJSStoreContext(load);
CHECK(!r.Changed()); CHECK(!r.Changed());
} }
...@@ -146,7 +149,7 @@ TEST(ReduceJSStoreContext) { ...@@ -146,7 +149,7 @@ TEST(ReduceJSStoreContext) {
// Mutable slot, non-constant context, depth = 0 => do nothing. // Mutable slot, non-constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, 0), Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, 0),
param_context, param_context, start); param_context, param_context, start);
Reduction r = spec.ReduceJSStoreContext(load); Reduction r = t.spec()->ReduceJSStoreContext(load);
CHECK(!r.Changed()); CHECK(!r.Changed());
} }
...@@ -154,7 +157,7 @@ TEST(ReduceJSStoreContext) { ...@@ -154,7 +157,7 @@ TEST(ReduceJSStoreContext) {
// Immutable slot, constant context, depth = 0 => do nothing. // Immutable slot, constant context, depth = 0 => do nothing.
Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, slot), Node* load = t.graph()->NewNode(t.javascript()->StoreContext(0, slot),
const_context, const_context, start); const_context, const_context, start);
Reduction r = spec.ReduceJSStoreContext(load); Reduction r = t.spec()->ReduceJSStoreContext(load);
CHECK(!r.Changed()); CHECK(!r.Changed());
} }
...@@ -163,7 +166,7 @@ TEST(ReduceJSStoreContext) { ...@@ -163,7 +166,7 @@ TEST(ReduceJSStoreContext) {
Node* load = t.graph()->NewNode( Node* load = t.graph()->NewNode(
t.javascript()->StoreContext(2, Context::GLOBAL_EVAL_FUN_INDEX), t.javascript()->StoreContext(2, Context::GLOBAL_EVAL_FUN_INDEX),
deep_const_context, deep_const_context, start); deep_const_context, deep_const_context, start);
Reduction r = spec.ReduceJSStoreContext(load); Reduction r = t.spec()->ReduceJSStoreContext(load);
CHECK(r.Changed()); CHECK(r.Changed());
Node* new_context_input = NodeProperties::GetValueInput(r.replacement(), 0); Node* new_context_input = NodeProperties::GetValueInput(r.replacement(), 0);
CHECK_EQ(IrOpcode::kHeapConstant, new_context_input->opcode()); CHECK_EQ(IrOpcode::kHeapConstant, new_context_input->opcode());
...@@ -197,7 +200,6 @@ TEST(SpecializeToContext) { ...@@ -197,7 +200,6 @@ TEST(SpecializeToContext) {
Node* const_context = t.jsgraph()->Constant(native); Node* const_context = t.jsgraph()->Constant(native);
Node* param_context = t.graph()->NewNode(t.common()->Parameter(0), start); Node* param_context = t.graph()->NewNode(t.common()->Parameter(0), start);
JSContextSpecializer spec(t.jsgraph());
{ {
// Check that specialization replaces values and forwards effects // Check that specialization replaces values and forwards effects
...@@ -232,6 +234,7 @@ TEST(SpecializeToContext) { ...@@ -232,6 +234,7 @@ TEST(SpecializeToContext) {
// Perform the reduction on the entire graph. // Perform the reduction on the entire graph.
GraphReducer graph_reducer(t.main_zone(), t.graph()); GraphReducer graph_reducer(t.main_zone(), t.graph());
JSContextSpecializer spec(&graph_reducer, t.jsgraph());
graph_reducer.AddReducer(&spec); graph_reducer.AddReducer(&spec);
graph_reducer.ReduceGraph(); graph_reducer.ReduceGraph();
......
...@@ -378,6 +378,7 @@ ...@@ -378,6 +378,7 @@
'regress/regress-331444': [PASS, SLOW], 'regress/regress-331444': [PASS, SLOW],
'regress/regress-490': [PASS, SLOW], 'regress/regress-490': [PASS, SLOW],
'regress/regress-crbug-217858': [PASS, SLOW], 'regress/regress-crbug-217858': [PASS, SLOW],
'regress/regress-crbug-491062': [PASS, SLOW],
'regress/regress-create-exception': [PASS, SLOW], 'regress/regress-create-exception': [PASS, SLOW],
'regress/regress-json-stringify-gc': [PASS, SLOW], 'regress/regress-json-stringify-gc': [PASS, SLOW],
'string-indexof-2': [PASS, SLOW], 'string-indexof-2': [PASS, SLOW],
......
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