Index: src/code-stubs.cc |
diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
index 1d07c29df3d32ae46abeb415c24803807e556ce0..87c578ff07df4ecc8186a5633eef1c0f4c6ca433 100644 |
--- a/src/code-stubs.cc |
+++ b/src/code-stubs.cc |
@@ -2382,7 +2382,9 @@ compiler::Node* BitwiseXorStub::Generate(CodeStubAssembler* assembler, |
// static |
compiler::Node* IncStub::Generate(CodeStubAssembler* assembler, |
compiler::Node* value, |
- compiler::Node* context) { |
+ compiler::Node* context, |
+ compiler::Node* type_feedback_vector, |
+ compiler::Node* slot_id) { |
typedef CodeStubAssembler::Label Label; |
typedef compiler::Node Node; |
typedef CodeStubAssembler::Variable Variable; |
@@ -2394,8 +2396,12 @@ compiler::Node* IncStub::Generate(CodeStubAssembler* assembler, |
// We might need to try again due to ToNumber conversion. |
Variable value_var(assembler, MachineRepresentation::kTagged); |
Variable result_var(assembler, MachineRepresentation::kTagged); |
- Label start(assembler, &value_var); |
+ Variable var_type_feedback(assembler, MachineRepresentation::kWord32); |
+ Variable* loop_vars[] = {&value_var, &var_type_feedback}; |
+ Label start(assembler, 2, loop_vars); |
value_var.Bind(value); |
+ var_type_feedback.Bind( |
+ assembler->Int32Constant(BinaryOperationFeedback::kNone)); |
assembler->Goto(&start); |
assembler->Bind(&start); |
{ |
@@ -2416,6 +2422,9 @@ compiler::Node* IncStub::Generate(CodeStubAssembler* assembler, |
assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
assembler->Bind(&if_notoverflow); |
+ var_type_feedback.Bind(assembler->Word32Or( |
+ var_type_feedback.value(), |
+ assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall))); |
result_var.Bind(assembler->Projection(0, pair)); |
assembler->Goto(&end); |
@@ -2448,6 +2457,8 @@ compiler::Node* IncStub::Generate(CodeStubAssembler* assembler, |
// Convert to a Number first and try again. |
Callable callable = |
CodeFactory::NonNumberToNumber(assembler->isolate()); |
+ var_type_feedback.Bind( |
+ assembler->Int32Constant(BinaryOperationFeedback::kAny)); |
value_var.Bind(assembler->CallStub(callable, context, value)); |
assembler->Goto(&start); |
} |
@@ -2459,18 +2470,25 @@ compiler::Node* IncStub::Generate(CodeStubAssembler* assembler, |
Node* finc_value = var_finc_value.value(); |
Node* one = assembler->Float64Constant(1.0); |
Node* finc_result = assembler->Float64Add(finc_value, one); |
+ var_type_feedback.Bind(assembler->Word32Or( |
+ var_type_feedback.value(), |
+ assembler->Int32Constant(BinaryOperationFeedback::kNumber))); |
result_var.Bind(assembler->ChangeFloat64ToTagged(finc_result)); |
assembler->Goto(&end); |
} |
assembler->Bind(&end); |
+ assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, |
+ slot_id); |
return result_var.value(); |
} |
// static |
compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, |
compiler::Node* value, |
- compiler::Node* context) { |
+ compiler::Node* context, |
+ compiler::Node* type_feedback_vector, |
+ compiler::Node* slot_id) { |
typedef CodeStubAssembler::Label Label; |
typedef compiler::Node Node; |
typedef CodeStubAssembler::Variable Variable; |
@@ -2482,7 +2500,11 @@ compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, |
// We might need to try again due to ToNumber conversion. |
Variable value_var(assembler, MachineRepresentation::kTagged); |
Variable result_var(assembler, MachineRepresentation::kTagged); |
- Label start(assembler, &value_var); |
+ Variable var_type_feedback(assembler, MachineRepresentation::kWord32); |
+ Variable* loop_vars[] = {&value_var, &var_type_feedback}; |
+ Label start(assembler, 2, loop_vars); |
+ var_type_feedback.Bind( |
+ assembler->Int32Constant(BinaryOperationFeedback::kNone)); |
value_var.Bind(value); |
assembler->Goto(&start); |
assembler->Bind(&start); |
@@ -2504,6 +2526,9 @@ compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, |
assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
assembler->Bind(&if_notoverflow); |
+ var_type_feedback.Bind(assembler->Word32Or( |
+ var_type_feedback.value(), |
+ assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall))); |
result_var.Bind(assembler->Projection(0, pair)); |
assembler->Goto(&end); |
@@ -2536,6 +2561,8 @@ compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, |
// Convert to a Number first and try again. |
Callable callable = |
CodeFactory::NonNumberToNumber(assembler->isolate()); |
+ var_type_feedback.Bind( |
+ assembler->Int32Constant(BinaryOperationFeedback::kAny)); |
value_var.Bind(assembler->CallStub(callable, context, value)); |
assembler->Goto(&start); |
} |
@@ -2547,11 +2574,16 @@ compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, |
Node* fdec_value = var_fdec_value.value(); |
Node* one = assembler->Float64Constant(1.0); |
Node* fdec_result = assembler->Float64Sub(fdec_value, one); |
+ var_type_feedback.Bind(assembler->Word32Or( |
+ var_type_feedback.value(), |
+ assembler->Int32Constant(BinaryOperationFeedback::kNumber))); |
result_var.Bind(assembler->ChangeFloat64ToTagged(fdec_result)); |
assembler->Goto(&end); |
} |
assembler->Bind(&end); |
+ assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, |
+ slot_id); |
return result_var.value(); |
} |