OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 8101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8112 set_current_block(join_block); | 8112 set_current_block(join_block); |
8113 // We did not materialize any value in the predecessor environments, | 8113 // We did not materialize any value in the predecessor environments, |
8114 // so there is no need to handle it here. | 8114 // so there is no need to handle it here. |
8115 } | 8115 } |
8116 } | 8116 } |
8117 | 8117 |
8118 | 8118 |
8119 void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { | 8119 void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { |
8120 CHECK_ALIVE(VisitForValue(expr->left())); | 8120 CHECK_ALIVE(VisitForValue(expr->left())); |
8121 CHECK_ALIVE(VisitForValue(expr->right())); | 8121 CHECK_ALIVE(VisitForValue(expr->right())); |
8122 if (!FLAG_emit_opt_code_positions) SetSourcePosition(expr->position()); | 8122 SetSourcePosition(expr->position()); |
8123 HValue* right = Pop(); | 8123 HValue* right = Pop(); |
8124 HValue* left = Pop(); | 8124 HValue* left = Pop(); |
8125 HInstruction* instr = BuildBinaryOperation(expr, left, right); | 8125 HInstruction* instr = BuildBinaryOperation(expr, left, right); |
| 8126 if (FLAG_emit_opt_code_positions && instr->IsBinaryOperation()) { |
| 8127 HBinaryOperation::cast(instr)->SetOperandPositions( |
| 8128 zone(), expr->left()->position(), expr->right()->position()); |
| 8129 } |
8126 return ast_context()->ReturnInstruction(instr, expr->id()); | 8130 return ast_context()->ReturnInstruction(instr, expr->id()); |
8127 } | 8131 } |
8128 | 8132 |
8129 | 8133 |
8130 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, | 8134 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, |
8131 Expression* sub_expr, | 8135 Expression* sub_expr, |
8132 Handle<String> check) { | 8136 Handle<String> check) { |
8133 CHECK_ALIVE(VisitForTypeOf(sub_expr)); | 8137 CHECK_ALIVE(VisitForTypeOf(sub_expr)); |
8134 if (!FLAG_emit_opt_code_positions) SetSourcePosition(expr->position()); | 8138 SetSourcePosition(expr->position()); |
8135 HValue* value = Pop(); | 8139 HValue* value = Pop(); |
8136 HTypeofIsAndBranch* instr = new(zone()) HTypeofIsAndBranch(value, check); | 8140 HTypeofIsAndBranch* instr = new(zone()) HTypeofIsAndBranch(value, check); |
8137 return ast_context()->ReturnControl(instr, expr->id()); | 8141 return ast_context()->ReturnControl(instr, expr->id()); |
8138 } | 8142 } |
8139 | 8143 |
8140 | 8144 |
8141 static bool IsLiteralCompareBool(Isolate* isolate, | 8145 static bool IsLiteralCompareBool(Isolate* isolate, |
8142 HValue* left, | 8146 HValue* left, |
8143 Token::Value op, | 8147 Token::Value op, |
8144 HValue* right) { | 8148 HValue* right) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8187 Handle<Type> left_type = expr->left()->bounds().lower; | 8191 Handle<Type> left_type = expr->left()->bounds().lower; |
8188 Handle<Type> right_type = expr->right()->bounds().lower; | 8192 Handle<Type> right_type = expr->right()->bounds().lower; |
8189 Handle<Type> combined_type = expr->combined_type(); | 8193 Handle<Type> combined_type = expr->combined_type(); |
8190 Representation combined_rep = Representation::FromType(combined_type); | 8194 Representation combined_rep = Representation::FromType(combined_type); |
8191 Representation left_rep = Representation::FromType(left_type); | 8195 Representation left_rep = Representation::FromType(left_type); |
8192 Representation right_rep = Representation::FromType(right_type); | 8196 Representation right_rep = Representation::FromType(right_type); |
8193 | 8197 |
8194 CHECK_ALIVE(VisitForValue(expr->left())); | 8198 CHECK_ALIVE(VisitForValue(expr->left())); |
8195 CHECK_ALIVE(VisitForValue(expr->right())); | 8199 CHECK_ALIVE(VisitForValue(expr->right())); |
8196 | 8200 |
| 8201 if (FLAG_emit_opt_code_positions) SetSourcePosition(expr->position()); |
| 8202 |
8197 HValue* context = environment()->context(); | 8203 HValue* context = environment()->context(); |
8198 HValue* right = Pop(); | 8204 HValue* right = Pop(); |
8199 HValue* left = Pop(); | 8205 HValue* left = Pop(); |
8200 Token::Value op = expr->op(); | 8206 Token::Value op = expr->op(); |
8201 | 8207 |
8202 if (IsLiteralCompareBool(isolate(), left, op, right)) { | 8208 if (IsLiteralCompareBool(isolate(), left, op, right)) { |
8203 HCompareObjectEqAndBranch* result = | 8209 HCompareObjectEqAndBranch* result = |
8204 New<HCompareObjectEqAndBranch>(left, right); | 8210 New<HCompareObjectEqAndBranch>(left, right); |
8205 return ast_context()->ReturnControl(result, expr->id()); | 8211 return ast_context()->ReturnControl(result, expr->id()); |
8206 } | 8212 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8266 switch (op) { | 8272 switch (op) { |
8267 case Token::EQ: | 8273 case Token::EQ: |
8268 case Token::EQ_STRICT: { | 8274 case Token::EQ_STRICT: { |
8269 // Can we get away with map check and not instance type check? | 8275 // Can we get away with map check and not instance type check? |
8270 if (combined_type->IsClass()) { | 8276 if (combined_type->IsClass()) { |
8271 Handle<Map> map = combined_type->AsClass(); | 8277 Handle<Map> map = combined_type->AsClass(); |
8272 AddCheckMap(left, map); | 8278 AddCheckMap(left, map); |
8273 AddCheckMap(right, map); | 8279 AddCheckMap(right, map); |
8274 HCompareObjectEqAndBranch* result = | 8280 HCompareObjectEqAndBranch* result = |
8275 New<HCompareObjectEqAndBranch>(left, right); | 8281 New<HCompareObjectEqAndBranch>(left, right); |
| 8282 if (FLAG_emit_opt_code_positions) { |
| 8283 result->set_operand_position(zone(), 0, expr->left()->position()); |
| 8284 result->set_operand_position(zone(), 1, expr->right()->position()); |
| 8285 } |
8276 return ast_context()->ReturnControl(result, expr->id()); | 8286 return ast_context()->ReturnControl(result, expr->id()); |
8277 } else { | 8287 } else { |
8278 BuildCheckHeapObject(left); | 8288 BuildCheckHeapObject(left); |
8279 AddInstruction(HCheckInstanceType::NewIsSpecObject(left, zone())); | 8289 AddInstruction(HCheckInstanceType::NewIsSpecObject(left, zone())); |
8280 BuildCheckHeapObject(right); | 8290 BuildCheckHeapObject(right); |
8281 AddInstruction(HCheckInstanceType::NewIsSpecObject(right, zone())); | 8291 AddInstruction(HCheckInstanceType::NewIsSpecObject(right, zone())); |
8282 HCompareObjectEqAndBranch* result = | 8292 HCompareObjectEqAndBranch* result = |
8283 New<HCompareObjectEqAndBranch>(left, right); | 8293 New<HCompareObjectEqAndBranch>(left, right); |
8284 return ast_context()->ReturnControl(result, expr->id()); | 8294 return ast_context()->ReturnControl(result, expr->id()); |
8285 } | 8295 } |
(...skipping 22 matching lines...) Expand all Loading... |
8308 if (combined_rep.IsTagged() || combined_rep.IsNone()) { | 8318 if (combined_rep.IsTagged() || combined_rep.IsNone()) { |
8309 HCompareGeneric* result = | 8319 HCompareGeneric* result = |
8310 new(zone()) HCompareGeneric(context, left, right, op); | 8320 new(zone()) HCompareGeneric(context, left, right, op); |
8311 result->set_observed_input_representation(1, left_rep); | 8321 result->set_observed_input_representation(1, left_rep); |
8312 result->set_observed_input_representation(2, right_rep); | 8322 result->set_observed_input_representation(2, right_rep); |
8313 return ast_context()->ReturnInstruction(result, expr->id()); | 8323 return ast_context()->ReturnInstruction(result, expr->id()); |
8314 } else { | 8324 } else { |
8315 HCompareNumericAndBranch* result = | 8325 HCompareNumericAndBranch* result = |
8316 New<HCompareNumericAndBranch>(left, right, op); | 8326 New<HCompareNumericAndBranch>(left, right, op); |
8317 result->set_observed_input_representation(left_rep, right_rep); | 8327 result->set_observed_input_representation(left_rep, right_rep); |
| 8328 if (FLAG_emit_opt_code_positions) { |
| 8329 result->SetOperandPositions(zone(), |
| 8330 expr->left()->position(), |
| 8331 expr->right()->position()); |
| 8332 } |
8318 return ast_context()->ReturnControl(result, expr->id()); | 8333 return ast_context()->ReturnControl(result, expr->id()); |
8319 } | 8334 } |
8320 } | 8335 } |
8321 } | 8336 } |
8322 | 8337 |
8323 | 8338 |
8324 void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, | 8339 void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, |
8325 Expression* sub_expr, | 8340 Expression* sub_expr, |
8326 NilValue nil) { | 8341 NilValue nil) { |
8327 ASSERT(!HasStackOverflow()); | 8342 ASSERT(!HasStackOverflow()); |
(...skipping 1317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9645 trace_.Add(" "); | 9660 trace_.Add(" "); |
9646 phi->PrintTo(&trace_); | 9661 phi->PrintTo(&trace_); |
9647 trace_.Add("\n"); | 9662 trace_.Add("\n"); |
9648 } | 9663 } |
9649 } | 9664 } |
9650 | 9665 |
9651 { | 9666 { |
9652 Tag HIR_tag(this, "HIR"); | 9667 Tag HIR_tag(this, "HIR"); |
9653 for (HInstructionIterator it(current); !it.Done(); it.Advance()) { | 9668 for (HInstructionIterator it(current); !it.Done(); it.Advance()) { |
9654 HInstruction* instruction = it.Current(); | 9669 HInstruction* instruction = it.Current(); |
9655 int bci = 0; | 9670 int bci = FLAG_emit_opt_code_positions && instruction->has_position() ? |
| 9671 instruction->position() : 0; |
9656 int uses = instruction->UseCount(); | 9672 int uses = instruction->UseCount(); |
9657 PrintIndent(); | 9673 PrintIndent(); |
9658 trace_.Add("%d %d ", bci, uses); | 9674 trace_.Add("%d %d ", bci, uses); |
9659 instruction->PrintNameTo(&trace_); | 9675 instruction->PrintNameTo(&trace_); |
9660 trace_.Add(" "); | 9676 trace_.Add(" "); |
9661 instruction->PrintTo(&trace_); | 9677 instruction->PrintTo(&trace_); |
9662 trace_.Add(" <|@\n"); | 9678 trace_.Add(" <|@\n"); |
9663 } | 9679 } |
9664 } | 9680 } |
9665 | 9681 |
9666 | 9682 |
9667 if (chunk != NULL) { | 9683 if (chunk != NULL) { |
9668 Tag LIR_tag(this, "LIR"); | 9684 Tag LIR_tag(this, "LIR"); |
9669 int first_index = current->first_instruction_index(); | 9685 int first_index = current->first_instruction_index(); |
9670 int last_index = current->last_instruction_index(); | 9686 int last_index = current->last_instruction_index(); |
9671 if (first_index != -1 && last_index != -1) { | 9687 if (first_index != -1 && last_index != -1) { |
9672 const ZoneList<LInstruction*>* instructions = chunk->instructions(); | 9688 const ZoneList<LInstruction*>* instructions = chunk->instructions(); |
9673 for (int i = first_index; i <= last_index; ++i) { | 9689 for (int i = first_index; i <= last_index; ++i) { |
9674 LInstruction* linstr = instructions->at(i); | 9690 LInstruction* linstr = instructions->at(i); |
9675 if (linstr != NULL) { | 9691 if (linstr != NULL) { |
9676 PrintIndent(); | 9692 PrintIndent(); |
9677 trace_.Add("%d ", | 9693 trace_.Add("%d ", |
9678 LifetimePosition::FromInstructionIndex(i).Value()); | 9694 LifetimePosition::FromInstructionIndex(i).Value()); |
9679 linstr->PrintTo(&trace_); | 9695 linstr->PrintTo(&trace_); |
| 9696 trace_.Add(" [hir:"); |
| 9697 linstr->hydrogen_value()->PrintNameTo(&trace_); |
| 9698 trace_.Add("]"); |
9680 trace_.Add(" <|@\n"); | 9699 trace_.Add(" <|@\n"); |
9681 } | 9700 } |
9682 } | 9701 } |
9683 } | 9702 } |
9684 } | 9703 } |
9685 } | 9704 } |
9686 } | 9705 } |
9687 | 9706 |
9688 | 9707 |
9689 void HTracer::TraceLiveRanges(const char* name, LAllocator* allocator) { | 9708 void HTracer::TraceLiveRanges(const char* name, LAllocator* allocator) { |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9848 if (ShouldProduceTraceOutput()) { | 9867 if (ShouldProduceTraceOutput()) { |
9849 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9868 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
9850 } | 9869 } |
9851 | 9870 |
9852 #ifdef DEBUG | 9871 #ifdef DEBUG |
9853 graph_->Verify(false); // No full verify. | 9872 graph_->Verify(false); // No full verify. |
9854 #endif | 9873 #endif |
9855 } | 9874 } |
9856 | 9875 |
9857 } } // namespace v8::internal | 9876 } } // namespace v8::internal |
OLD | NEW |