Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 9d4fe2e50529e779b45cde69b4c3140274d8a3a5..6f582c76c165e85d6f45a56f445f2dfdee425918 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -9031,11 +9031,10 @@ void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) { |
HValue* context = environment()->LookupContext(); |
HInstruction* instr = |
HMul::New(zone(), context, value, graph()->GetConstantMinus1()); |
- Handle<Type> type = expr->type(); |
- Representation rep = ToRepresentation(type); |
- if (type->Is(Type::None())) { |
+ Handle<Type> operand_type = expr->expression()->lower_type(); |
+ Representation rep = ToRepresentation(operand_type); |
+ if (operand_type->Is(Type::None())) { |
AddSoftDeoptimize(); |
- type = handle(Type::Any(), isolate()); |
} |
if (instr->IsBinaryOperation()) { |
HBinaryOperation::cast(instr)->set_observed_input_representation(1, rep); |
@@ -9048,8 +9047,8 @@ void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) { |
void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { |
CHECK_ALIVE(VisitForValue(expr->expression())); |
HValue* value = Pop(); |
- Handle<Type> info = expr->type(); |
- if (info->Is(Type::None())) { |
+ Handle<Type> operand_type = expr->expression()->lower_type(); |
+ if (operand_type->Is(Type::None())) { |
AddSoftDeoptimize(); |
} |
HInstruction* instr = new(zone()) HBitNot(value); |
@@ -9411,16 +9410,16 @@ HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( |
HValue* left, |
HValue* right) { |
HValue* context = environment()->LookupContext(); |
- Handle<Type> left_type = expr->left_type(); |
- Handle<Type> right_type = expr->right_type(); |
+ Handle<Type> left_type = expr->left()->lower_type(); |
+ Handle<Type> right_type = expr->right()->lower_type(); |
Handle<Type> result_type = expr->result_type(); |
- bool has_fixed_right_arg = expr->has_fixed_right_arg(); |
- int fixed_right_arg_value = expr->fixed_right_arg_value(); |
+ Maybe<int> fixed_right_arg = expr->fixed_right_arg(); |
Representation left_rep = ToRepresentation(left_type); |
Representation right_rep = ToRepresentation(right_type); |
Representation result_rep = ToRepresentation(result_type); |
if (left_type->Is(Type::None())) { |
AddSoftDeoptimize(); |
+ // TODO(rossberg): we should be able to get rid of non-continuous defaults. |
left_type = handle(Type::Any(), isolate()); |
} |
if (right_type->Is(Type::None())) { |
@@ -9447,12 +9446,7 @@ HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( |
instr = HMul::New(zone(), context, left, right); |
break; |
case Token::MOD: |
- instr = HMod::New(zone(), |
- context, |
- left, |
- right, |
- has_fixed_right_arg, |
- fixed_right_arg_value); |
+ instr = HMod::New(zone(), context, left, right, fixed_right_arg); |
break; |
case Token::DIV: |
instr = HDiv::New(zone(), context, left, right); |
@@ -9759,17 +9753,17 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
return ast_context()->ReturnControl(instr, expr->id()); |
} |
- Handle<Type> left_type = expr->left_type(); |
- Handle<Type> right_type = expr->right_type(); |
- Handle<Type> overall_type = expr->overall_type(); |
- Representation combined_rep = ToRepresentation(overall_type); |
+ Handle<Type> left_type = expr->left()->lower_type(); |
+ Handle<Type> right_type = expr->right()->lower_type(); |
+ Handle<Type> combined_type = expr->combined_type(); |
+ Representation combined_rep = ToRepresentation(combined_type); |
Representation left_rep = ToRepresentation(left_type); |
Representation right_rep = ToRepresentation(right_type); |
// Check if this expression was ever executed according to type feedback. |
// Note that for the special typeof/null/undefined cases we get unknown here. |
- if (overall_type->Is(Type::None())) { |
+ if (combined_type->Is(Type::None())) { |
AddSoftDeoptimize(); |
- overall_type = left_type = right_type = handle(Type::Any(), isolate()); |
+ combined_type = left_type = right_type = handle(Type::Any(), isolate()); |
} |
CHECK_ALIVE(VisitForValue(expr->left())); |
@@ -9841,13 +9835,13 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
HIn* result = new(zone()) HIn(context, left, right); |
result->set_position(expr->position()); |
return ast_context()->ReturnInstruction(result, expr->id()); |
- } else if (overall_type->Is(Type::Receiver())) { |
+ } else if (combined_type->Is(Type::Receiver())) { |
switch (op) { |
case Token::EQ: |
case Token::EQ_STRICT: { |
// Can we get away with map check and not instance type check? |
- if (overall_type->IsClass()) { |
- Handle<Map> map = overall_type->AsClass(); |
+ if (combined_type->IsClass()) { |
+ Handle<Map> map = combined_type->AsClass(); |
AddCheckMapsWithTransitions(left, map); |
AddCheckMapsWithTransitions(right, map); |
HCompareObjectEqAndBranch* result = |
@@ -9868,7 +9862,7 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
default: |
return Bailout("Unsupported non-primitive compare"); |
} |
- } else if (overall_type->Is(Type::InternalizedString()) && |
+ } else if (combined_type->Is(Type::InternalizedString()) && |
Token::IsEqualityOp(op)) { |
BuildCheckNonSmi(left); |
AddInstruction(HCheckInstanceType::NewIsInternalizedString(left, zone())); |
@@ -9919,8 +9913,8 @@ void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, |
if_nil.CaptureContinuation(&continuation); |
return ast_context()->ReturnContinuation(&continuation, expr->id()); |
} |
- Handle<Type> type = expr->compare_nil_type()->Is(Type::None()) |
- ? handle(Type::Any(), isolate_) : expr->compare_nil_type(); |
+ Handle<Type> type = expr->combined_type()->Is(Type::None()) |
+ ? handle(Type::Any(), isolate_) : expr->combined_type(); |
BuildCompareNil(value, type, expr->position(), &continuation); |
return ast_context()->ReturnContinuation(&continuation, expr->id()); |
} |