| Index: src/compiler/js-typed-lowering.cc | 
| diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc | 
| index 7d8d20043e43711289215b286115fd16f9f30d24..23c269d4e4410cec055142b507b809433f9883ea 100644 | 
| --- a/src/compiler/js-typed-lowering.cc | 
| +++ b/src/compiler/js-typed-lowering.cc | 
| @@ -21,25 +21,8 @@ namespace compiler { | 
| // - relax effects from generic but not-side-effecting operations | 
|  | 
|  | 
| -// Relax the effects of {node} by immediately replacing effect and control uses | 
| -// of {node} with the effect and control input to {node}. | 
| -// TODO(turbofan): replace the effect input to {node} with {graph->start()}. | 
| -// TODO(titzer): move into a GraphEditor? | 
| -static void RelaxEffectsAndControls(Node* node) { | 
| -  NodeProperties::ReplaceWithValue(node, node, NULL); | 
| -} | 
| - | 
| - | 
| -// Relax the control uses of {node} by immediately replacing them with the | 
| -// control input to {node}. | 
| -// TODO(titzer): move into a GraphEditor? | 
| -static void RelaxControls(Node* node) { | 
| -  NodeProperties::ReplaceWithValue(node, node, node); | 
| -} | 
| - | 
| - | 
| -JSTypedLowering::JSTypedLowering(JSGraph* jsgraph, Zone* zone) | 
| -    : jsgraph_(jsgraph), simplified_(graph()->zone()) { | 
| +JSTypedLowering::JSTypedLowering(Editor* editor, JSGraph* jsgraph, Zone* zone) | 
| +    : AdvancedReducer(editor), jsgraph_(jsgraph), simplified_(graph()->zone()) { | 
| zero_range_ = Type::Range(0.0, 0.0, graph()->zone()); | 
| one_range_ = Type::Range(1.0, 1.0, graph()->zone()); | 
| zero_thirtyone_range_ = Type::Range(0.0, 31.0, graph()->zone()); | 
| @@ -51,12 +34,6 @@ JSTypedLowering::JSTypedLowering(JSGraph* jsgraph, Zone* zone) | 
| } | 
|  | 
|  | 
| -Reduction JSTypedLowering::ReplaceEagerly(Node* old, Node* node) { | 
| -  NodeProperties::ReplaceWithValue(old, node, node); | 
| -  return Changed(node); | 
| -} | 
| - | 
| - | 
| // A helper class to construct inline allocations on the simplified operator | 
| // level. This keeps track of the effect chain for initial stores on a newly | 
| // allocated object and also provides helpers for commonly allocated objects. | 
| @@ -189,7 +166,7 @@ class JSBinopReduction final { | 
|  | 
| // Remove the effects from the node, and update its effect/control usages. | 
| if (node_->op()->EffectInputCount() > 0) { | 
| -      RelaxEffectsAndControls(node_); | 
| +      lowering_->RelaxEffectsAndControls(node_); | 
| } | 
| // Remove the inputs corresponding to context, effect, and control. | 
| NodeProperties::RemoveNonValueInputs(node_); | 
| @@ -550,14 +527,18 @@ Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) { | 
| if (r.left() == r.right()) { | 
| // x === x is always true if x != NaN | 
| if (!r.left_type()->Maybe(Type::NaN())) { | 
| -      return ReplaceEagerly(node, jsgraph()->BooleanConstant(!invert)); | 
| +      Node* replacement = jsgraph()->BooleanConstant(!invert); | 
| +      Replace(node, replacement); | 
| +      return Replace(replacement); | 
| } | 
| } | 
| if (r.OneInputCannotBe(Type::NumberOrString())) { | 
| // For values with canonical representation (i.e. not string nor number) an | 
| // empty type intersection means the values cannot be strictly equal. | 
| if (!r.left_type()->Maybe(r.right_type())) { | 
| -      return ReplaceEagerly(node, jsgraph()->BooleanConstant(invert)); | 
| +      Node* replacement = jsgraph()->BooleanConstant(invert); | 
| +      Replace(node, replacement); | 
| +      return Replace(replacement); | 
| } | 
| } | 
| if (r.OneInputIs(Type::Undefined())) { | 
| @@ -615,7 +596,7 @@ Reduction JSTypedLowering::ReduceJSUnaryNot(Node* node) { | 
| node->set_op(simplified()->NumberEqual()); | 
| node->ReplaceInput(0, length); | 
| node->ReplaceInput(1, jsgraph()->ZeroConstant()); | 
| -    NodeProperties::ReplaceWithValue(node, node, length); | 
| +    ReplaceWithValue(node, node, length); | 
| DCHECK_EQ(2, node->InputCount()); | 
| return Changed(node); | 
| } | 
| @@ -688,7 +669,7 @@ Reduction JSTypedLowering::ReduceJSToNumber(Node* node) { | 
| Node* const input = node->InputAt(0); | 
| Reduction reduction = ReduceJSToNumberInput(input); | 
| if (reduction.Changed()) { | 
| -    NodeProperties::ReplaceWithValue(node, reduction.replacement()); | 
| +    ReplaceWithValue(node, reduction.replacement()); | 
| return reduction; | 
| } | 
| Type* const input_type = NodeProperties::GetBounds(input).upper; | 
| @@ -741,7 +722,7 @@ Reduction JSTypedLowering::ReduceJSToString(Node* node) { | 
| Node* const input = node->InputAt(0); | 
| Reduction reduction = ReduceJSToStringInput(input); | 
| if (reduction.Changed()) { | 
| -    NodeProperties::ReplaceWithValue(node, reduction.replacement()); | 
| +    ReplaceWithValue(node, reduction.replacement()); | 
| return reduction; | 
| } | 
| return NoChange(); | 
| @@ -757,7 +738,7 @@ Reduction JSTypedLowering::ReduceJSLoadNamed(Node* node) { | 
| Handle<Object> constant_value = factory()->GlobalConstantFor(name); | 
| if (!constant_value.is_null()) { | 
| Node* constant = jsgraph()->Constant(constant_value); | 
| -      NodeProperties::ReplaceWithValue(node, constant); | 
| +      ReplaceWithValue(node, constant); | 
| return Replace(constant); | 
| } | 
| } | 
| @@ -795,13 +776,15 @@ Reduction JSTypedLowering::ReduceJSLoadProperty(Node* node) { | 
| simplified()->LoadElement( | 
| AccessBuilder::ForTypedArrayElement(array->type(), true)), | 
| buffer, key, effect, control); | 
| -          return ReplaceEagerly(node, load); | 
| +          ReplaceWithValue(node, load, load); | 
| +          return Replace(load); | 
| } | 
| // Compute byte offset. | 
| Node* offset = Word32Shl(key, static_cast<int>(k)); | 
| Node* load = graph()->NewNode(simplified()->LoadBuffer(access), buffer, | 
| offset, length, effect, control); | 
| -        return ReplaceEagerly(node, load); | 
| +        ReplaceWithValue(node, load, load); | 
| +        return Replace(load); | 
| } | 
| } | 
| } | 
| @@ -1039,7 +1022,7 @@ Reduction JSTypedLowering::ReduceJSCreateWithContext(Node* node) { | 
| a.Store(AccessBuilder::ForContextSlot(Context::GLOBAL_OBJECT_INDEX), load); | 
| // TODO(mstarzinger): We could mutate {node} into the allocation instead. | 
| NodeProperties::SetBounds(a.allocation(), NodeProperties::GetBounds(node)); | 
| -    NodeProperties::ReplaceWithValue(node, node, a.effect()); | 
| +    ReplaceWithValue(node, node, a.effect()); | 
| node->ReplaceInput(0, a.allocation()); | 
| node->ReplaceInput(1, a.effect()); | 
| node->set_op(common()->Finish(1)); | 
| @@ -1078,7 +1061,7 @@ Reduction JSTypedLowering::ReduceJSCreateBlockContext(Node* node) { | 
| } | 
| // TODO(mstarzinger): We could mutate {node} into the allocation instead. | 
| NodeProperties::SetBounds(a.allocation(), NodeProperties::GetBounds(node)); | 
| -    NodeProperties::ReplaceWithValue(node, node, a.effect()); | 
| +    ReplaceWithValue(node, node, a.effect()); | 
| node->ReplaceInput(0, a.allocation()); | 
| node->ReplaceInput(1, a.effect()); | 
| node->set_op(common()->Finish(1)); | 
| @@ -1097,27 +1080,27 @@ Reduction JSTypedLowering::Reduce(Node* node) { | 
| Type* upper = NodeProperties::GetBounds(node).upper; | 
| if (upper->IsConstant()) { | 
| Node* replacement = jsgraph()->Constant(upper->AsConstant()->Value()); | 
| -      NodeProperties::ReplaceWithValue(node, replacement); | 
| +      ReplaceWithValue(node, replacement); | 
| return Changed(replacement); | 
| } else if (upper->Is(Type::MinusZero())) { | 
| Node* replacement = jsgraph()->Constant(factory()->minus_zero_value()); | 
| -      NodeProperties::ReplaceWithValue(node, replacement); | 
| +      ReplaceWithValue(node, replacement); | 
| return Changed(replacement); | 
| } else if (upper->Is(Type::NaN())) { | 
| Node* replacement = jsgraph()->NaNConstant(); | 
| -      NodeProperties::ReplaceWithValue(node, replacement); | 
| +      ReplaceWithValue(node, replacement); | 
| return Changed(replacement); | 
| } else if (upper->Is(Type::Null())) { | 
| Node* replacement = jsgraph()->NullConstant(); | 
| -      NodeProperties::ReplaceWithValue(node, replacement); | 
| +      ReplaceWithValue(node, replacement); | 
| return Changed(replacement); | 
| } else if (upper->Is(Type::PlainNumber()) && upper->Min() == upper->Max()) { | 
| Node* replacement = jsgraph()->Constant(upper->Min()); | 
| -      NodeProperties::ReplaceWithValue(node, replacement); | 
| +      ReplaceWithValue(node, replacement); | 
| return Changed(replacement); | 
| } else if (upper->Is(Type::Undefined())) { | 
| Node* replacement = jsgraph()->UndefinedConstant(); | 
| -      NodeProperties::ReplaceWithValue(node, replacement); | 
| +      ReplaceWithValue(node, replacement); | 
| return Changed(replacement); | 
| } | 
| } | 
|  |