| Index: src/crankshaft/hydrogen.cc
|
| diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc
|
| index c0c2fb23c193e5db6efef04bb8582183d84dc904..d559a7d3201ea138706cd019fe1c7eee6638d120 100644
|
| --- a/src/crankshaft/hydrogen.cc
|
| +++ b/src/crankshaft/hydrogen.cc
|
| @@ -2129,8 +2129,7 @@ HValue* HGraphBuilder::BuildRegExpConstructResult(HValue* length,
|
| return result;
|
| }
|
|
|
| -
|
| -HValue* HGraphBuilder::BuildNumberToString(HValue* object, Type* type) {
|
| +HValue* HGraphBuilder::BuildNumberToString(HValue* object, AstType* type) {
|
| NoObservableSideEffectsScope scope(this);
|
|
|
| // Convert constant numbers at compile time.
|
| @@ -2180,7 +2179,7 @@ HValue* HGraphBuilder::BuildNumberToString(HValue* object, Type* type) {
|
| }
|
| if_objectissmi.Else();
|
| {
|
| - if (type->Is(Type::SignedSmall())) {
|
| + if (type->Is(AstType::SignedSmall())) {
|
| if_objectissmi.Deopt(DeoptimizeReason::kExpectedSmi);
|
| } else {
|
| // Check if the object is a heap number.
|
| @@ -2236,7 +2235,7 @@ HValue* HGraphBuilder::BuildNumberToString(HValue* object, Type* type) {
|
| }
|
| if_objectisnumber.Else();
|
| {
|
| - if (type->Is(Type::Number())) {
|
| + if (type->Is(AstType::Number())) {
|
| if_objectisnumber.Deopt(DeoptimizeReason::kExpectedHeapNumber);
|
| }
|
| }
|
| @@ -4999,7 +4998,7 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) {
|
| CHECK_ALIVE(VisitForValue(stmt->tag()));
|
| Add<HSimulate>(stmt->EntryId());
|
| HValue* tag_value = Top();
|
| - Type* tag_type = bounds_.get(stmt->tag()).lower;
|
| + AstType* tag_type = bounds_.get(stmt->tag()).lower;
|
|
|
| // 1. Build all the tests, with dangling true branches
|
| BailoutId default_id = BailoutId::None();
|
| @@ -5016,8 +5015,8 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) {
|
| if (current_block() == NULL) return Bailout(kUnsupportedSwitchStatement);
|
| HValue* label_value = Pop();
|
|
|
| - Type* label_type = bounds_.get(clause->label()).lower;
|
| - Type* combined_type = clause->compare_type();
|
| + AstType* label_type = bounds_.get(clause->label()).lower;
|
| + AstType* combined_type = clause->compare_type();
|
| HControlInstruction* compare = BuildCompareInstruction(
|
| Token::EQ_STRICT, tag_value, label_value, tag_type, label_type,
|
| combined_type,
|
| @@ -6215,7 +6214,7 @@ bool HOptimizedGraphBuilder::PropertyAccessInfo::IsCompatible(
|
| PropertyAccessInfo* info) {
|
| if (!CanInlinePropertyAccess(map_)) return false;
|
|
|
| - // Currently only handle Type::Number as a polymorphic case.
|
| + // Currently only handle AstType::Number as a polymorphic case.
|
| // TODO(verwaest): Support monomorphic handling of numbers with a HCheckNumber
|
| // instruction.
|
| if (IsNumberType()) return false;
|
| @@ -7812,7 +7811,7 @@ HValue* HOptimizedGraphBuilder::BuildNamedAccess(
|
| }
|
|
|
| HValue* checked_object;
|
| - // Type::Number() is only supported by polymorphic load/call handling.
|
| + // AstType::Number() is only supported by polymorphic load/call handling.
|
| DCHECK(!info.IsNumberType());
|
| BuildCheckHeapObject(object);
|
| if (AreStringTypes(maps)) {
|
| @@ -10647,13 +10646,12 @@ void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) {
|
| if (join != NULL) return ast_context()->ReturnValue(Pop());
|
| }
|
|
|
| -
|
| -static Representation RepresentationFor(Type* type) {
|
| +static Representation RepresentationFor(AstType* type) {
|
| DisallowHeapAllocation no_allocation;
|
| - if (type->Is(Type::None())) return Representation::None();
|
| - if (type->Is(Type::SignedSmall())) return Representation::Smi();
|
| - if (type->Is(Type::Signed32())) return Representation::Integer32();
|
| - if (type->Is(Type::Number())) return Representation::Double();
|
| + if (type->Is(AstType::None())) return Representation::None();
|
| + if (type->Is(AstType::SignedSmall())) return Representation::Smi();
|
| + if (type->Is(AstType::Signed32())) return Representation::Integer32();
|
| + if (type->Is(AstType::Number())) return Representation::Double();
|
| return Representation::Tagged();
|
| }
|
|
|
| @@ -10902,27 +10900,24 @@ bool CanBeZero(HValue* right) {
|
| return true;
|
| }
|
|
|
| -
|
| -HValue* HGraphBuilder::EnforceNumberType(HValue* number,
|
| - Type* expected) {
|
| - if (expected->Is(Type::SignedSmall())) {
|
| +HValue* HGraphBuilder::EnforceNumberType(HValue* number, AstType* expected) {
|
| + if (expected->Is(AstType::SignedSmall())) {
|
| return AddUncasted<HForceRepresentation>(number, Representation::Smi());
|
| }
|
| - if (expected->Is(Type::Signed32())) {
|
| + if (expected->Is(AstType::Signed32())) {
|
| return AddUncasted<HForceRepresentation>(number,
|
| Representation::Integer32());
|
| }
|
| return number;
|
| }
|
|
|
| -
|
| -HValue* HGraphBuilder::TruncateToNumber(HValue* value, Type** expected) {
|
| +HValue* HGraphBuilder::TruncateToNumber(HValue* value, AstType** expected) {
|
| if (value->IsConstant()) {
|
| HConstant* constant = HConstant::cast(value);
|
| Maybe<HConstant*> number =
|
| constant->CopyToTruncatedNumber(isolate(), zone());
|
| if (number.IsJust()) {
|
| - *expected = Type::Number();
|
| + *expected = AstType::Number();
|
| return AddInstruction(number.FromJust());
|
| }
|
| }
|
| @@ -10932,24 +10927,24 @@ HValue* HGraphBuilder::TruncateToNumber(HValue* value, Type** expected) {
|
| // pushes with a NoObservableSideEffectsScope.
|
| NoObservableSideEffectsScope no_effects(this);
|
|
|
| - Type* expected_type = *expected;
|
| + AstType* expected_type = *expected;
|
|
|
| // Separate the number type from the rest.
|
| - Type* expected_obj =
|
| - Type::Intersect(expected_type, Type::NonNumber(), zone());
|
| - Type* expected_number =
|
| - Type::Intersect(expected_type, Type::Number(), zone());
|
| + AstType* expected_obj =
|
| + AstType::Intersect(expected_type, AstType::NonNumber(), zone());
|
| + AstType* expected_number =
|
| + AstType::Intersect(expected_type, AstType::Number(), zone());
|
|
|
| // We expect to get a number.
|
| - // (We need to check first, since Type::None->Is(Type::Any()) == true.
|
| - if (expected_obj->Is(Type::None())) {
|
| - DCHECK(!expected_number->Is(Type::None()));
|
| + // (We need to check first, since AstType::None->Is(AstType::Any()) == true.
|
| + if (expected_obj->Is(AstType::None())) {
|
| + DCHECK(!expected_number->Is(AstType::None()));
|
| return value;
|
| }
|
|
|
| - if (expected_obj->Is(Type::Undefined())) {
|
| + if (expected_obj->Is(AstType::Undefined())) {
|
| // This is already done by HChange.
|
| - *expected = Type::Union(expected_number, Type::Number(), zone());
|
| + *expected = AstType::Union(expected_number, AstType::Number(), zone());
|
| return value;
|
| }
|
|
|
| @@ -10962,9 +10957,9 @@ HValue* HOptimizedGraphBuilder::BuildBinaryOperation(
|
| HValue* left,
|
| HValue* right,
|
| PushBeforeSimulateBehavior push_sim_result) {
|
| - Type* left_type = bounds_.get(expr->left()).lower;
|
| - Type* right_type = bounds_.get(expr->right()).lower;
|
| - Type* result_type = bounds_.get(expr).lower;
|
| + AstType* left_type = bounds_.get(expr->left()).lower;
|
| + AstType* right_type = bounds_.get(expr->right()).lower;
|
| + AstType* result_type = bounds_.get(expr).lower;
|
| Maybe<int> fixed_right_arg = expr->fixed_right_arg();
|
| Handle<AllocationSite> allocation_site = expr->allocation_site();
|
|
|
| @@ -10990,12 +10985,10 @@ HValue* HOptimizedGraphBuilder::BuildBinaryOperation(
|
| return result;
|
| }
|
|
|
| -HValue* HGraphBuilder::BuildBinaryOperation(Token::Value op, HValue* left,
|
| - HValue* right, Type* left_type,
|
| - Type* right_type, Type* result_type,
|
| - Maybe<int> fixed_right_arg,
|
| - HAllocationMode allocation_mode,
|
| - BailoutId opt_id) {
|
| +HValue* HGraphBuilder::BuildBinaryOperation(
|
| + Token::Value op, HValue* left, HValue* right, AstType* left_type,
|
| + AstType* right_type, AstType* result_type, Maybe<int> fixed_right_arg,
|
| + HAllocationMode allocation_mode, BailoutId opt_id) {
|
| bool maybe_string_add = false;
|
| if (op == Token::ADD) {
|
| // If we are adding constant string with something for which we don't have
|
| @@ -11003,18 +10996,18 @@ HValue* HGraphBuilder::BuildBinaryOperation(Token::Value op, HValue* left,
|
| // generate deopt instructions.
|
| if (!left_type->IsInhabited() && right->IsConstant() &&
|
| HConstant::cast(right)->HasStringValue()) {
|
| - left_type = Type::String();
|
| + left_type = AstType::String();
|
| }
|
|
|
| if (!right_type->IsInhabited() && left->IsConstant() &&
|
| HConstant::cast(left)->HasStringValue()) {
|
| - right_type = Type::String();
|
| + right_type = AstType::String();
|
| }
|
|
|
| - maybe_string_add = (left_type->Maybe(Type::String()) ||
|
| - left_type->Maybe(Type::Receiver()) ||
|
| - right_type->Maybe(Type::String()) ||
|
| - right_type->Maybe(Type::Receiver()));
|
| + maybe_string_add = (left_type->Maybe(AstType::String()) ||
|
| + left_type->Maybe(AstType::Receiver()) ||
|
| + right_type->Maybe(AstType::String()) ||
|
| + right_type->Maybe(AstType::Receiver()));
|
| }
|
|
|
| Representation left_rep = RepresentationFor(left_type);
|
| @@ -11024,7 +11017,7 @@ HValue* HGraphBuilder::BuildBinaryOperation(Token::Value op, HValue* left,
|
| Add<HDeoptimize>(
|
| DeoptimizeReason::kInsufficientTypeFeedbackForLHSOfBinaryOperation,
|
| Deoptimizer::SOFT);
|
| - left_type = Type::Any();
|
| + left_type = AstType::Any();
|
| left_rep = RepresentationFor(left_type);
|
| maybe_string_add = op == Token::ADD;
|
| }
|
| @@ -11033,7 +11026,7 @@ HValue* HGraphBuilder::BuildBinaryOperation(Token::Value op, HValue* left,
|
| Add<HDeoptimize>(
|
| DeoptimizeReason::kInsufficientTypeFeedbackForRHSOfBinaryOperation,
|
| Deoptimizer::SOFT);
|
| - right_type = Type::Any();
|
| + right_type = AstType::Any();
|
| right_rep = RepresentationFor(right_type);
|
| maybe_string_add = op == Token::ADD;
|
| }
|
| @@ -11045,34 +11038,34 @@ HValue* HGraphBuilder::BuildBinaryOperation(Token::Value op, HValue* left,
|
|
|
| // Special case for string addition here.
|
| if (op == Token::ADD &&
|
| - (left_type->Is(Type::String()) || right_type->Is(Type::String()))) {
|
| + (left_type->Is(AstType::String()) || right_type->Is(AstType::String()))) {
|
| // Validate type feedback for left argument.
|
| - if (left_type->Is(Type::String())) {
|
| + if (left_type->Is(AstType::String())) {
|
| left = BuildCheckString(left);
|
| }
|
|
|
| // Validate type feedback for right argument.
|
| - if (right_type->Is(Type::String())) {
|
| + if (right_type->Is(AstType::String())) {
|
| right = BuildCheckString(right);
|
| }
|
|
|
| // Convert left argument as necessary.
|
| - if (left_type->Is(Type::Number())) {
|
| - DCHECK(right_type->Is(Type::String()));
|
| + if (left_type->Is(AstType::Number())) {
|
| + DCHECK(right_type->Is(AstType::String()));
|
| left = BuildNumberToString(left, left_type);
|
| - } else if (!left_type->Is(Type::String())) {
|
| - DCHECK(right_type->Is(Type::String()));
|
| + } else if (!left_type->Is(AstType::String())) {
|
| + DCHECK(right_type->Is(AstType::String()));
|
| return AddUncasted<HStringAdd>(
|
| left, right, allocation_mode.GetPretenureMode(),
|
| STRING_ADD_CONVERT_LEFT, allocation_mode.feedback_site());
|
| }
|
|
|
| // Convert right argument as necessary.
|
| - if (right_type->Is(Type::Number())) {
|
| - DCHECK(left_type->Is(Type::String()));
|
| + if (right_type->Is(AstType::Number())) {
|
| + DCHECK(left_type->Is(AstType::String()));
|
| right = BuildNumberToString(right, right_type);
|
| - } else if (!right_type->Is(Type::String())) {
|
| - DCHECK(left_type->Is(Type::String()));
|
| + } else if (!right_type->Is(AstType::String())) {
|
| + DCHECK(left_type->Is(AstType::String()));
|
| return AddUncasted<HStringAdd>(
|
| left, right, allocation_mode.GetPretenureMode(),
|
| STRING_ADD_CONVERT_RIGHT, allocation_mode.feedback_site());
|
| @@ -11230,8 +11223,8 @@ HValue* HGraphBuilder::BuildBinaryOperation(Token::Value op, HValue* left,
|
| break;
|
| case Token::BIT_OR: {
|
| HValue *operand, *shift_amount;
|
| - if (left_type->Is(Type::Signed32()) &&
|
| - right_type->Is(Type::Signed32()) &&
|
| + if (left_type->Is(AstType::Signed32()) &&
|
| + right_type->Is(AstType::Signed32()) &&
|
| MatchRotateRight(left, right, &operand, &shift_amount)) {
|
| instr = AddUncasted<HRor>(operand, shift_amount);
|
| } else {
|
| @@ -11503,9 +11496,9 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) {
|
| return ast_context()->ReturnControl(instr, expr->id());
|
| }
|
|
|
| - Type* left_type = bounds_.get(expr->left()).lower;
|
| - Type* right_type = bounds_.get(expr->right()).lower;
|
| - Type* combined_type = expr->combined_type();
|
| + AstType* left_type = bounds_.get(expr->left()).lower;
|
| + AstType* right_type = bounds_.get(expr->right()).lower;
|
| + AstType* combined_type = expr->combined_type();
|
|
|
| CHECK_ALIVE(VisitForValue(expr->left()));
|
| CHECK_ALIVE(VisitForValue(expr->right()));
|
| @@ -11577,10 +11570,9 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) {
|
| return ast_context()->ReturnControl(compare, expr->id());
|
| }
|
|
|
| -
|
| HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
|
| - Token::Value op, HValue* left, HValue* right, Type* left_type,
|
| - Type* right_type, Type* combined_type, SourcePosition left_position,
|
| + Token::Value op, HValue* left, HValue* right, AstType* left_type,
|
| + AstType* right_type, AstType* combined_type, SourcePosition left_position,
|
| SourcePosition right_position, PushBeforeSimulateBehavior push_sim_result,
|
| BailoutId bailout_id) {
|
| // Cases handled below depend on collected type feedback. They should
|
| @@ -11590,14 +11582,14 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
|
| DeoptimizeReason::
|
| kInsufficientTypeFeedbackForCombinedTypeOfBinaryOperation,
|
| Deoptimizer::SOFT);
|
| - combined_type = left_type = right_type = Type::Any();
|
| + combined_type = left_type = right_type = AstType::Any();
|
| }
|
|
|
| Representation left_rep = RepresentationFor(left_type);
|
| Representation right_rep = RepresentationFor(right_type);
|
| Representation combined_rep = RepresentationFor(combined_type);
|
|
|
| - if (combined_type->Is(Type::Receiver())) {
|
| + if (combined_type->Is(AstType::Receiver())) {
|
| if (Token::IsEqualityOp(op)) {
|
| // HCompareObjectEqAndBranch can only deal with object, so
|
| // exclude numbers.
|
| @@ -11681,7 +11673,7 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
|
| Bailout(kUnsupportedNonPrimitiveCompare);
|
| return NULL;
|
| }
|
| - } else if (combined_type->Is(Type::InternalizedString()) &&
|
| + } else if (combined_type->Is(AstType::InternalizedString()) &&
|
| Token::IsEqualityOp(op)) {
|
| // If we have a constant argument, it should be consistent with the type
|
| // feedback (otherwise we fail assertions in HCompareObjectEqAndBranch).
|
| @@ -11702,7 +11694,7 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
|
| HCompareObjectEqAndBranch* result =
|
| New<HCompareObjectEqAndBranch>(left, right);
|
| return result;
|
| - } else if (combined_type->Is(Type::String())) {
|
| + } else if (combined_type->Is(AstType::String())) {
|
| BuildCheckHeapObject(left);
|
| Add<HCheckInstanceType>(left, HCheckInstanceType::IS_STRING);
|
| BuildCheckHeapObject(right);
|
| @@ -11710,7 +11702,7 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
|
| HStringCompareAndBranch* result =
|
| New<HStringCompareAndBranch>(left, right, op);
|
| return result;
|
| - } else if (combined_type->Is(Type::Boolean())) {
|
| + } else if (combined_type->Is(AstType::Boolean())) {
|
| AddCheckMap(left, isolate()->factory()->boolean_map());
|
| AddCheckMap(right, isolate()->factory()->boolean_map());
|
| if (Token::IsEqualityOp(op)) {
|
| @@ -12515,7 +12507,7 @@ void HOptimizedGraphBuilder::GenerateNumberToString(CallRuntime* call) {
|
| DCHECK_EQ(1, call->arguments()->length());
|
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
|
| HValue* number = Pop();
|
| - HValue* result = BuildNumberToString(number, Type::Any());
|
| + HValue* result = BuildNumberToString(number, AstType::Any());
|
| return ast_context()->ReturnValue(result);
|
| }
|
|
|
|
|