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 8609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8620 set_current_block(join_block); | 8620 set_current_block(join_block); |
8621 // We did not materialize any value in the predecessor environments, | 8621 // We did not materialize any value in the predecessor environments, |
8622 // so there is no need to handle it here. | 8622 // so there is no need to handle it here. |
8623 } | 8623 } |
8624 } | 8624 } |
8625 | 8625 |
8626 | 8626 |
8627 void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { | 8627 void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { |
8628 CHECK_ALIVE(VisitForValue(expr->left())); | 8628 CHECK_ALIVE(VisitForValue(expr->left())); |
8629 CHECK_ALIVE(VisitForValue(expr->right())); | 8629 CHECK_ALIVE(VisitForValue(expr->right())); |
8630 SetSourcePosition(expr->position()); | 8630 if (!FLAG_emit_opt_code_positions) SetSourcePosition(expr->position()); |
8631 HValue* right = Pop(); | 8631 HValue* right = Pop(); |
8632 HValue* left = Pop(); | 8632 HValue* left = Pop(); |
8633 HInstruction* instr = BuildBinaryOperation(expr, left, right); | 8633 HInstruction* instr = BuildBinaryOperation(expr, left, right); |
8634 if (FLAG_emit_opt_code_positions && instr->IsBinaryOperation()) { | |
8635 HBinaryOperation::cast(instr)->SetOperandPositions( | |
8636 zone(), expr->left()->position(), expr->right()->position()); | |
8637 } | |
8638 return ast_context()->ReturnInstruction(instr, expr->id()); | 8634 return ast_context()->ReturnInstruction(instr, expr->id()); |
8639 } | 8635 } |
8640 | 8636 |
8641 | 8637 |
8642 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, | 8638 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, |
8643 Expression* sub_expr, | 8639 Expression* sub_expr, |
8644 Handle<String> check) { | 8640 Handle<String> check) { |
8645 CHECK_ALIVE(VisitForTypeOf(sub_expr)); | 8641 CHECK_ALIVE(VisitForTypeOf(sub_expr)); |
8646 SetSourcePosition(expr->position()); | 8642 if (!FLAG_emit_opt_code_positions) SetSourcePosition(expr->position()); |
8647 HValue* value = Pop(); | 8643 HValue* value = Pop(); |
8648 HTypeofIsAndBranch* instr = New<HTypeofIsAndBranch>(value, check); | 8644 HTypeofIsAndBranch* instr = New<HTypeofIsAndBranch>(value, check); |
8649 return ast_context()->ReturnControl(instr, expr->id()); | 8645 return ast_context()->ReturnControl(instr, expr->id()); |
8650 } | 8646 } |
8651 | 8647 |
8652 | 8648 |
8653 static bool IsLiteralCompareBool(Isolate* isolate, | 8649 static bool IsLiteralCompareBool(Isolate* isolate, |
8654 HValue* left, | 8650 HValue* left, |
8655 Token::Value op, | 8651 Token::Value op, |
8656 HValue* right) { | 8652 HValue* right) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8698 Handle<Type> left_type = expr->left()->bounds().lower; | 8694 Handle<Type> left_type = expr->left()->bounds().lower; |
8699 Handle<Type> right_type = expr->right()->bounds().lower; | 8695 Handle<Type> right_type = expr->right()->bounds().lower; |
8700 Handle<Type> combined_type = expr->combined_type(); | 8696 Handle<Type> combined_type = expr->combined_type(); |
8701 Representation combined_rep = Representation::FromType(combined_type); | 8697 Representation combined_rep = Representation::FromType(combined_type); |
8702 Representation left_rep = Representation::FromType(left_type); | 8698 Representation left_rep = Representation::FromType(left_type); |
8703 Representation right_rep = Representation::FromType(right_type); | 8699 Representation right_rep = Representation::FromType(right_type); |
8704 | 8700 |
8705 CHECK_ALIVE(VisitForValue(expr->left())); | 8701 CHECK_ALIVE(VisitForValue(expr->left())); |
8706 CHECK_ALIVE(VisitForValue(expr->right())); | 8702 CHECK_ALIVE(VisitForValue(expr->right())); |
8707 | 8703 |
8708 if (FLAG_emit_opt_code_positions) SetSourcePosition(expr->position()); | |
8709 | |
8710 HValue* right = Pop(); | 8704 HValue* right = Pop(); |
8711 HValue* left = Pop(); | 8705 HValue* left = Pop(); |
8712 Token::Value op = expr->op(); | 8706 Token::Value op = expr->op(); |
8713 | 8707 |
8714 if (IsLiteralCompareBool(isolate(), left, op, right)) { | 8708 if (IsLiteralCompareBool(isolate(), left, op, right)) { |
8715 HCompareObjectEqAndBranch* result = | 8709 HCompareObjectEqAndBranch* result = |
8716 New<HCompareObjectEqAndBranch>(left, right); | 8710 New<HCompareObjectEqAndBranch>(left, right); |
8717 return ast_context()->ReturnControl(result, expr->id()); | 8711 return ast_context()->ReturnControl(result, expr->id()); |
8718 } | 8712 } |
8719 | 8713 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8778 switch (op) { | 8772 switch (op) { |
8779 case Token::EQ: | 8773 case Token::EQ: |
8780 case Token::EQ_STRICT: { | 8774 case Token::EQ_STRICT: { |
8781 // Can we get away with map check and not instance type check? | 8775 // Can we get away with map check and not instance type check? |
8782 if (combined_type->IsClass()) { | 8776 if (combined_type->IsClass()) { |
8783 Handle<Map> map = combined_type->AsClass(); | 8777 Handle<Map> map = combined_type->AsClass(); |
8784 AddCheckMap(left, map); | 8778 AddCheckMap(left, map); |
8785 AddCheckMap(right, map); | 8779 AddCheckMap(right, map); |
8786 HCompareObjectEqAndBranch* result = | 8780 HCompareObjectEqAndBranch* result = |
8787 New<HCompareObjectEqAndBranch>(left, right); | 8781 New<HCompareObjectEqAndBranch>(left, right); |
8788 if (FLAG_emit_opt_code_positions) { | |
8789 result->set_operand_position(zone(), 0, expr->left()->position()); | |
8790 result->set_operand_position(zone(), 1, expr->right()->position()); | |
8791 } | |
8792 return ast_context()->ReturnControl(result, expr->id()); | 8782 return ast_context()->ReturnControl(result, expr->id()); |
8793 } else { | 8783 } else { |
8794 BuildCheckHeapObject(left); | 8784 BuildCheckHeapObject(left); |
8795 Add<HCheckInstanceType>(left, HCheckInstanceType::IS_SPEC_OBJECT); | 8785 Add<HCheckInstanceType>(left, HCheckInstanceType::IS_SPEC_OBJECT); |
8796 BuildCheckHeapObject(right); | 8786 BuildCheckHeapObject(right); |
8797 Add<HCheckInstanceType>(right, HCheckInstanceType::IS_SPEC_OBJECT); | 8787 Add<HCheckInstanceType>(right, HCheckInstanceType::IS_SPEC_OBJECT); |
8798 HCompareObjectEqAndBranch* result = | 8788 HCompareObjectEqAndBranch* result = |
8799 New<HCompareObjectEqAndBranch>(left, right); | 8789 New<HCompareObjectEqAndBranch>(left, right); |
8800 return ast_context()->ReturnControl(result, expr->id()); | 8790 return ast_context()->ReturnControl(result, expr->id()); |
8801 } | 8791 } |
(...skipping 21 matching lines...) Expand all Loading... |
8823 } else { | 8813 } else { |
8824 if (combined_rep.IsTagged() || combined_rep.IsNone()) { | 8814 if (combined_rep.IsTagged() || combined_rep.IsNone()) { |
8825 HCompareGeneric* result = New<HCompareGeneric>(left, right, op); | 8815 HCompareGeneric* result = New<HCompareGeneric>(left, right, op); |
8826 result->set_observed_input_representation(1, left_rep); | 8816 result->set_observed_input_representation(1, left_rep); |
8827 result->set_observed_input_representation(2, right_rep); | 8817 result->set_observed_input_representation(2, right_rep); |
8828 return ast_context()->ReturnInstruction(result, expr->id()); | 8818 return ast_context()->ReturnInstruction(result, expr->id()); |
8829 } else { | 8819 } else { |
8830 HCompareNumericAndBranch* result = | 8820 HCompareNumericAndBranch* result = |
8831 New<HCompareNumericAndBranch>(left, right, op); | 8821 New<HCompareNumericAndBranch>(left, right, op); |
8832 result->set_observed_input_representation(left_rep, right_rep); | 8822 result->set_observed_input_representation(left_rep, right_rep); |
8833 if (FLAG_emit_opt_code_positions) { | |
8834 result->SetOperandPositions(zone(), | |
8835 expr->left()->position(), | |
8836 expr->right()->position()); | |
8837 } | |
8838 return ast_context()->ReturnControl(result, expr->id()); | 8823 return ast_context()->ReturnControl(result, expr->id()); |
8839 } | 8824 } |
8840 } | 8825 } |
8841 } | 8826 } |
8842 | 8827 |
8843 | 8828 |
8844 void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, | 8829 void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, |
8845 Expression* sub_expr, | 8830 Expression* sub_expr, |
8846 NilValue nil) { | 8831 NilValue nil) { |
8847 ASSERT(!HasStackOverflow()); | 8832 ASSERT(!HasStackOverflow()); |
(...skipping 1296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10144 trace_.Add(" "); | 10129 trace_.Add(" "); |
10145 phi->PrintTo(&trace_); | 10130 phi->PrintTo(&trace_); |
10146 trace_.Add("\n"); | 10131 trace_.Add("\n"); |
10147 } | 10132 } |
10148 } | 10133 } |
10149 | 10134 |
10150 { | 10135 { |
10151 Tag HIR_tag(this, "HIR"); | 10136 Tag HIR_tag(this, "HIR"); |
10152 for (HInstructionIterator it(current); !it.Done(); it.Advance()) { | 10137 for (HInstructionIterator it(current); !it.Done(); it.Advance()) { |
10153 HInstruction* instruction = it.Current(); | 10138 HInstruction* instruction = it.Current(); |
10154 int bci = FLAG_emit_opt_code_positions && instruction->has_position() ? | 10139 int bci = 0; |
10155 instruction->position() : 0; | |
10156 int uses = instruction->UseCount(); | 10140 int uses = instruction->UseCount(); |
10157 PrintIndent(); | 10141 PrintIndent(); |
10158 trace_.Add("%d %d ", bci, uses); | 10142 trace_.Add("%d %d ", bci, uses); |
10159 instruction->PrintNameTo(&trace_); | 10143 instruction->PrintNameTo(&trace_); |
10160 trace_.Add(" "); | 10144 trace_.Add(" "); |
10161 instruction->PrintTo(&trace_); | 10145 instruction->PrintTo(&trace_); |
10162 trace_.Add(" <|@\n"); | 10146 trace_.Add(" <|@\n"); |
10163 } | 10147 } |
10164 } | 10148 } |
10165 | 10149 |
10166 | 10150 |
10167 if (chunk != NULL) { | 10151 if (chunk != NULL) { |
10168 Tag LIR_tag(this, "LIR"); | 10152 Tag LIR_tag(this, "LIR"); |
10169 int first_index = current->first_instruction_index(); | 10153 int first_index = current->first_instruction_index(); |
10170 int last_index = current->last_instruction_index(); | 10154 int last_index = current->last_instruction_index(); |
10171 if (first_index != -1 && last_index != -1) { | 10155 if (first_index != -1 && last_index != -1) { |
10172 const ZoneList<LInstruction*>* instructions = chunk->instructions(); | 10156 const ZoneList<LInstruction*>* instructions = chunk->instructions(); |
10173 for (int i = first_index; i <= last_index; ++i) { | 10157 for (int i = first_index; i <= last_index; ++i) { |
10174 LInstruction* linstr = instructions->at(i); | 10158 LInstruction* linstr = instructions->at(i); |
10175 if (linstr != NULL) { | 10159 if (linstr != NULL) { |
10176 PrintIndent(); | 10160 PrintIndent(); |
10177 trace_.Add("%d ", | 10161 trace_.Add("%d ", |
10178 LifetimePosition::FromInstructionIndex(i).Value()); | 10162 LifetimePosition::FromInstructionIndex(i).Value()); |
10179 linstr->PrintTo(&trace_); | 10163 linstr->PrintTo(&trace_); |
10180 trace_.Add(" [hir:"); | |
10181 linstr->hydrogen_value()->PrintNameTo(&trace_); | |
10182 trace_.Add("]"); | |
10183 trace_.Add(" <|@\n"); | 10164 trace_.Add(" <|@\n"); |
10184 } | 10165 } |
10185 } | 10166 } |
10186 } | 10167 } |
10187 } | 10168 } |
10188 } | 10169 } |
10189 } | 10170 } |
10190 | 10171 |
10191 | 10172 |
10192 void HTracer::TraceLiveRanges(const char* name, LAllocator* allocator) { | 10173 void HTracer::TraceLiveRanges(const char* name, LAllocator* allocator) { |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10351 if (ShouldProduceTraceOutput()) { | 10332 if (ShouldProduceTraceOutput()) { |
10352 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 10333 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
10353 } | 10334 } |
10354 | 10335 |
10355 #ifdef DEBUG | 10336 #ifdef DEBUG |
10356 graph_->Verify(false); // No full verify. | 10337 graph_->Verify(false); // No full verify. |
10357 #endif | 10338 #endif |
10358 } | 10339 } |
10359 | 10340 |
10360 } } // namespace v8::internal | 10341 } } // namespace v8::internal |
OLD | NEW |