Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index 76922085f0668d2c4fe1e06b89d875c4b99cc5ea..2a03c74c416e6aaedfdfee5bce9ff92d21d892b5 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -2269,6 +2269,9 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator, |
case Translation::DOUBLE_REGISTER: { |
int input_reg = iterator->Next(); |
double value = input_->GetDoubleRegister(input_reg); |
+ int int_value = FastD2IChecked(value); |
+ bool is_smi = |
+ !IsMinusZero(value) && value == int_value && Smi::IsValid(int_value); |
if (trace_scope_ != NULL) { |
PrintF(trace_scope_->file(), |
" object @0x%08" V8PRIxPTR ": [field #%d] <- ", |
@@ -2278,7 +2281,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator, |
"%e ; %s\n", value, |
DoubleRegister::AllocationIndexToString(input_reg)); |
} |
- AddObjectDoubleValue(value); |
+ if (is_smi) { |
+ intptr_t tagged_value = |
+ reinterpret_cast<intptr_t>(Smi::FromInt(int_value)); |
+ AddObjectTaggedValue(tagged_value); |
+ } else { |
+ AddObjectDoubleValue(value); |
+ } |
return; |
} |
@@ -2380,6 +2389,9 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator, |
int input_slot_index = iterator->Next(); |
unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); |
double value = input_->GetDoubleFrameSlot(input_offset); |
+ int int_value = FastD2IChecked(value); |
+ bool is_smi = |
+ !IsMinusZero(value) && value == int_value && Smi::IsValid(int_value); |
if (trace_scope_ != NULL) { |
PrintF(trace_scope_->file(), |
" object @0x%08" V8PRIxPTR ": [field #%d] <- ", |
@@ -2388,7 +2400,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator, |
PrintF(trace_scope_->file(), |
"%e ; [sp + %d]\n", value, input_offset); |
} |
- AddObjectDoubleValue(value); |
+ if (is_smi) { |
+ intptr_t tagged_value = |
+ reinterpret_cast<intptr_t>(Smi::FromInt(int_value)); |
+ AddObjectTaggedValue(tagged_value); |
+ } else { |
+ AddObjectDoubleValue(value); |
+ } |
return; |
} |
@@ -2586,18 +2604,25 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
case Translation::DOUBLE_REGISTER: { |
int input_reg = iterator->Next(); |
double value = input_->GetDoubleRegister(input_reg); |
+ int int_value = FastD2IChecked(value); |
+ bool is_smi = |
+ !IsMinusZero(value) && value == int_value && Smi::IsValid(int_value); |
if (trace_scope_ != NULL) { |
PrintF(trace_scope_->file(), |
" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; %s\n", |
- output_[frame_index]->GetTop() + output_offset, |
- output_offset, |
- value, |
- DoubleRegister::AllocationIndexToString(input_reg)); |
+ output_[frame_index]->GetTop() + output_offset, output_offset, |
+ value, DoubleRegister::AllocationIndexToString(input_reg)); |
+ } |
+ if (is_smi) { |
+ intptr_t tagged_value = |
+ reinterpret_cast<intptr_t>(Smi::FromInt(int_value)); |
+ output_[frame_index]->SetFrameSlot(output_offset, tagged_value); |
+ } else { |
+ // We save the untagged value on the side and store a GC-safe |
+ // temporary placeholder in the frame. |
+ AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value); |
+ output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); |
} |
- // We save the untagged value on the side and store a GC-safe |
- // temporary placeholder in the frame. |
- AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value); |
- output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); |
return; |
} |
@@ -2713,6 +2738,9 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
int input_slot_index = iterator->Next(); |
unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); |
double value = input_->GetDoubleFrameSlot(input_offset); |
+ int int_value = FastD2IChecked(value); |
+ bool is_smi = |
+ !IsMinusZero(value) && value == int_value && Smi::IsValid(int_value); |
if (trace_scope_ != NULL) { |
PrintF(trace_scope_->file(), |
" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; [sp + %d]\n", |
@@ -2721,10 +2749,16 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
value, |
input_offset); |
} |
- // We save the untagged value on the side and store a GC-safe |
- // temporary placeholder in the frame. |
- AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value); |
- output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); |
+ if (is_smi) { |
+ intptr_t tagged_value = |
+ reinterpret_cast<intptr_t>(Smi::FromInt(int_value)); |
+ output_[frame_index]->SetFrameSlot(output_offset, tagged_value); |
+ } else { |
+ // We save the untagged value on the side and store a GC-safe |
+ // temporary placeholder in the frame. |
+ AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value); |
+ output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); |
+ } |
return; |
} |