| Index: src/compiler/x87/instruction-selector-x87.cc | 
| diff --git a/src/compiler/x87/instruction-selector-x87.cc b/src/compiler/x87/instruction-selector-x87.cc | 
| index 0f1b6fc2f98d213bf6b93228aa6a83af403eb161..865179325c536eaf5c68f192de040f2ba72a9756 100644 | 
| --- a/src/compiler/x87/instruction-selector-x87.cc | 
| +++ b/src/compiler/x87/instruction-selector-x87.cc | 
| @@ -27,11 +27,15 @@ class X87OperandGenerator final : public OperandGenerator { | 
| return DefineAsRegister(node); | 
| } | 
|  | 
| -  bool CanBeMemoryOperand(InstructionCode opcode, Node* node, Node* input) { | 
| +  bool CanBeMemoryOperand(InstructionCode opcode, Node* node, Node* input, | 
| +                          int effect_level) { | 
| if (input->opcode() != IrOpcode::kLoad || | 
| !selector()->CanCover(node, input)) { | 
| return false; | 
| } | 
| +    if (effect_level != selector()->GetEffectLevel(input)) { | 
| +      return false; | 
| +    } | 
| MachineRepresentation rep = | 
| LoadRepresentationOf(input->op()).representation(); | 
| switch (opcode) { | 
| @@ -1268,18 +1272,24 @@ void VisitWordCompare(InstructionSelector* selector, Node* node, | 
|  | 
| InstructionCode narrowed_opcode = TryNarrowOpcodeSize(opcode, left, right); | 
|  | 
| +  int effect_level = selector->GetEffectLevel(node); | 
| +  if (cont->IsBranch()) { | 
| +    effect_level = selector->GetEffectLevel( | 
| +        cont->true_block()->PredecessorAt(0)->control_input()); | 
| +  } | 
| + | 
| // If one of the two inputs is an immediate, make sure it's on the right, or | 
| // if one of the two inputs is a memory operand, make sure it's on the left. | 
| if ((!g.CanBeImmediate(right) && g.CanBeImmediate(left)) || | 
| -      (g.CanBeMemoryOperand(narrowed_opcode, node, right) && | 
| -       !g.CanBeMemoryOperand(narrowed_opcode, node, left))) { | 
| +      (g.CanBeMemoryOperand(narrowed_opcode, node, right, effect_level) && | 
| +       !g.CanBeMemoryOperand(narrowed_opcode, node, left, effect_level))) { | 
| if (!node->op()->HasProperty(Operator::kCommutative)) cont->Commute(); | 
| std::swap(left, right); | 
| } | 
|  | 
| // Match immediates on right side of comparison. | 
| if (g.CanBeImmediate(right)) { | 
| -    if (g.CanBeMemoryOperand(opcode, node, left)) { | 
| +    if (g.CanBeMemoryOperand(opcode, node, left, effect_level)) { | 
| // TODO(epertoso): we should use `narrowed_opcode' here once we match | 
| // immediates too. | 
| return VisitCompareWithMemoryOperand(selector, opcode, left, | 
| @@ -1290,7 +1300,7 @@ void VisitWordCompare(InstructionSelector* selector, Node* node, | 
| } | 
|  | 
| // Match memory operands on left side of comparison. | 
| -  if (g.CanBeMemoryOperand(narrowed_opcode, node, left)) { | 
| +  if (g.CanBeMemoryOperand(narrowed_opcode, node, left, effect_level)) { | 
| bool needs_byte_register = | 
| narrowed_opcode == kX87Test8 || narrowed_opcode == kX87Cmp8; | 
| return VisitCompareWithMemoryOperand( | 
|  |