Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index e40316f74ab5c12c42fa61e9e161682b20392162..73b7e8508c311361437712e5599b0d69a0340a56 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -931,7 +931,7 @@ |
} |
-void HGraphBuilder::IfBuilder::Deopt(Deoptimizer::DeoptReason reason) { |
+void HGraphBuilder::IfBuilder::Deopt(const char* reason) { |
DCHECK(did_then_); |
builder()->Add<HDeoptimize>(reason, Deoptimizer::EAGER); |
AddMergeAtJoinBlock(true); |
@@ -1273,8 +1273,7 @@ |
} |
-void HGraphBuilder::FinishExitWithHardDeoptimization( |
- Deoptimizer::DeoptReason reason) { |
+void HGraphBuilder::FinishExitWithHardDeoptimization(const char* reason) { |
Add<HDeoptimize>(reason, Deoptimizer::EAGER); |
FinishExitCurrentBlock(New<HAbnormalExit>()); |
} |
@@ -1590,7 +1589,7 @@ |
if_global_object.If<HCompareNumericAndBranch>(instance_type, |
min_global_type, |
Token::GTE); |
- if_global_object.ThenDeopt(Deoptimizer::kReceiverWasAGlobalObject); |
+ if_global_object.ThenDeopt("receiver was a global object"); |
if_global_object.End(); |
} |
@@ -1920,7 +1919,7 @@ |
if_objectissmi.Else(); |
{ |
if (type->Is(Type::SignedSmall())) { |
- if_objectissmi.Deopt(Deoptimizer::kExpectedSmi); |
+ if_objectissmi.Deopt("Expected smi"); |
} else { |
// Check if the object is a heap number. |
IfBuilder if_objectisnumber(this); |
@@ -1975,7 +1974,7 @@ |
if_objectisnumber.Else(); |
{ |
if (type->Is(Type::Number())) { |
- if_objectisnumber.Deopt(Deoptimizer::kExpectedHeapNumber); |
+ if_objectisnumber.Deopt("Expected heap number"); |
} |
} |
if_objectisnumber.JoinContinuation(&found); |
@@ -2448,7 +2447,7 @@ |
negative_checker.Then(); |
HInstruction* result = AddElementAccess( |
backing_store, key, val, bounds_check, elements_kind, access_type); |
- negative_checker.ElseDeopt(Deoptimizer::kNegativeKeyEncountered); |
+ negative_checker.ElseDeopt("Negative key encountered"); |
negative_checker.End(); |
length_checker.End(); |
return result; |
@@ -2533,8 +2532,7 @@ |
if (!(top_info()->IsStub()) && |
IsFastPackedElementsKind(array_builder->kind())) { |
// We'll come back later with better (holey) feedback. |
- if_builder.Deopt( |
- Deoptimizer::kHoleyArrayDespitePackedElements_kindFeedback); |
+ if_builder.Deopt("Holey array despite packed elements_kind feedback"); |
} else { |
Push(checked_length); // capacity |
Push(checked_length); // length |
@@ -3073,14 +3071,14 @@ |
Add<HLoadNamedField>(value, nullptr, HObjectAccess::ForMap()); |
IfBuilder map_check(this); |
map_check.IfNot<HCompareObjectEqAndBranch>(expected_map, map); |
- map_check.ThenDeopt(Deoptimizer::kUnknownMap); |
+ map_check.ThenDeopt("Unknown map"); |
map_check.End(); |
} else { |
DCHECK(map_embedding == kEmbedMapsDirectly); |
Add<HCheckMaps>(value, type->Classes().Current()); |
} |
} else { |
- if_nil.Deopt(Deoptimizer::kTooManyUndetectableTypes); |
+ if_nil.Deopt("Too many undetectable types"); |
} |
} |
@@ -6410,8 +6408,7 @@ |
// know about and do not want to handle ones we've never seen. Otherwise |
// use a generic IC. |
if (count == types->length() && FLAG_deoptimize_uncommon_cases) { |
- FinishExitWithHardDeoptimization( |
- Deoptimizer::kUnknownMapInPolymorphicAccess); |
+ FinishExitWithHardDeoptimization("Unknown map in polymorphic access"); |
} else { |
HInstruction* instr = BuildNamedGeneric(access_type, expr, object, name, |
value); |
@@ -6558,7 +6555,7 @@ |
if (value->IsConstant()) { |
HConstant* c_value = HConstant::cast(value); |
if (!constant.is_identical_to(c_value->handle(isolate()))) { |
- Add<HDeoptimize>(Deoptimizer::kConstantGlobalVariableAssignment, |
+ Add<HDeoptimize>("Constant global variable assignment", |
Deoptimizer::EAGER); |
} |
} else { |
@@ -6571,7 +6568,7 @@ |
} |
builder.Then(); |
builder.Else(); |
- Add<HDeoptimize>(Deoptimizer::kConstantGlobalVariableAssignment, |
+ Add<HDeoptimize>("Constant global variable assignment", |
Deoptimizer::EAGER); |
builder.End(); |
} |
@@ -6891,9 +6888,8 @@ |
HValue* value, |
bool is_uninitialized) { |
if (is_uninitialized) { |
- Add<HDeoptimize>( |
- Deoptimizer::kInsufficientTypeFeedbackForGenericNamedAccess, |
- Deoptimizer::SOFT); |
+ Add<HDeoptimize>("Insufficient type feedback for generic named access", |
+ Deoptimizer::SOFT); |
} |
if (access_type == LOAD) { |
HLoadNamedGeneric* result = New<HLoadNamedGeneric>(object, name); |
@@ -7195,8 +7191,7 @@ |
DCHECK(join->predecessors()->length() > 0); |
// Deopt if none of the cases matched. |
NoObservableSideEffectsScope scope(this); |
- FinishExitWithHardDeoptimization( |
- Deoptimizer::kUnknownMapInPolymorphicElementAccess); |
+ FinishExitWithHardDeoptimization("Unknown map in polymorphic element access"); |
set_current_block(join); |
return access_type == STORE ? val : Pop(); |
} |
@@ -7291,12 +7286,12 @@ |
if (access_type == STORE) { |
if (expr->IsAssignment() && |
expr->AsAssignment()->HasNoTypeInformation()) { |
- Add<HDeoptimize>(Deoptimizer::kInsufficientTypeFeedbackForKeyedStore, |
+ Add<HDeoptimize>("Insufficient type feedback for keyed store", |
Deoptimizer::SOFT); |
} |
} else { |
if (expr->AsProperty()->HasNoTypeInformation()) { |
- Add<HDeoptimize>(Deoptimizer::kInsufficientTypeFeedbackForKeyedLoad, |
+ Add<HDeoptimize>("Insufficient type feedback for keyed load", |
Deoptimizer::SOFT); |
} |
} |
@@ -7741,7 +7736,7 @@ |
// know about and do not want to handle ones we've never seen. Otherwise |
// use a generic IC. |
if (ordered_functions == types->length() && FLAG_deoptimize_uncommon_cases) { |
- FinishExitWithHardDeoptimization(Deoptimizer::kUnknownMapInPolymorphicCall); |
+ FinishExitWithHardDeoptimization("Unknown map in polymorphic call"); |
} else { |
Property* prop = expr->expression()->AsProperty(); |
HInstruction* function = BuildNamedGeneric( |
@@ -9248,9 +9243,8 @@ |
if (CanBeFunctionApplyArguments(expr) && expr->is_uninitialized()) { |
// We have to use EAGER deoptimization here because Deoptimizer::SOFT |
// gets ignored by the always-opt flag, which leads to incorrect code. |
- Add<HDeoptimize>( |
- Deoptimizer::kInsufficientTypeFeedbackForCallWithArguments, |
- Deoptimizer::EAGER); |
+ Add<HDeoptimize>("Insufficient type feedback for call with arguments", |
+ Deoptimizer::EAGER); |
arguments_flag = ARGUMENTS_FAKED; |
} |
@@ -10481,9 +10475,8 @@ |
right_type->Maybe(Type::Receiver())); |
if (!left_type->IsInhabited()) { |
- Add<HDeoptimize>( |
- Deoptimizer::kInsufficientTypeFeedbackForLHSOfBinaryOperation, |
- Deoptimizer::SOFT); |
+ Add<HDeoptimize>("Insufficient type feedback for LHS of binary operation", |
+ Deoptimizer::SOFT); |
// TODO(rossberg): we should be able to get rid of non-continuous |
// defaults. |
left_type = Type::Any(zone()); |
@@ -10493,9 +10486,8 @@ |
} |
if (!right_type->IsInhabited()) { |
- Add<HDeoptimize>( |
- Deoptimizer::kInsufficientTypeFeedbackForRHSOfBinaryOperation, |
- Deoptimizer::SOFT); |
+ Add<HDeoptimize>("Insufficient type feedback for RHS of binary operation", |
+ Deoptimizer::SOFT); |
right_type = Type::Any(zone()); |
} else { |
if (!maybe_string_add) right = TruncateToNumber(right, &right_type); |
@@ -10615,7 +10607,7 @@ |
IfBuilder if_same(this); |
if_same.If<HCompareNumericAndBranch>(right, fixed_right, Token::EQ); |
if_same.Then(); |
- if_same.ElseDeopt(Deoptimizer::kUnexpectedRHSOfBinaryOperation); |
+ if_same.ElseDeopt("Unexpected RHS of binary operation"); |
right = fixed_right; |
} |
instr = AddUncasted<HMod>(left, right); |
@@ -10989,9 +10981,9 @@ |
// Cases handled below depend on collected type feedback. They should |
// soft deoptimize when there is no type feedback. |
if (!combined_type->IsInhabited()) { |
- Add<HDeoptimize>( |
- Deoptimizer::kInsufficientTypeFeedbackForCombinedTypeOfBinaryOperation, |
- Deoptimizer::SOFT); |
+ Add<HDeoptimize>("Insufficient type feedback for combined type " |
+ "of binary operation", |
+ Deoptimizer::SOFT); |
combined_type = left_type = right_type = Type::Any(zone()); |
} |
@@ -11007,7 +10999,7 @@ |
HConstant::cast(left)->HasNumberValue()) || |
(right->IsConstant() && |
HConstant::cast(right)->HasNumberValue())) { |
- Add<HDeoptimize>(Deoptimizer::kTypeMismatchBetweenFeedbackAndConstant, |
+ Add<HDeoptimize>("Type mismatch between feedback and constant", |
Deoptimizer::SOFT); |
// The caller expects a branch instruction, so make it happy. |
return New<HBranch>(graph()->GetConstantTrue()); |
@@ -11045,7 +11037,7 @@ |
!HConstant::cast(left)->HasInternalizedStringValue()) || |
(right->IsConstant() && |
!HConstant::cast(right)->HasInternalizedStringValue())) { |
- Add<HDeoptimize>(Deoptimizer::kTypeMismatchBetweenFeedbackAndConstant, |
+ Add<HDeoptimize>("Type mismatch between feedback and constant", |
Deoptimizer::SOFT); |
// The caller expects a branch instruction, so make it happy. |
return New<HBranch>(graph()->GetConstantTrue()); |