| 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(
|
|
|