| Index: src/hydrogen-instructions.cc
|
| ===================================================================
|
| --- src/hydrogen-instructions.cc (revision 8618)
|
| +++ src/hydrogen-instructions.cc (working copy)
|
| @@ -669,7 +669,7 @@
|
| }
|
|
|
|
|
| -void HClassOfTest::PrintDataTo(StringStream* stream) {
|
| +void HClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
|
| stream->Add("class_of_test(");
|
| value()->PrintNameTo(stream);
|
| stream->Add(", \"%o\")", *class_name());
|
| @@ -686,15 +686,13 @@
|
|
|
|
|
| void HControlInstruction::PrintDataTo(StringStream* stream) {
|
| - if (FirstSuccessor() != NULL) {
|
| - int first_id = FirstSuccessor()->block_id();
|
| - if (SecondSuccessor() == NULL) {
|
| - stream->Add(" B%d", first_id);
|
| - } else {
|
| - int second_id = SecondSuccessor()->block_id();
|
| - stream->Add(" goto (B%d, B%d)", first_id, second_id);
|
| - }
|
| + stream->Add(" goto (");
|
| + bool first_block = true;
|
| + for (HSuccessorIterator it(this); !it.Done(); it.Advance()) {
|
| + stream->Add(first_block ? "B%d" : ", B%d", it.Current()->block_id());
|
| + first_block = false;
|
| }
|
| + stream->Add(")");
|
| }
|
|
|
|
|
| @@ -704,6 +702,11 @@
|
| }
|
|
|
|
|
| +void HReturn::PrintDataTo(StringStream* stream) {
|
| + value()->PrintNameTo(stream);
|
| +}
|
| +
|
| +
|
| void HCompareMap::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| stream->Add(" (%p)", *map());
|
| @@ -744,10 +747,10 @@
|
| }
|
|
|
|
|
| -void HHasInstanceType::PrintDataTo(StringStream* stream) {
|
| +void HHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| switch (from_) {
|
| - case FIRST_JS_OBJECT_TYPE:
|
| + case FIRST_JS_RECEIVER_TYPE:
|
| if (to_ == LAST_TYPE) stream->Add(" spec_object");
|
| break;
|
| case JS_REGEXP_TYPE:
|
| @@ -765,7 +768,7 @@
|
| }
|
|
|
|
|
| -void HTypeofIs::PrintDataTo(StringStream* stream) {
|
| +void HTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
|
| value()->PrintNameTo(stream);
|
| stream->Add(" == ");
|
| stream->Add(type_literal_->ToAsciiVector());
|
| @@ -781,14 +784,28 @@
|
| }
|
|
|
|
|
| +HValue* HCheckInstanceType::Canonicalize() {
|
| + if (check_ == IS_STRING &&
|
| + !value()->type().IsUninitialized() &&
|
| + value()->type().IsString()) {
|
| + return NULL;
|
| + }
|
| + if (check_ == IS_SYMBOL &&
|
| + value()->IsConstant() &&
|
| + HConstant::cast(value())->handle()->IsSymbol()) {
|
| + return NULL;
|
| + }
|
| + return this;
|
| +}
|
| +
|
| +
|
| void HCheckInstanceType::GetCheckInterval(InstanceType* first,
|
| InstanceType* last) {
|
| ASSERT(is_interval_check());
|
| switch (check_) {
|
| - case IS_JS_OBJECT_OR_JS_FUNCTION:
|
| - STATIC_ASSERT((LAST_JS_OBJECT_TYPE + 1) == JS_FUNCTION_TYPE);
|
| - *first = FIRST_JS_OBJECT_TYPE;
|
| - *last = JS_FUNCTION_TYPE;
|
| + case IS_SPEC_OBJECT:
|
| + *first = FIRST_SPEC_OBJECT_TYPE;
|
| + *last = LAST_SPEC_OBJECT_TYPE;
|
| return;
|
| case IS_JS_ARRAY:
|
| *first = *last = JS_ARRAY_TYPE;
|
| @@ -1084,6 +1101,16 @@
|
| }
|
|
|
|
|
| +void HDeoptimize::PrintDataTo(StringStream* stream) {
|
| + if (OperandCount() == 0) return;
|
| + OperandAt(0)->PrintNameTo(stream);
|
| + for (int i = 1; i < OperandCount(); ++i) {
|
| + stream->Add(" ");
|
| + OperandAt(i)->PrintNameTo(stream);
|
| + }
|
| +}
|
| +
|
| +
|
| void HEnterInlined::PrintDataTo(StringStream* stream) {
|
| SmartPointer<char> name = function()->debug_name()->ToCString();
|
| stream->Add("%s, id=%d", *name, function()->id());
|
| @@ -1219,21 +1246,28 @@
|
|
|
|
|
|
|
| -void HCompare::PrintDataTo(StringStream* stream) {
|
| +void HCompareGeneric::PrintDataTo(StringStream* stream) {
|
| stream->Add(Token::Name(token()));
|
| stream->Add(" ");
|
| HBinaryOperation::PrintDataTo(stream);
|
| }
|
|
|
|
|
| -void HCompare::SetInputRepresentation(Representation r) {
|
| +void HCompareIDAndBranch::PrintDataTo(StringStream* stream) {
|
| + stream->Add(Token::Name(token()));
|
| + stream->Add(" ");
|
| + left()->PrintNameTo(stream);
|
| + stream->Add(" ");
|
| + right()->PrintNameTo(stream);
|
| +}
|
| +
|
| +
|
| +void HCompareIDAndBranch::SetInputRepresentation(Representation r) {
|
| input_representation_ = r;
|
| - if (r.IsTagged()) {
|
| - SetAllSideEffects();
|
| - ClearFlag(kUseGVN);
|
| + if (r.IsDouble()) {
|
| + SetFlag(kDeoptimizeOnUndefined);
|
| } else {
|
| - ClearAllSideEffects();
|
| - SetFlag(kUseGVN);
|
| + ASSERT(r.IsInteger32());
|
| }
|
| }
|
|
|
| @@ -1249,13 +1283,15 @@
|
| }
|
|
|
|
|
| -HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* object,
|
| +HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context,
|
| + HValue* object,
|
| ZoneMapList* types,
|
| Handle<String> name)
|
| - : HUnaryOperation(object),
|
| - types_(Min(types->length(), kMaxLoadPolymorphism)),
|
| + : types_(Min(types->length(), kMaxLoadPolymorphism)),
|
| name_(name),
|
| need_generic_(false) {
|
| + SetOperandAt(0, context);
|
| + SetOperandAt(1, object);
|
| set_representation(Representation::Tagged());
|
| SetFlag(kDependsOnMaps);
|
| for (int i = 0;
|
| @@ -1342,34 +1378,40 @@
|
| StringStream* stream) {
|
| external_pointer()->PrintNameTo(stream);
|
| stream->Add(".");
|
| - switch (array_type()) {
|
| - case kExternalByteArray:
|
| + switch (elements_kind()) {
|
| + case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
| stream->Add("byte");
|
| break;
|
| - case kExternalUnsignedByteArray:
|
| + case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
| stream->Add("u_byte");
|
| break;
|
| - case kExternalShortArray:
|
| + case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
| stream->Add("short");
|
| break;
|
| - case kExternalUnsignedShortArray:
|
| + case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
| stream->Add("u_short");
|
| break;
|
| - case kExternalIntArray:
|
| + case JSObject::EXTERNAL_INT_ELEMENTS:
|
| stream->Add("int");
|
| break;
|
| - case kExternalUnsignedIntArray:
|
| + case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
| stream->Add("u_int");
|
| break;
|
| - case kExternalFloatArray:
|
| + case JSObject::EXTERNAL_FLOAT_ELEMENTS:
|
| stream->Add("float");
|
| break;
|
| - case kExternalDoubleArray:
|
| + case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
|
| stream->Add("double");
|
| break;
|
| - case kExternalPixelArray:
|
| + case JSObject::EXTERNAL_PIXEL_ELEMENTS:
|
| stream->Add("pixel");
|
| break;
|
| + case JSObject::FAST_ELEMENTS:
|
| + case JSObject::FAST_DOUBLE_ELEMENTS:
|
| + case JSObject::DICTIONARY_ELEMENTS:
|
| + case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
|
| + UNREACHABLE();
|
| + break;
|
| }
|
| stream->Add("[");
|
| key()->PrintNameTo(stream);
|
| @@ -1422,34 +1464,40 @@
|
| StringStream* stream) {
|
| external_pointer()->PrintNameTo(stream);
|
| stream->Add(".");
|
| - switch (array_type()) {
|
| - case kExternalByteArray:
|
| + switch (elements_kind()) {
|
| + case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
| stream->Add("byte");
|
| break;
|
| - case kExternalUnsignedByteArray:
|
| + case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
| stream->Add("u_byte");
|
| break;
|
| - case kExternalShortArray:
|
| + case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
| stream->Add("short");
|
| break;
|
| - case kExternalUnsignedShortArray:
|
| + case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
| stream->Add("u_short");
|
| break;
|
| - case kExternalIntArray:
|
| + case JSObject::EXTERNAL_INT_ELEMENTS:
|
| stream->Add("int");
|
| break;
|
| - case kExternalUnsignedIntArray:
|
| + case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
| stream->Add("u_int");
|
| break;
|
| - case kExternalFloatArray:
|
| + case JSObject::EXTERNAL_FLOAT_ELEMENTS:
|
| stream->Add("float");
|
| break;
|
| - case kExternalDoubleArray:
|
| + case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
|
| stream->Add("double");
|
| break;
|
| - case kExternalPixelArray:
|
| + case JSObject::EXTERNAL_PIXEL_ELEMENTS:
|
| stream->Add("pixel");
|
| break;
|
| + case JSObject::FAST_ELEMENTS:
|
| + case JSObject::FAST_DOUBLE_ELEMENTS:
|
| + case JSObject::DICTIONARY_ELEMENTS:
|
| + case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
|
| + UNREACHABLE();
|
| + break;
|
| }
|
| stream->Add("[");
|
| key()->PrintNameTo(stream);
|
| @@ -1538,21 +1586,26 @@
|
| }
|
|
|
|
|
| -HType HCompare::CalculateInferredType() {
|
| +HType HCompareGeneric::CalculateInferredType() {
|
| return HType::Boolean();
|
| }
|
|
|
|
|
| -HType HCompareJSObjectEq::CalculateInferredType() {
|
| +HType HInstanceOf::CalculateInferredType() {
|
| return HType::Boolean();
|
| }
|
|
|
|
|
| -HType HUnaryPredicate::CalculateInferredType() {
|
| +HType HDeleteProperty::CalculateInferredType() {
|
| return HType::Boolean();
|
| }
|
|
|
|
|
| +HType HInstanceOfKnownGlobal::CalculateInferredType() {
|
| + return HType::Boolean();
|
| +}
|
| +
|
| +
|
| HType HBitwiseBinaryOperation::CalculateInferredType() {
|
| return HType::TaggedNumber();
|
| }
|
| @@ -1725,7 +1778,6 @@
|
|
|
| void HBoundsCheck::Verify() {
|
| HInstruction::Verify();
|
| - ASSERT(HasNoUses());
|
| }
|
|
|
|
|
|
|