| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 case kTagged: return "tagged"; | 428 case kTagged: return "tagged"; |
| 429 case kTaggedPrimitive: return "primitive"; | 429 case kTaggedPrimitive: return "primitive"; |
| 430 case kTaggedNumber: return "number"; | 430 case kTaggedNumber: return "number"; |
| 431 case kSmi: return "smi"; | 431 case kSmi: return "smi"; |
| 432 case kHeapNumber: return "heap-number"; | 432 case kHeapNumber: return "heap-number"; |
| 433 case kString: return "string"; | 433 case kString: return "string"; |
| 434 case kBoolean: return "boolean"; | 434 case kBoolean: return "boolean"; |
| 435 case kNonPrimitive: return "non-primitive"; | 435 case kNonPrimitive: return "non-primitive"; |
| 436 case kJSArray: return "array"; | 436 case kJSArray: return "array"; |
| 437 case kJSObject: return "object"; | 437 case kJSObject: return "object"; |
| 438 case kUninitialized: return "uninitialized"; | |
| 439 } | 438 } |
| 440 UNREACHABLE(); | 439 UNREACHABLE(); |
| 441 return "unreachable"; | 440 return "unreachable"; |
| 442 } | 441 } |
| 443 | 442 |
| 444 | 443 |
| 445 HType HType::TypeFromValue(Handle<Object> value) { | 444 HType HType::TypeFromValue(Handle<Object> value) { |
| 446 HType result = HType::Tagged(); | 445 HType result = HType::Tagged(); |
| 447 if (value->IsSmi()) { | 446 if (value->IsSmi()) { |
| 448 result = HType::Smi(); | 447 result = HType::Smi(); |
| (...skipping 1153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1602 | 1601 |
| 1603 // Return NULL to remove this instruction from the graph. | 1602 // Return NULL to remove this instruction from the graph. |
| 1604 return NULL; | 1603 return NULL; |
| 1605 } | 1604 } |
| 1606 } | 1605 } |
| 1607 return this; | 1606 return this; |
| 1608 } | 1607 } |
| 1609 | 1608 |
| 1610 | 1609 |
| 1611 HValue* HCheckInstanceType::Canonicalize() { | 1610 HValue* HCheckInstanceType::Canonicalize() { |
| 1612 if (check_ == IS_STRING && | 1611 if (check_ == IS_STRING && value()->type().IsString()) { |
| 1613 !value()->type().IsUninitialized() && | |
| 1614 value()->type().IsString()) { | |
| 1615 return NULL; | 1612 return NULL; |
| 1616 } | 1613 } |
| 1617 | 1614 |
| 1618 if (check_ == IS_INTERNALIZED_STRING && value()->IsConstant()) { | 1615 if (check_ == IS_INTERNALIZED_STRING && value()->IsConstant()) { |
| 1619 if (HConstant::cast(value())->HasInternalizedStringValue()) return NULL; | 1616 if (HConstant::cast(value())->HasInternalizedStringValue()) return NULL; |
| 1620 } | 1617 } |
| 1621 return this; | 1618 return this; |
| 1622 } | 1619 } |
| 1623 | 1620 |
| 1624 | 1621 |
| (...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2604 HConstant::HConstant(Handle<Object> handle, Representation r) | 2601 HConstant::HConstant(Handle<Object> handle, Representation r) |
| 2605 : handle_(handle), | 2602 : handle_(handle), |
| 2606 unique_id_(), | 2603 unique_id_(), |
| 2607 has_smi_value_(false), | 2604 has_smi_value_(false), |
| 2608 has_int32_value_(false), | 2605 has_int32_value_(false), |
| 2609 has_double_value_(false), | 2606 has_double_value_(false), |
| 2610 is_internalized_string_(false), | 2607 is_internalized_string_(false), |
| 2611 is_not_in_new_space_(true), | 2608 is_not_in_new_space_(true), |
| 2612 is_cell_(false), | 2609 is_cell_(false), |
| 2613 boolean_value_(handle->BooleanValue()) { | 2610 boolean_value_(handle->BooleanValue()) { |
| 2611 set_type(HType::TypeFromValue(handle)); |
| 2612 |
| 2614 if (handle_->IsHeapObject()) { | 2613 if (handle_->IsHeapObject()) { |
| 2615 Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap(); | 2614 Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap(); |
| 2616 is_not_in_new_space_ = !heap->InNewSpace(*handle); | 2615 is_not_in_new_space_ = !heap->InNewSpace(*handle); |
| 2617 } | 2616 } |
| 2618 if (handle_->IsNumber()) { | 2617 if (handle_->IsNumber()) { |
| 2619 double n = handle_->Number(); | 2618 double n = handle_->Number(); |
| 2620 has_int32_value_ = IsInteger32(n); | 2619 has_int32_value_ = IsInteger32(n); |
| 2621 int32_value_ = DoubleToInt32(n); | 2620 int32_value_ = DoubleToInt32(n); |
| 2622 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); | 2621 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); |
| 2623 double_value_ = n; | 2622 double_value_ = n; |
| 2624 has_double_value_ = true; | 2623 has_double_value_ = true; |
| 2625 } else { | 2624 } else { |
| 2626 type_from_value_ = HType::TypeFromValue(handle_); | |
| 2627 is_internalized_string_ = handle_->IsInternalizedString(); | 2625 is_internalized_string_ = handle_->IsInternalizedString(); |
| 2628 } | 2626 } |
| 2629 | 2627 |
| 2630 is_cell_ = !handle_.is_null() && | 2628 is_cell_ = !handle_.is_null() && |
| 2631 (handle_->IsCell() || handle_->IsPropertyCell()); | 2629 (handle_->IsCell() || handle_->IsPropertyCell()); |
| 2632 Initialize(r); | 2630 Initialize(r); |
| 2633 } | 2631 } |
| 2634 | 2632 |
| 2635 | 2633 |
| 2636 HConstant::HConstant(Handle<Object> handle, | 2634 HConstant::HConstant(Handle<Object> handle, |
| 2637 UniqueValueId unique_id, | 2635 UniqueValueId unique_id, |
| 2638 Representation r, | 2636 Representation r, |
| 2639 HType type, | 2637 HType type, |
| 2640 bool is_internalize_string, | 2638 bool is_internalize_string, |
| 2641 bool is_not_in_new_space, | 2639 bool is_not_in_new_space, |
| 2642 bool is_cell, | 2640 bool is_cell, |
| 2643 bool boolean_value) | 2641 bool boolean_value) |
| 2644 : handle_(handle), | 2642 : handle_(handle), |
| 2645 unique_id_(unique_id), | 2643 unique_id_(unique_id), |
| 2646 has_smi_value_(false), | 2644 has_smi_value_(false), |
| 2647 has_int32_value_(false), | 2645 has_int32_value_(false), |
| 2648 has_double_value_(false), | 2646 has_double_value_(false), |
| 2649 is_internalized_string_(is_internalize_string), | 2647 is_internalized_string_(is_internalize_string), |
| 2650 is_not_in_new_space_(is_not_in_new_space), | 2648 is_not_in_new_space_(is_not_in_new_space), |
| 2651 is_cell_(is_cell), | 2649 is_cell_(is_cell), |
| 2652 boolean_value_(boolean_value), | 2650 boolean_value_(boolean_value) { |
| 2653 type_from_value_(type) { | |
| 2654 ASSERT(!handle.is_null()); | 2651 ASSERT(!handle.is_null()); |
| 2655 ASSERT(!type.IsUninitialized()); | |
| 2656 ASSERT(!type.IsTaggedNumber()); | 2652 ASSERT(!type.IsTaggedNumber()); |
| 2653 set_type(type); |
| 2657 Initialize(r); | 2654 Initialize(r); |
| 2658 } | 2655 } |
| 2659 | 2656 |
| 2660 | 2657 |
| 2661 HConstant::HConstant(int32_t integer_value, | 2658 HConstant::HConstant(int32_t integer_value, |
| 2662 Representation r, | 2659 Representation r, |
| 2663 bool is_not_in_new_space, | 2660 bool is_not_in_new_space, |
| 2664 Handle<Object> optional_handle) | 2661 Handle<Object> optional_handle) |
| 2665 : handle_(optional_handle), | 2662 : handle_(optional_handle), |
| 2666 unique_id_(), | 2663 unique_id_(), |
| 2664 has_smi_value_(Smi::IsValid(integer_value)), |
| 2667 has_int32_value_(true), | 2665 has_int32_value_(true), |
| 2668 has_double_value_(true), | 2666 has_double_value_(true), |
| 2669 is_internalized_string_(false), | 2667 is_internalized_string_(false), |
| 2670 is_not_in_new_space_(is_not_in_new_space), | 2668 is_not_in_new_space_(is_not_in_new_space), |
| 2671 is_cell_(false), | 2669 is_cell_(false), |
| 2672 boolean_value_(integer_value != 0), | 2670 boolean_value_(integer_value != 0), |
| 2673 int32_value_(integer_value), | 2671 int32_value_(integer_value), |
| 2674 double_value_(FastI2D(integer_value)) { | 2672 double_value_(FastI2D(integer_value)) { |
| 2675 has_smi_value_ = Smi::IsValid(int32_value_); | 2673 set_type(has_smi_value_ ? HType::Smi() : HType::TaggedNumber()); |
| 2676 Initialize(r); | 2674 Initialize(r); |
| 2677 } | 2675 } |
| 2678 | 2676 |
| 2679 | 2677 |
| 2680 HConstant::HConstant(double double_value, | 2678 HConstant::HConstant(double double_value, |
| 2681 Representation r, | 2679 Representation r, |
| 2682 bool is_not_in_new_space, | 2680 bool is_not_in_new_space, |
| 2683 Handle<Object> optional_handle) | 2681 Handle<Object> optional_handle) |
| 2684 : handle_(optional_handle), | 2682 : handle_(optional_handle), |
| 2685 unique_id_(), | 2683 unique_id_(), |
| 2686 has_int32_value_(IsInteger32(double_value)), | 2684 has_int32_value_(IsInteger32(double_value)), |
| 2687 has_double_value_(true), | 2685 has_double_value_(true), |
| 2688 is_internalized_string_(false), | 2686 is_internalized_string_(false), |
| 2689 is_not_in_new_space_(is_not_in_new_space), | 2687 is_not_in_new_space_(is_not_in_new_space), |
| 2690 is_cell_(false), | 2688 is_cell_(false), |
| 2691 boolean_value_(double_value != 0 && !std::isnan(double_value)), | 2689 boolean_value_(double_value != 0 && !std::isnan(double_value)), |
| 2692 int32_value_(DoubleToInt32(double_value)), | 2690 int32_value_(DoubleToInt32(double_value)), |
| 2693 double_value_(double_value) { | 2691 double_value_(double_value) { |
| 2694 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); | 2692 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); |
| 2693 set_type(has_smi_value_ ? HType::Smi() : HType::TaggedNumber()); |
| 2695 Initialize(r); | 2694 Initialize(r); |
| 2696 } | 2695 } |
| 2697 | 2696 |
| 2698 | 2697 |
| 2699 void HConstant::Initialize(Representation r) { | 2698 void HConstant::Initialize(Representation r) { |
| 2700 if (r.IsNone()) { | 2699 if (r.IsNone()) { |
| 2701 if (has_smi_value_) { | 2700 if (has_smi_value_) { |
| 2702 r = Representation::Smi(); | 2701 r = Representation::Smi(); |
| 2703 } else if (has_int32_value_) { | 2702 } else if (has_int32_value_) { |
| 2704 r = Representation::Integer32(); | 2703 r = Representation::Integer32(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2731 if (has_int32_value_) { | 2730 if (has_int32_value_) { |
| 2732 return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, handle_); | 2731 return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, handle_); |
| 2733 } | 2732 } |
| 2734 if (has_double_value_) { | 2733 if (has_double_value_) { |
| 2735 return new(zone) HConstant(double_value_, r, is_not_in_new_space_, handle_); | 2734 return new(zone) HConstant(double_value_, r, is_not_in_new_space_, handle_); |
| 2736 } | 2735 } |
| 2737 ASSERT(!handle_.is_null()); | 2736 ASSERT(!handle_.is_null()); |
| 2738 return new(zone) HConstant(handle_, | 2737 return new(zone) HConstant(handle_, |
| 2739 unique_id_, | 2738 unique_id_, |
| 2740 r, | 2739 r, |
| 2741 type_from_value_, | 2740 type_, |
| 2742 is_internalized_string_, | 2741 is_internalized_string_, |
| 2743 is_not_in_new_space_, | 2742 is_not_in_new_space_, |
| 2744 is_cell_, | 2743 is_cell_, |
| 2745 boolean_value_); | 2744 boolean_value_); |
| 2746 } | 2745 } |
| 2747 | 2746 |
| 2748 | 2747 |
| 2749 Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) { | 2748 Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) { |
| 2750 HConstant* res = NULL; | 2749 HConstant* res = NULL; |
| 2751 if (has_int32_value_) { | 2750 if (has_int32_value_) { |
| (...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3603 return HType::NonPrimitive(); | 3602 return HType::NonPrimitive(); |
| 3604 } | 3603 } |
| 3605 | 3604 |
| 3606 | 3605 |
| 3607 HType HCheckSmi::CalculateInferredType() { | 3606 HType HCheckSmi::CalculateInferredType() { |
| 3608 return HType::Smi(); | 3607 return HType::Smi(); |
| 3609 } | 3608 } |
| 3610 | 3609 |
| 3611 | 3610 |
| 3612 HType HPhi::CalculateInferredType() { | 3611 HType HPhi::CalculateInferredType() { |
| 3613 HType result = HType::Uninitialized(); | 3612 if (OperandCount() == 0) return HType::Tagged(); |
| 3614 for (int i = 0; i < OperandCount(); ++i) { | 3613 HType result = OperandAt(0)->type(); |
| 3614 for (int i = 1; i < OperandCount(); ++i) { |
| 3615 HType current = OperandAt(i)->type(); | 3615 HType current = OperandAt(i)->type(); |
| 3616 result = result.Combine(current); | 3616 result = result.Combine(current); |
| 3617 } | 3617 } |
| 3618 return result; | 3618 return result; |
| 3619 } | 3619 } |
| 3620 | 3620 |
| 3621 | 3621 |
| 3622 HType HConstant::CalculateInferredType() { | |
| 3623 if (has_int32_value_) { | |
| 3624 return Smi::IsValid(int32_value_) ? HType::Smi() : HType::HeapNumber(); | |
| 3625 } | |
| 3626 if (has_double_value_) return HType::HeapNumber(); | |
| 3627 ASSERT(!type_from_value_.IsUninitialized()); | |
| 3628 return type_from_value_; | |
| 3629 } | |
| 3630 | |
| 3631 | |
| 3632 HType HCompareGeneric::CalculateInferredType() { | 3622 HType HCompareGeneric::CalculateInferredType() { |
| 3633 return HType::Boolean(); | 3623 return HType::Boolean(); |
| 3634 } | 3624 } |
| 3635 | 3625 |
| 3636 | 3626 |
| 3637 HType HInstanceOf::CalculateInferredType() { | 3627 HType HInstanceOf::CalculateInferredType() { |
| 3638 return HType::Boolean(); | 3628 return HType::Boolean(); |
| 3639 } | 3629 } |
| 3640 | 3630 |
| 3641 | 3631 |
| (...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4493 case kBackingStore: | 4483 case kBackingStore: |
| 4494 if (!name_.is_null()) stream->Add(*String::cast(*name_)->ToCString()); | 4484 if (!name_.is_null()) stream->Add(*String::cast(*name_)->ToCString()); |
| 4495 stream->Add("[backing-store]"); | 4485 stream->Add("[backing-store]"); |
| 4496 break; | 4486 break; |
| 4497 } | 4487 } |
| 4498 | 4488 |
| 4499 stream->Add("@%d", offset()); | 4489 stream->Add("@%d", offset()); |
| 4500 } | 4490 } |
| 4501 | 4491 |
| 4502 } } // namespace v8::internal | 4492 } } // namespace v8::internal |
| OLD | NEW |