diff --git a/src/compiler/s390/instruction-selector-s390.cc b/src/compiler/s390/instruction-selector-s390.cc index 1b1bd2f624..1b2541d0cd 100644 --- a/src/compiler/s390/instruction-selector-s390.cc +++ b/src/compiler/s390/instruction-selector-s390.cc @@ -128,7 +128,14 @@ void VisitBinop(InstructionSelector* selector, Node* node, inputs[input_count++] = g.Label(cont->false_block()); } - outputs[output_count++] = g.DefineAsRegister(node); + if (cont->IsDeoptimize()) { + // If we can deoptimize as a result of the binop, we need to make sure that + // the deopt inputs are not overwritten by the binop result. One way + // to achieve that is to declare the output register as same-as-first. + outputs[output_count++] = g.DefineSameAsFirst(node); + } else { + outputs[output_count++] = g.DefineAsRegister(node); + } if (cont->IsSet()) { outputs[output_count++] = g.DefineAsRegister(cont->result()); }