Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index d3e67bb1a3a6c95122e8328fc056bdef36de300a..5c50ed04370affd764fd020d459c07574f4f3943 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -1003,17 +1003,6 @@ HReturn* HGraphBuilder::AddReturn(HValue* value) { |
} |
-void HGraphBuilder::AddSoftDeoptimize() { |
- isolate()->counters()->soft_deopts_requested()->Increment(); |
- if (FLAG_always_opt) return; |
- if (current_block()->IsDeoptimizing()) return; |
- Add<HSoftDeoptimize>(); |
- isolate()->counters()->soft_deopts_inserted()->Increment(); |
- current_block()->MarkAsDeoptimizing(); |
- graph()->set_has_soft_deoptimize(true); |
-} |
- |
- |
HBasicBlock* HGraphBuilder::CreateBasicBlock(HEnvironment* env) { |
HBasicBlock* b = graph()->CreateBasicBlock(); |
b->SetInitialEnvironment(env); |
@@ -1663,39 +1652,6 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
} |
-HInstruction* HGraphBuilder::BuildUnaryMathOp( |
- HValue* input, Handle<Type> type, Token::Value operation) { |
- // We only handle the numeric cases here |
- type = handle( |
- Type::Intersect(type, handle(Type::Number(), isolate())), isolate()); |
- |
- switch (operation) { |
- default: |
- UNREACHABLE(); |
- case Token::SUB: { |
- HInstruction* instr = |
- HMul::New(zone(), environment()->LookupContext(), |
- input, graph()->GetConstantMinus1()); |
- Representation rep = Representation::FromType(type); |
- if (type->Is(Type::None())) { |
- AddSoftDeoptimize(); |
- } |
- if (instr->IsBinaryOperation()) { |
- HBinaryOperation* binop = HBinaryOperation::cast(instr); |
- binop->set_observed_input_representation(1, rep); |
- binop->set_observed_input_representation(2, rep); |
- } |
- return instr; |
- } |
- case Token::BIT_NOT: |
- if (type->Is(Type::None())) { |
- AddSoftDeoptimize(); |
- } |
- return new(zone()) HBitNot(input); |
- } |
-} |
- |
- |
void HGraphBuilder::BuildCompareNil( |
HValue* value, |
Handle<Type> type, |
@@ -4275,6 +4231,17 @@ void HOptimizedGraphBuilder::PushAndAdd(HInstruction* instr) { |
} |
+void HOptimizedGraphBuilder::AddSoftDeoptimize() { |
+ isolate()->counters()->soft_deopts_requested()->Increment(); |
+ if (FLAG_always_opt) return; |
+ if (current_block()->IsDeoptimizing()) return; |
+ Add<HSoftDeoptimize>(); |
+ isolate()->counters()->soft_deopts_inserted()->Increment(); |
+ current_block()->MarkAsDeoptimizing(); |
+ graph()->set_has_soft_deoptimize(true); |
+} |
+ |
+ |
template <class Instruction> |
HInstruction* HOptimizedGraphBuilder::PreProcessCall(Instruction* call) { |
int count = call->argument_count(); |
@@ -8559,8 +8526,18 @@ void HOptimizedGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) { |
CHECK_ALIVE(VisitForValue(expr->expression())); |
HValue* value = Pop(); |
+ HValue* context = environment()->LookupContext(); |
+ HInstruction* instr = |
+ HMul::New(zone(), context, value, graph()->GetConstantMinus1()); |
Handle<Type> operand_type = expr->expression()->lower_type(); |
- HInstruction* instr = BuildUnaryMathOp(value, operand_type, Token::SUB); |
+ Representation rep = ToRepresentation(operand_type); |
+ if (operand_type->Is(Type::None())) { |
+ AddSoftDeoptimize(); |
+ } |
+ if (instr->IsBinaryOperation()) { |
+ HBinaryOperation::cast(instr)->set_observed_input_representation(1, rep); |
+ HBinaryOperation::cast(instr)->set_observed_input_representation(2, rep); |
+ } |
return ast_context()->ReturnInstruction(instr, expr->id()); |
} |
@@ -8569,7 +8546,10 @@ void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { |
CHECK_ALIVE(VisitForValue(expr->expression())); |
HValue* value = Pop(); |
Handle<Type> operand_type = expr->expression()->lower_type(); |
- HInstruction* instr = BuildUnaryMathOp(value, operand_type, Token::BIT_NOT); |
+ if (operand_type->Is(Type::None())) { |
+ AddSoftDeoptimize(); |
+ } |
+ HInstruction* instr = new(zone()) HBitNot(value); |
return ast_context()->ReturnInstruction(instr, expr->id()); |
} |
@@ -8623,7 +8603,7 @@ HInstruction* HOptimizedGraphBuilder::BuildIncrement( |
CountOperation* expr) { |
// The input to the count operation is on top of the expression stack. |
TypeInfo info = expr->type(); |
- Representation rep = Representation::FromType(info); |
+ Representation rep = ToRepresentation(info); |
if (rep.IsNone() || rep.IsTagged()) { |
rep = Representation::Smi(); |
} |
@@ -8931,10 +8911,9 @@ HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( |
Handle<Type> right_type = expr->right()->lower_type(); |
Handle<Type> result_type = expr->result_type(); |
Maybe<int> fixed_right_arg = expr->fixed_right_arg(); |
- Representation left_rep = Representation::FromType(left_type); |
- Representation right_rep = Representation::FromType(right_type); |
- Representation result_rep = Representation::FromType(result_type); |
- |
+ 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. |
@@ -9162,6 +9141,26 @@ void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { |
} |
+// TODO(rossberg): this should die eventually. |
+Representation HOptimizedGraphBuilder::ToRepresentation(TypeInfo info) { |
+ if (info.IsUninitialized()) return Representation::None(); |
+ // TODO(verwaest): Return Smi rather than Integer32. |
+ if (info.IsSmi()) return Representation::Integer32(); |
+ if (info.IsInteger32()) return Representation::Integer32(); |
+ if (info.IsDouble()) return Representation::Double(); |
+ if (info.IsNumber()) return Representation::Double(); |
+ return Representation::Tagged(); |
+} |
+ |
+ |
+Representation HOptimizedGraphBuilder::ToRepresentation(Handle<Type> type) { |
+ if (type->Is(Type::None())) return Representation::None(); |
+ if (type->Is(Type::Signed32())) return Representation::Integer32(); |
+ if (type->Is(Type::Number())) return Representation::Double(); |
+ return Representation::Tagged(); |
+} |
+ |
+ |
void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, |
HTypeof* typeof_expr, |
Handle<String> check) { |
@@ -9254,9 +9253,9 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
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 = Representation::FromType(combined_type); |
- Representation left_rep = Representation::FromType(left_type); |
- Representation right_rep = Representation::FromType(right_type); |
+ Representation combined_rep = ToRepresentation(combined_type); |
+ Representation left_rep = ToRepresentation(left_type); |
+ Representation right_rep = ToRepresentation(right_type); |
CHECK_ALIVE(VisitForValue(expr->left())); |
CHECK_ALIVE(VisitForValue(expr->right())); |
@@ -9385,8 +9384,8 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
result->set_position(expr->position()); |
return ast_context()->ReturnInstruction(result, expr->id()); |
} else { |
- // TODO(verwaest): Remove once Representation::FromType properly |
- // returns Smi when the IC measures Smi. |
+ // TODO(verwaest): Remove once ToRepresentation properly returns Smi when |
+ // the IC measures Smi. |
if (left_type->Is(Type::Smi())) left_rep = Representation::Smi(); |
if (right_type->Is(Type::Smi())) right_rep = Representation::Smi(); |
HCompareIDAndBranch* result = |