| Index: src/hydrogen-instructions.cc
|
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
|
| index 54b53db5940d723ba0ccd58f2293688b553824c5..5fe3af1f5bd3e31e137bb73897ee5cba12ff4605 100644
|
| --- a/src/hydrogen-instructions.cc
|
| +++ b/src/hydrogen-instructions.cc
|
| @@ -448,7 +448,6 @@ const char* HType::ToString() {
|
| // Note: The c1visualizer syntax for locals allows only a sequence of the
|
| // following characters: A-Za-z0-9_-|:
|
| switch (type_) {
|
| - case kNone: return "none";
|
| case kTagged: return "tagged";
|
| case kTaggedPrimitive: return "primitive";
|
| case kTaggedNumber: return "number";
|
| @@ -459,6 +458,7 @@ const char* HType::ToString() {
|
| case kNonPrimitive: return "non-primitive";
|
| case kJSArray: return "array";
|
| case kJSObject: return "object";
|
| + case kUninitialized: return "uninitialized";
|
| }
|
| UNREACHABLE();
|
| return "unreachable";
|
| @@ -1632,7 +1632,9 @@ HValue* HUnaryMathOperation::Canonicalize() {
|
|
|
|
|
| HValue* HCheckInstanceType::Canonicalize() {
|
| - if (check_ == IS_STRING && value()->type().IsString()) {
|
| + if (check_ == IS_STRING &&
|
| + !value()->type().IsUninitialized() &&
|
| + value()->type().IsString()) {
|
| return NULL;
|
| }
|
|
|
| @@ -2645,13 +2647,10 @@ HConstant::HConstant(Handle<Object> handle, Representation r)
|
| has_smi_value_(false),
|
| has_int32_value_(false),
|
| has_double_value_(false),
|
| - has_external_reference_value_(false),
|
| is_internalized_string_(false),
|
| is_not_in_new_space_(true),
|
| is_cell_(false),
|
| boolean_value_(handle->BooleanValue()) {
|
| - set_type(HType::TypeFromValue(handle));
|
| -
|
| if (handle_->IsHeapObject()) {
|
| Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap();
|
| is_not_in_new_space_ = !heap->InNewSpace(*handle);
|
| @@ -2664,6 +2663,7 @@ HConstant::HConstant(Handle<Object> handle, Representation r)
|
| double_value_ = n;
|
| has_double_value_ = true;
|
| } else {
|
| + type_from_value_ = HType::TypeFromValue(handle_);
|
| is_internalized_string_ = handle_->IsInternalizedString();
|
| }
|
|
|
| @@ -2681,19 +2681,19 @@ HConstant::HConstant(Handle<Object> handle,
|
| bool is_not_in_new_space,
|
| bool is_cell,
|
| bool boolean_value)
|
| - : handle_(handle),
|
| - unique_id_(unique_id),
|
| - has_smi_value_(false),
|
| - has_int32_value_(false),
|
| - has_double_value_(false),
|
| - has_external_reference_value_(false),
|
| - is_internalized_string_(is_internalize_string),
|
| - is_not_in_new_space_(is_not_in_new_space),
|
| - is_cell_(is_cell),
|
| - boolean_value_(boolean_value) {
|
| + : handle_(handle),
|
| + unique_id_(unique_id),
|
| + has_smi_value_(false),
|
| + has_int32_value_(false),
|
| + has_double_value_(false),
|
| + is_internalized_string_(is_internalize_string),
|
| + is_not_in_new_space_(is_not_in_new_space),
|
| + is_cell_(is_cell),
|
| + boolean_value_(boolean_value),
|
| + type_from_value_(type) {
|
| ASSERT(!handle.is_null());
|
| + ASSERT(!type.IsUninitialized());
|
| ASSERT(!type.IsTaggedNumber());
|
| - set_type(type);
|
| Initialize(r);
|
| }
|
|
|
| @@ -2702,19 +2702,17 @@ HConstant::HConstant(int32_t integer_value,
|
| Representation r,
|
| bool is_not_in_new_space,
|
| Handle<Object> optional_handle)
|
| - : handle_(optional_handle),
|
| - unique_id_(),
|
| - has_smi_value_(Smi::IsValid(integer_value)),
|
| - has_int32_value_(true),
|
| - has_double_value_(true),
|
| - has_external_reference_value_(false),
|
| - is_internalized_string_(false),
|
| - is_not_in_new_space_(is_not_in_new_space),
|
| - is_cell_(false),
|
| - boolean_value_(integer_value != 0),
|
| - int32_value_(integer_value),
|
| - double_value_(FastI2D(integer_value)) {
|
| - set_type(has_smi_value_ ? HType::Smi() : HType::TaggedNumber());
|
| + : handle_(optional_handle),
|
| + unique_id_(),
|
| + has_int32_value_(true),
|
| + has_double_value_(true),
|
| + is_internalized_string_(false),
|
| + is_not_in_new_space_(is_not_in_new_space),
|
| + is_cell_(false),
|
| + boolean_value_(integer_value != 0),
|
| + int32_value_(integer_value),
|
| + double_value_(FastI2D(integer_value)) {
|
| + has_smi_value_ = Smi::IsValid(int32_value_);
|
| Initialize(r);
|
| }
|
|
|
| @@ -2723,38 +2721,21 @@ HConstant::HConstant(double double_value,
|
| Representation r,
|
| bool is_not_in_new_space,
|
| Handle<Object> optional_handle)
|
| - : handle_(optional_handle),
|
| - unique_id_(),
|
| - has_int32_value_(IsInteger32(double_value)),
|
| - has_double_value_(true),
|
| - has_external_reference_value_(false),
|
| - is_internalized_string_(false),
|
| - is_not_in_new_space_(is_not_in_new_space),
|
| - is_cell_(false),
|
| - boolean_value_(double_value != 0 && !std::isnan(double_value)),
|
| - int32_value_(DoubleToInt32(double_value)),
|
| - double_value_(double_value) {
|
| + : handle_(optional_handle),
|
| + unique_id_(),
|
| + has_int32_value_(IsInteger32(double_value)),
|
| + has_double_value_(true),
|
| + is_internalized_string_(false),
|
| + is_not_in_new_space_(is_not_in_new_space),
|
| + is_cell_(false),
|
| + boolean_value_(double_value != 0 && !std::isnan(double_value)),
|
| + int32_value_(DoubleToInt32(double_value)),
|
| + double_value_(double_value) {
|
| has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_);
|
| - set_type(has_smi_value_ ? HType::Smi() : HType::TaggedNumber());
|
| Initialize(r);
|
| }
|
|
|
|
|
| -HConstant::HConstant(ExternalReference reference)
|
| - : has_smi_value_(false),
|
| - has_int32_value_(false),
|
| - has_double_value_(false),
|
| - has_external_reference_value_(true),
|
| - is_internalized_string_(false),
|
| - is_not_in_new_space_(true),
|
| - is_cell_(false),
|
| - boolean_value_(true),
|
| - external_reference_value_(reference) {
|
| - set_type(HType::None());
|
| - Initialize(Representation::External());
|
| -}
|
| -
|
| -
|
| void HConstant::Initialize(Representation r) {
|
| if (r.IsNone()) {
|
| if (has_smi_value_ && kSmiValueSize == 31) {
|
| @@ -2763,8 +2744,6 @@ void HConstant::Initialize(Representation r) {
|
| r = Representation::Integer32();
|
| } else if (has_double_value_) {
|
| r = Representation::Double();
|
| - } else if (has_external_reference_value_) {
|
| - r = Representation::External();
|
| } else {
|
| r = Representation::Tagged();
|
| }
|
| @@ -2789,21 +2768,17 @@ HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const {
|
| if (r.IsSmi() && !has_smi_value_) return NULL;
|
| if (r.IsInteger32() && !has_int32_value_) return NULL;
|
| if (r.IsDouble() && !has_double_value_) return NULL;
|
| - if (r.IsExternal() && !has_external_reference_value_) return NULL;
|
| if (has_int32_value_) {
|
| return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, handle_);
|
| }
|
| if (has_double_value_) {
|
| return new(zone) HConstant(double_value_, r, is_not_in_new_space_, handle_);
|
| }
|
| - if (has_external_reference_value_) {
|
| - return new(zone) HConstant(external_reference_value_);
|
| - }
|
| ASSERT(!handle_.is_null());
|
| return new(zone) HConstant(handle_,
|
| unique_id_,
|
| r,
|
| - type_,
|
| + type_from_value_,
|
| is_internalized_string_,
|
| is_not_in_new_space_,
|
| is_cell_,
|
| @@ -2851,9 +2826,6 @@ void HConstant::PrintDataTo(StringStream* stream) {
|
| stream->Add("%d ", int32_value_);
|
| } else if (has_double_value_) {
|
| stream->Add("%f ", FmtElm(double_value_));
|
| - } else if (has_external_reference_value_) {
|
| - stream->Add("%p ", reinterpret_cast<void*>(
|
| - external_reference_value_.address()));
|
| } else {
|
| handle()->ShortPrint(stream);
|
| }
|
| @@ -3681,9 +3653,8 @@ HType HCheckSmi::CalculateInferredType() {
|
|
|
|
|
| HType HPhi::CalculateInferredType() {
|
| - if (OperandCount() == 0) return HType::Tagged();
|
| - HType result = OperandAt(0)->type();
|
| - for (int i = 1; i < OperandCount(); ++i) {
|
| + HType result = HType::Uninitialized();
|
| + for (int i = 0; i < OperandCount(); ++i) {
|
| HType current = OperandAt(i)->type();
|
| result = result.Combine(current);
|
| }
|
| @@ -3691,6 +3662,16 @@ HType HPhi::CalculateInferredType() {
|
| }
|
|
|
|
|
| +HType HConstant::CalculateInferredType() {
|
| + if (has_int32_value_) {
|
| + return Smi::IsValid(int32_value_) ? HType::Smi() : HType::HeapNumber();
|
| + }
|
| + if (has_double_value_) return HType::HeapNumber();
|
| + ASSERT(!type_from_value_.IsUninitialized());
|
| + return type_from_value_;
|
| +}
|
| +
|
| +
|
| HType HCompareGeneric::CalculateInferredType() {
|
| return HType::Boolean();
|
| }
|
| @@ -3747,6 +3728,11 @@ Representation HUnaryMathOperation::RepresentationFromInputs() {
|
| }
|
|
|
|
|
| +HType HStringCharFromCode::CalculateInferredType() {
|
| + return HType::String();
|
| +}
|
| +
|
| +
|
| void HAllocate::HandleSideEffectDominator(GVNFlag side_effect,
|
| HValue* dominator) {
|
| ASSERT(side_effect == kChangesNewSpacePromotion);
|
| @@ -4375,11 +4361,7 @@ bool HValue::HasNonSmiUse() {
|
| // We check for observed_input_representation elsewhere.
|
| Representation use_rep =
|
| it.value()->RequiredInputRepresentation(it.index());
|
| - if (!use_rep.IsNone() &&
|
| - !use_rep.IsSmi() &&
|
| - !use_rep.IsTagged()) {
|
| - return true;
|
| - }
|
| + if (!use_rep.IsNone() && !use_rep.IsSmi()) return true;
|
| }
|
| return false;
|
| }
|
| @@ -4538,10 +4520,6 @@ void HObjectAccess::SetGVNFlags(HValue *instr, bool is_store) {
|
| instr->SetGVNFlag(is_store
|
| ? kChangesMaps : kDependsOnMaps);
|
| break;
|
| - case kExternalMemory:
|
| - instr->SetGVNFlag(is_store
|
| - ? kChangesExternalMemory : kDependsOnExternalMemory);
|
| - break;
|
| }
|
| }
|
|
|
| @@ -4568,9 +4546,6 @@ void HObjectAccess::PrintTo(StringStream* stream) {
|
| if (!name_.is_null()) stream->Add(*String::cast(*name_)->ToCString());
|
| stream->Add("[backing-store]");
|
| break;
|
| - case kExternalMemory:
|
| - stream->Add("[external-memory]");
|
| - break;
|
| }
|
|
|
| stream->Add("@%d", offset());
|
|
|