| Index: src/compiler/js-typed-lowering.cc | 
| diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc | 
| index 9af6e6e44d6ece3efe070c56447f8ec272c92302..a88658c408eed258899ff31448f2a6e9620a8f8c 100644 | 
| --- a/src/compiler/js-typed-lowering.cc | 
| +++ b/src/compiler/js-typed-lowering.cc | 
| @@ -219,7 +219,6 @@ class JSBinopReduction final { | 
| Graph* graph() const { return lowering_->graph(); } | 
| JSGraph* jsgraph() { return lowering_->jsgraph(); } | 
| JSOperatorBuilder* javascript() { return lowering_->javascript(); } | 
| -  MachineOperatorBuilder* machine() { return lowering_->machine(); } | 
| CommonOperatorBuilder* common() { return jsgraph()->common(); } | 
| Zone* zone() const { return graph()->zone(); } | 
|  | 
| @@ -1019,77 +1018,55 @@ Reduction JSTypedLowering::ReduceJSToObject(Node* node) { | 
| Node* frame_state = NodeProperties::GetFrameStateInput(node, 0); | 
| Node* effect = NodeProperties::GetEffectInput(node); | 
| Node* control = NodeProperties::GetControlInput(node); | 
| -  if (!receiver_type->Is(Type::Receiver())) { | 
| -    // TODO(bmeurer/mstarzinger): Add support for lowering inside try blocks. | 
| -    if (receiver_type->Maybe(Type::NullOrUndefined()) && | 
| -        NodeProperties::IsExceptionalCall(node)) { | 
| -      // ToObject throws for null or undefined inputs. | 
| -      return NoChange(); | 
| -    } | 
| +  if (receiver_type->Is(Type::Receiver())) { | 
| +    ReplaceWithValue(node, receiver, effect, control); | 
| +    return Replace(receiver); | 
| +  } | 
|  | 
| -    // Check whether {receiver} is a Smi. | 
| -    Node* check0 = graph()->NewNode(simplified()->ObjectIsSmi(), receiver); | 
| -    Node* branch0 = | 
| -        graph()->NewNode(common()->Branch(BranchHint::kFalse), check0, control); | 
| -    Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0); | 
| -    Node* etrue0 = effect; | 
| - | 
| -    Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0); | 
| -    Node* efalse0 = effect; | 
| - | 
| -    // Determine the instance type of {receiver}. | 
| -    Node* receiver_map = efalse0 = | 
| -        graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), | 
| -                         receiver, efalse0, if_false0); | 
| -    Node* receiver_instance_type = efalse0 = graph()->NewNode( | 
| -        simplified()->LoadField(AccessBuilder::ForMapInstanceType()), | 
| -        receiver_map, efalse0, if_false0); | 
| - | 
| -    // Check whether {receiver} is a spec object. | 
| -    STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); | 
| -    Node* check1 = | 
| -        graph()->NewNode(machine()->Uint32LessThanOrEqual(), | 
| -                         jsgraph()->Uint32Constant(FIRST_JS_RECEIVER_TYPE), | 
| -                         receiver_instance_type); | 
| -    Node* branch1 = graph()->NewNode(common()->Branch(BranchHint::kTrue), | 
| -                                     check1, if_false0); | 
| -    Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); | 
| -    Node* etrue1 = efalse0; | 
| - | 
| -    Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); | 
| -    Node* efalse1 = efalse0; | 
| +  // TODO(bmeurer/mstarzinger): Add support for lowering inside try blocks. | 
| +  if (receiver_type->Maybe(Type::NullOrUndefined()) && | 
| +      NodeProperties::IsExceptionalCall(node)) { | 
| +    // ToObject throws for null or undefined inputs. | 
| +    return NoChange(); | 
| +  } | 
|  | 
| -    // Convert {receiver} using the ToObjectStub. | 
| -    Node* if_convert = | 
| -        graph()->NewNode(common()->Merge(2), if_true0, if_false1); | 
| -    Node* econvert = | 
| -        graph()->NewNode(common()->EffectPhi(2), etrue0, efalse1, if_convert); | 
| -    Node* rconvert; | 
| -    { | 
| -      Callable callable = CodeFactory::ToObject(isolate()); | 
| -      CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( | 
| -          isolate(), graph()->zone(), callable.descriptor(), 0, | 
| -          CallDescriptor::kNeedsFrameState, node->op()->properties()); | 
| -      rconvert = econvert = graph()->NewNode( | 
| -          common()->Call(desc), jsgraph()->HeapConstant(callable.code()), | 
| -          receiver, context, frame_state, econvert, if_convert); | 
| -    } | 
| +  // Check whether {receiver} is a spec object. | 
| +  Node* check = graph()->NewNode(simplified()->ObjectIsReceiver(), receiver); | 
| +  Node* branch = | 
| +      graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); | 
|  | 
| -    // The {receiver} is already a spec object. | 
| -    Node* if_done = if_true1; | 
| -    Node* edone = etrue1; | 
| -    Node* rdone = receiver; | 
| +  Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 
| +  Node* etrue = effect; | 
| +  Node* rtrue = receiver; | 
|  | 
| -    control = graph()->NewNode(common()->Merge(2), if_convert, if_done); | 
| -    effect = graph()->NewNode(common()->EffectPhi(2), econvert, edone, control); | 
| -    receiver = | 
| -        graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | 
| -                         rconvert, rdone, control); | 
| +  Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 
| +  Node* efalse = effect; | 
| +  Node* rfalse; | 
| +  { | 
| +    // Convert {receiver} using the ToObjectStub. | 
| +    Callable callable = CodeFactory::ToObject(isolate()); | 
| +    CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( | 
| +        isolate(), graph()->zone(), callable.descriptor(), 0, | 
| +        CallDescriptor::kNeedsFrameState, node->op()->properties()); | 
| +    rfalse = efalse = graph()->NewNode( | 
| +        common()->Call(desc), jsgraph()->HeapConstant(callable.code()), | 
| +        receiver, context, frame_state, efalse, if_false); | 
| +    if_false = graph()->NewNode(common()->IfSuccess(), rfalse); | 
| } | 
| -  ReplaceWithValue(node, receiver, effect, control); | 
| -  return Changed(receiver); | 
| -} | 
|  | 
| +  control = graph()->NewNode(common()->Merge(2), if_true, if_false); | 
| +  effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); | 
| + | 
| +  // Morph the {node} into an appropriate Phi. | 
| +  ReplaceWithValue(node, node, effect, control); | 
| +  node->ReplaceInput(0, rtrue); | 
| +  node->ReplaceInput(1, rfalse); | 
| +  node->ReplaceInput(2, control); | 
| +  node->TrimInputCount(3); | 
| +  NodeProperties::ChangeOp(node, | 
| +                           common()->Phi(MachineRepresentation::kTagged, 2)); | 
| +  return Changed(node); | 
| +} | 
|  | 
| Reduction JSTypedLowering::ReduceJSLoadNamed(Node* node) { | 
| DCHECK_EQ(IrOpcode::kJSLoadNamed, node->opcode()); | 
| @@ -1144,7 +1121,10 @@ Reduction JSTypedLowering::ReduceJSLoadProperty(Node* node) { | 
| return Replace(load); | 
| } | 
| // Compute byte offset. | 
| -        Node* offset = Word32Shl(key, static_cast<int>(k)); | 
| +        Node* offset = | 
| +            (k == 0) ? key : graph()->NewNode( | 
| +                                 simplified()->NumberShiftLeft(), key, | 
| +                                 jsgraph()->Constant(static_cast<double>(k))); | 
| Node* load = graph()->NewNode(simplified()->LoadBuffer(access), buffer, | 
| offset, length, effect, control); | 
| ReplaceWithValue(node, load, load); | 
| @@ -1212,7 +1192,10 @@ Reduction JSTypedLowering::ReduceJSStoreProperty(Node* node) { | 
| return Changed(node); | 
| } | 
| // Compute byte offset. | 
| -        Node* offset = Word32Shl(key, static_cast<int>(k)); | 
| +        Node* offset = | 
| +            (k == 0) ? key : graph()->NewNode( | 
| +                                 simplified()->NumberShiftLeft(), key, | 
| +                                 jsgraph()->Constant(static_cast<double>(k))); | 
| // Turn into a StoreBuffer operation. | 
| RelaxControls(node); | 
| node->ReplaceInput(0, buffer); | 
| @@ -1307,10 +1290,10 @@ Reduction JSTypedLowering::ReduceJSInstanceOf(Node* node) { | 
| int is_access_check_needed_bit = 1 << Map::kIsAccessCheckNeeded; | 
| Node* is_access_check_needed_num = | 
| graph()->NewNode(simplified()->NumberBitwiseAnd(), map_bit_field, | 
| -                       jsgraph()->Uint32Constant(is_access_check_needed_bit)); | 
| +                       jsgraph()->Constant(is_access_check_needed_bit)); | 
| Node* is_access_check_needed = | 
| -      graph()->NewNode(machine()->Word32Equal(), is_access_check_needed_num, | 
| -                       jsgraph()->Uint32Constant(is_access_check_needed_bit)); | 
| +      graph()->NewNode(simplified()->NumberEqual(), is_access_check_needed_num, | 
| +                       jsgraph()->Constant(is_access_check_needed_bit)); | 
|  | 
| Node* branch_is_access_check_needed = graph()->NewNode( | 
| common()->Branch(BranchHint::kFalse), is_access_check_needed, control); | 
| @@ -1325,8 +1308,9 @@ Reduction JSTypedLowering::ReduceJSInstanceOf(Node* node) { | 
| Node* map_instance_type = effect = graph()->NewNode( | 
| simplified()->LoadField(AccessBuilder::ForMapInstanceType()), | 
| loop_object_map, loop_effect, control); | 
| -  Node* is_proxy = graph()->NewNode(machine()->Word32Equal(), map_instance_type, | 
| -                                    jsgraph()->Uint32Constant(JS_PROXY_TYPE)); | 
| +  Node* is_proxy = | 
| +      graph()->NewNode(simplified()->NumberEqual(), map_instance_type, | 
| +                       jsgraph()->Constant(JS_PROXY_TYPE)); | 
| Node* branch_is_proxy = | 
| graph()->NewNode(common()->Branch(BranchHint::kFalse), is_proxy, control); | 
| Node* if_is_proxy = graph()->NewNode(common()->IfTrue(), branch_is_proxy); | 
| @@ -2043,13 +2027,6 @@ Reduction JSTypedLowering::Reduce(Node* node) { | 
| return NoChange(); | 
| } | 
|  | 
| - | 
| -Node* JSTypedLowering::Word32Shl(Node* const lhs, int32_t const rhs) { | 
| -  if (rhs == 0) return lhs; | 
| -  return graph()->NewNode(machine()->Word32Shl(), lhs, | 
| -                          jsgraph()->Int32Constant(rhs)); | 
| -} | 
| - | 
| Node* JSTypedLowering::EmptyFrameState() { | 
| return graph()->NewNode( | 
| common()->FrameState(BailoutId::None(), OutputFrameStateCombine::Ignore(), | 
| @@ -2077,17 +2054,15 @@ CommonOperatorBuilder* JSTypedLowering::common() const { | 
| return jsgraph()->common(); | 
| } | 
|  | 
| +MachineOperatorBuilder* JSTypedLowering::machine() const { | 
| +  return jsgraph()->machine(); | 
| +} | 
|  | 
| SimplifiedOperatorBuilder* JSTypedLowering::simplified() const { | 
| return jsgraph()->simplified(); | 
| } | 
|  | 
|  | 
| -MachineOperatorBuilder* JSTypedLowering::machine() const { | 
| -  return jsgraph()->machine(); | 
| -} | 
| - | 
| - | 
| CompilationDependencies* JSTypedLowering::dependencies() const { | 
| return dependencies_; | 
| } | 
|  |