| Index: src/compiler/simplified-lowering.cc
 | 
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
 | 
| index 3688fc09f65b11469b86e1604a9c8766d908cc20..b86ffba48541d154439ece1baacbb8bf7d3163a6 100644
 | 
| --- a/src/compiler/simplified-lowering.cc
 | 
| +++ b/src/compiler/simplified-lowering.cc
 | 
| @@ -4,6 +4,8 @@
 | 
|  
 | 
|  #include "src/compiler/simplified-lowering.h"
 | 
|  
 | 
| +#include <limits>
 | 
| +
 | 
|  #include "src/base/bits.h"
 | 
|  #include "src/code-factory.h"
 | 
|  #include "src/compiler/common-operator.h"
 | 
| @@ -764,8 +766,20 @@ class RepresentationSelector {
 | 
|          ProcessRemainingInputs(node, 3);
 | 
|          // Tagged overrides everything if we have to do a typed array bounds
 | 
|          // check, because we may need to return undefined then.
 | 
| -        MachineType output_type =
 | 
| -            (use & kRepTagged) ? kMachAnyTagged : access.machine_type();
 | 
| +        MachineType output_type;
 | 
| +        if (use & kRepTagged) {
 | 
| +          output_type = kMachAnyTagged;
 | 
| +        } else if (use & kRepFloat64) {
 | 
| +          if (access.machine_type() & kRepFloat32) {
 | 
| +            output_type = access.machine_type();
 | 
| +          } else {
 | 
| +            output_type = kMachFloat64;
 | 
| +          }
 | 
| +        } else if (use & kRepFloat32) {
 | 
| +          output_type = kMachFloat32;
 | 
| +        } else {
 | 
| +          output_type = access.machine_type();
 | 
| +        }
 | 
|          SetOutput(node, output_type);
 | 
|          if (lower()) lowering->DoLoadBuffer(node, output_type, changer_);
 | 
|          break;
 | 
| @@ -1130,7 +1144,7 @@ void SimplifiedLowering::DoLoadBuffer(Node* node, MachineType output_type,
 | 
|    DCHECK_EQ(IrOpcode::kLoadBuffer, node->opcode());
 | 
|    DCHECK_NE(kMachNone, RepresentationOf(output_type));
 | 
|    MachineType const type = BufferAccessOf(node->op()).machine_type();
 | 
| -  if (output_type & kRepTagged) {
 | 
| +  if (output_type != type) {
 | 
|      Node* const buffer = node->InputAt(0);
 | 
|      Node* const offset = node->InputAt(1);
 | 
|      Node* const length = node->InputAt(2);
 | 
| @@ -1144,11 +1158,22 @@ void SimplifiedLowering::DoLoadBuffer(Node* node, MachineType output_type,
 | 
|      Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
 | 
|      Node* etrue = graph()->NewNode(machine()->Load(type), buffer, offset,
 | 
|                                     effect, if_true);
 | 
| -    Node* vtrue = changer->GetTaggedRepresentationFor(etrue, type);
 | 
| +    Node* vtrue = changer->GetRepresentationFor(etrue, type, output_type);
 | 
|  
 | 
|      Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
 | 
| -    Node* vfalse = jsgraph()->UndefinedConstant();
 | 
|      Node* efalse = effect;
 | 
| +    Node* vfalse;
 | 
| +    if (output_type & kRepTagged) {
 | 
| +      vfalse = jsgraph()->UndefinedConstant();
 | 
| +    } else if (output_type & kRepFloat64) {
 | 
| +      vfalse =
 | 
| +          jsgraph()->Float64Constant(std::numeric_limits<double>::quiet_NaN());
 | 
| +    } else if (output_type & kRepFloat32) {
 | 
| +      vfalse =
 | 
| +          jsgraph()->Float32Constant(std::numeric_limits<float>::quiet_NaN());
 | 
| +    } else {
 | 
| +      vfalse = jsgraph()->Int32Constant(0);
 | 
| +    }
 | 
|  
 | 
|      Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
 | 
|      Node* ephi = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, merge);
 | 
| @@ -1157,7 +1182,7 @@ void SimplifiedLowering::DoLoadBuffer(Node* node, MachineType output_type,
 | 
|      NodeProperties::ReplaceWithValue(node, node, ephi);
 | 
|  
 | 
|      // Turn the {node} into a Phi.
 | 
| -    node->set_op(common()->Phi(kMachAnyTagged, 2));
 | 
| +    node->set_op(common()->Phi(output_type, 2));
 | 
|      node->ReplaceInput(0, vtrue);
 | 
|      node->ReplaceInput(1, vfalse);
 | 
|      node->ReplaceInput(2, merge);
 | 
| 
 |