| 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 | 
|---|