| Index: src/compiler/common-operator.cc
 | 
| diff --git a/src/compiler/common-operator.cc b/src/compiler/common-operator.cc
 | 
| index eb398d4c1ff5354f2e2bc8d3688d9bd98f35620a..6d148029e2cdf27dbcf95732aff15cf7b482dbeb 100644
 | 
| --- a/src/compiler/common-operator.cc
 | 
| +++ b/src/compiler/common-operator.cc
 | 
| @@ -37,12 +37,6 @@ BranchHint BranchHintOf(const Operator* const op) {
 | 
|    return OpParameter<BranchHint>(op);
 | 
|  }
 | 
|  
 | 
| -DeoptimizeReason DeoptimizeReasonOf(Operator const* const op) {
 | 
| -  DCHECK(op->opcode() == IrOpcode::kDeoptimizeIf ||
 | 
| -         op->opcode() == IrOpcode::kDeoptimizeUnless);
 | 
| -  return OpParameter<DeoptimizeReason>(op);
 | 
| -}
 | 
| -
 | 
|  int ValueInputCountOfReturn(Operator const* const op) {
 | 
|    DCHECK(op->opcode() == IrOpcode::kReturn);
 | 
|    // Return nodes have a hidden input at index 0 which we ignore in the value
 | 
| @@ -50,19 +44,6 @@ int ValueInputCountOfReturn(Operator const* const op) {
 | 
|    return op->ValueInputCount() - 1;
 | 
|  }
 | 
|  
 | 
| -size_t hash_value(DeoptimizeKind kind) { return static_cast<size_t>(kind); }
 | 
| -
 | 
| -std::ostream& operator<<(std::ostream& os, DeoptimizeKind kind) {
 | 
| -  switch (kind) {
 | 
| -    case DeoptimizeKind::kEager:
 | 
| -      return os << "Eager";
 | 
| -    case DeoptimizeKind::kSoft:
 | 
| -      return os << "Soft";
 | 
| -  }
 | 
| -  UNREACHABLE();
 | 
| -  return os;
 | 
| -}
 | 
| -
 | 
|  bool operator==(DeoptimizeParameters lhs, DeoptimizeParameters rhs) {
 | 
|    return lhs.kind() == rhs.kind() && lhs.reason() == rhs.reason();
 | 
|  }
 | 
| @@ -80,7 +61,9 @@ std::ostream& operator<<(std::ostream& os, DeoptimizeParameters p) {
 | 
|  }
 | 
|  
 | 
|  DeoptimizeParameters const& DeoptimizeParametersOf(Operator const* const op) {
 | 
| -  DCHECK_EQ(IrOpcode::kDeoptimize, op->opcode());
 | 
| +  DCHECK(op->opcode() == IrOpcode::kDeoptimize ||
 | 
| +         op->opcode() == IrOpcode::kDeoptimizeIf ||
 | 
| +         op->opcode() == IrOpcode::kDeoptimizeUnless);
 | 
|    return OpParameter<DeoptimizeParameters>(op);
 | 
|  }
 | 
|  
 | 
| @@ -436,22 +419,22 @@ ZoneVector<MachineType> const* MachineTypesOf(Operator const* op) {
 | 
|    V(Soft, InsufficientTypeFeedbackForGenericNamedAccess)
 | 
|  
 | 
|  #define CACHED_DEOPTIMIZE_IF_LIST(V) \
 | 
| -  V(DivisionByZero)                  \
 | 
| -  V(Hole)                            \
 | 
| -  V(MinusZero)                       \
 | 
| -  V(Overflow)                        \
 | 
| -  V(Smi)
 | 
| +  V(Eager, DivisionByZero)           \
 | 
| +  V(Eager, Hole)                     \
 | 
| +  V(Eager, MinusZero)                \
 | 
| +  V(Eager, Overflow)                 \
 | 
| +  V(Eager, Smi)
 | 
|  
 | 
|  #define CACHED_DEOPTIMIZE_UNLESS_LIST(V) \
 | 
| -  V(LostPrecision)                       \
 | 
| -  V(LostPrecisionOrNaN)                  \
 | 
| -  V(NoReason)                            \
 | 
| -  V(NotAHeapNumber)                      \
 | 
| -  V(NotANumberOrOddball)                 \
 | 
| -  V(NotASmi)                             \
 | 
| -  V(OutOfBounds)                         \
 | 
| -  V(WrongInstanceType)                   \
 | 
| -  V(WrongMap)
 | 
| +  V(Eager, LostPrecision)                \
 | 
| +  V(Eager, LostPrecisionOrNaN)           \
 | 
| +  V(Eager, NoReason)                     \
 | 
| +  V(Eager, NotAHeapNumber)               \
 | 
| +  V(Eager, NotANumberOrOddball)          \
 | 
| +  V(Eager, NotASmi)                      \
 | 
| +  V(Eager, OutOfBounds)                  \
 | 
| +  V(Eager, WrongInstanceType)            \
 | 
| +  V(Eager, WrongMap)
 | 
|  
 | 
|  #define CACHED_TRAP_IF_LIST(V) \
 | 
|    V(TrapDivUnrepresentable)    \
 | 
| @@ -635,35 +618,37 @@ struct CommonOperatorGlobalCache final {
 | 
|    CACHED_DEOPTIMIZE_LIST(CACHED_DEOPTIMIZE)
 | 
|  #undef CACHED_DEOPTIMIZE
 | 
|  
 | 
| -  template <DeoptimizeReason kReason>
 | 
| -  struct DeoptimizeIfOperator final : public Operator1<DeoptimizeReason> {
 | 
| +  template <DeoptimizeKind kKind, DeoptimizeReason kReason>
 | 
| +  struct DeoptimizeIfOperator final : public Operator1<DeoptimizeParameters> {
 | 
|      DeoptimizeIfOperator()
 | 
| -        : Operator1<DeoptimizeReason>(                   // --
 | 
| +        : Operator1<DeoptimizeParameters>(               // --
 | 
|                IrOpcode::kDeoptimizeIf,                   // opcode
 | 
|                Operator::kFoldable | Operator::kNoThrow,  // properties
 | 
|                "DeoptimizeIf",                            // name
 | 
|                2, 1, 1, 0, 1, 1,                          // counts
 | 
| -              kReason) {}                                // parameter
 | 
| +              DeoptimizeParameters(kKind, kReason)) {}   // parameter
 | 
|    };
 | 
| -#define CACHED_DEOPTIMIZE_IF(Reason)                \
 | 
| -  DeoptimizeIfOperator<DeoptimizeReason::k##Reason> \
 | 
| -      kDeoptimizeIf##Reason##Operator;
 | 
| +#define CACHED_DEOPTIMIZE_IF(Kind, Reason)                                   \
 | 
| +  DeoptimizeIfOperator<DeoptimizeKind::k##Kind, DeoptimizeReason::k##Reason> \
 | 
| +      kDeoptimizeIf##Kind##Reason##Operator;
 | 
|    CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF)
 | 
|  #undef CACHED_DEOPTIMIZE_IF
 | 
|  
 | 
| -  template <DeoptimizeReason kReason>
 | 
| -  struct DeoptimizeUnlessOperator final : public Operator1<DeoptimizeReason> {
 | 
| +  template <DeoptimizeKind kKind, DeoptimizeReason kReason>
 | 
| +  struct DeoptimizeUnlessOperator final
 | 
| +      : public Operator1<DeoptimizeParameters> {
 | 
|      DeoptimizeUnlessOperator()
 | 
| -        : Operator1<DeoptimizeReason>(                   // --
 | 
| +        : Operator1<DeoptimizeParameters>(               // --
 | 
|                IrOpcode::kDeoptimizeUnless,               // opcode
 | 
|                Operator::kFoldable | Operator::kNoThrow,  // properties
 | 
|                "DeoptimizeUnless",                        // name
 | 
|                2, 1, 1, 0, 1, 1,                          // counts
 | 
| -              kReason) {}                                // parameter
 | 
| +              DeoptimizeParameters(kKind, kReason)) {}   // parameter
 | 
|    };
 | 
| -#define CACHED_DEOPTIMIZE_UNLESS(Reason)                \
 | 
| -  DeoptimizeUnlessOperator<DeoptimizeReason::k##Reason> \
 | 
| -      kDeoptimizeUnless##Reason##Operator;
 | 
| +#define CACHED_DEOPTIMIZE_UNLESS(Kind, Reason)          \
 | 
| +  DeoptimizeUnlessOperator<DeoptimizeKind::k##Kind,     \
 | 
| +                           DeoptimizeReason::k##Reason> \
 | 
| +      kDeoptimizeUnless##Kind##Reason##Operator;
 | 
|    CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS)
 | 
|  #undef CACHED_DEOPTIMIZE_UNLESS
 | 
|  
 | 
| @@ -859,43 +844,42 @@ const Operator* CommonOperatorBuilder::Deoptimize(DeoptimizeKind kind,
 | 
|        parameter);                                       // parameter
 | 
|  }
 | 
|  
 | 
| -const Operator* CommonOperatorBuilder::DeoptimizeIf(DeoptimizeReason reason) {
 | 
| -  switch (reason) {
 | 
| -#define CACHED_DEOPTIMIZE_IF(Reason) \
 | 
| -  case DeoptimizeReason::k##Reason:  \
 | 
| -    return &cache_.kDeoptimizeIf##Reason##Operator;
 | 
| -    CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF)
 | 
| -#undef CACHED_DEOPTIMIZE_IF
 | 
| -    default:
 | 
| -      break;
 | 
| +const Operator* CommonOperatorBuilder::DeoptimizeIf(DeoptimizeKind kind,
 | 
| +                                                    DeoptimizeReason reason) {
 | 
| +#define CACHED_DEOPTIMIZE_IF(Kind, Reason)                \
 | 
| +  if (kind == DeoptimizeKind::k##Kind &&                  \
 | 
| +      reason == DeoptimizeReason::k##Reason) {            \
 | 
| +    return &cache_.kDeoptimizeIf##Kind##Reason##Operator; \
 | 
|    }
 | 
| +  CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF)
 | 
| +#undef CACHED_DEOPTIMIZE_IF
 | 
|    // Uncached
 | 
| -  return new (zone()) Operator1<DeoptimizeReason>(  // --
 | 
| -      IrOpcode::kDeoptimizeIf,                      // opcode
 | 
| -      Operator::kFoldable | Operator::kNoThrow,     // properties
 | 
| -      "DeoptimizeIf",                               // name
 | 
| -      2, 1, 1, 0, 1, 1,                             // counts
 | 
| -      reason);                                      // parameter
 | 
| +  DeoptimizeParameters parameter(kind, reason);
 | 
| +  return new (zone()) Operator1<DeoptimizeParameters>(  // --
 | 
| +      IrOpcode::kDeoptimizeIf,                          // opcode
 | 
| +      Operator::kFoldable | Operator::kNoThrow,         // properties
 | 
| +      "DeoptimizeIf",                                   // name
 | 
| +      2, 1, 1, 0, 1, 1,                                 // counts
 | 
| +      parameter);                                       // parameter
 | 
|  }
 | 
|  
 | 
|  const Operator* CommonOperatorBuilder::DeoptimizeUnless(
 | 
| -    DeoptimizeReason reason) {
 | 
| -  switch (reason) {
 | 
| -#define CACHED_DEOPTIMIZE_UNLESS(Reason) \
 | 
| -  case DeoptimizeReason::k##Reason:      \
 | 
| -    return &cache_.kDeoptimizeUnless##Reason##Operator;
 | 
| -    CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS)
 | 
| -#undef CACHED_DEOPTIMIZE_UNLESS
 | 
| -    default:
 | 
| -      break;
 | 
| +    DeoptimizeKind kind, DeoptimizeReason reason) {
 | 
| +#define CACHED_DEOPTIMIZE_UNLESS(Kind, Reason)                \
 | 
| +  if (kind == DeoptimizeKind::k##Kind &&                      \
 | 
| +      reason == DeoptimizeReason::k##Reason) {                \
 | 
| +    return &cache_.kDeoptimizeUnless##Kind##Reason##Operator; \
 | 
|    }
 | 
| +  CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS)
 | 
| +#undef CACHED_DEOPTIMIZE_UNLESS
 | 
|    // Uncached
 | 
| -  return new (zone()) Operator1<DeoptimizeReason>(  // --
 | 
| -      IrOpcode::kDeoptimizeUnless,                  // opcode
 | 
| -      Operator::kFoldable | Operator::kNoThrow,     // properties
 | 
| -      "DeoptimizeUnless",                           // name
 | 
| -      2, 1, 1, 0, 1, 1,                             // counts
 | 
| -      reason);                                      // parameter
 | 
| +  DeoptimizeParameters parameter(kind, reason);
 | 
| +  return new (zone()) Operator1<DeoptimizeParameters>(  // --
 | 
| +      IrOpcode::kDeoptimizeUnless,                      // opcode
 | 
| +      Operator::kFoldable | Operator::kNoThrow,         // properties
 | 
| +      "DeoptimizeUnless",                               // name
 | 
| +      2, 1, 1, 0, 1, 1,                                 // counts
 | 
| +      parameter);                                       // parameter
 | 
|  }
 | 
|  
 | 
|  const Operator* CommonOperatorBuilder::TrapIf(int32_t trap_id) {
 | 
| 
 |