Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1769)

Side by Side Diff: src/hydrogen.cc

Issue 59703011: Reapply r11765 (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/hydrogen-instructions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 8878 matching lines...) Expand 10 before | Expand all | Expand 10 after
8889 set_current_block(join_block); 8889 set_current_block(join_block);
8890 // We did not materialize any value in the predecessor environments, 8890 // We did not materialize any value in the predecessor environments,
8891 // so there is no need to handle it here. 8891 // so there is no need to handle it here.
8892 } 8892 }
8893 } 8893 }
8894 8894
8895 8895
8896 void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { 8896 void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) {
8897 CHECK_ALIVE(VisitForValue(expr->left())); 8897 CHECK_ALIVE(VisitForValue(expr->left()));
8898 CHECK_ALIVE(VisitForValue(expr->right())); 8898 CHECK_ALIVE(VisitForValue(expr->right()));
8899 if (!FLAG_emit_opt_code_positions) SetSourcePosition(expr->position()); 8899 SetSourcePosition(expr->position());
8900 HValue* right = Pop(); 8900 HValue* right = Pop();
8901 HValue* left = Pop(); 8901 HValue* left = Pop();
8902 HInstruction* instr = BuildBinaryOperation(expr, left, right); 8902 HInstruction* instr = BuildBinaryOperation(expr, left, right);
8903 if (FLAG_emit_opt_code_positions && instr->IsBinaryOperation()) {
8904 HBinaryOperation::cast(instr)->SetOperandPositions(
8905 zone(), expr->left()->position(), expr->right()->position());
8906 }
8903 return ast_context()->ReturnInstruction(instr, expr->id()); 8907 return ast_context()->ReturnInstruction(instr, expr->id());
8904 } 8908 }
8905 8909
8906 8910
8907 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, 8911 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr,
8908 Expression* sub_expr, 8912 Expression* sub_expr,
8909 Handle<String> check) { 8913 Handle<String> check) {
8910 CHECK_ALIVE(VisitForTypeOf(sub_expr)); 8914 CHECK_ALIVE(VisitForTypeOf(sub_expr));
8911 if (!FLAG_emit_opt_code_positions) SetSourcePosition(expr->position()); 8915 SetSourcePosition(expr->position());
8912 HValue* value = Pop(); 8916 HValue* value = Pop();
8913 HTypeofIsAndBranch* instr = New<HTypeofIsAndBranch>(value, check); 8917 HTypeofIsAndBranch* instr = New<HTypeofIsAndBranch>(value, check);
8914 return ast_context()->ReturnControl(instr, expr->id()); 8918 return ast_context()->ReturnControl(instr, expr->id());
8915 } 8919 }
8916 8920
8917 8921
8918 static bool IsLiteralCompareBool(Isolate* isolate, 8922 static bool IsLiteralCompareBool(Isolate* isolate,
8919 HValue* left, 8923 HValue* left,
8920 Token::Value op, 8924 Token::Value op,
8921 HValue* right) { 8925 HValue* right) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
8963 Handle<Type> left_type = expr->left()->bounds().lower; 8967 Handle<Type> left_type = expr->left()->bounds().lower;
8964 Handle<Type> right_type = expr->right()->bounds().lower; 8968 Handle<Type> right_type = expr->right()->bounds().lower;
8965 Handle<Type> combined_type = expr->combined_type(); 8969 Handle<Type> combined_type = expr->combined_type();
8966 Representation combined_rep = Representation::FromType(combined_type); 8970 Representation combined_rep = Representation::FromType(combined_type);
8967 Representation left_rep = Representation::FromType(left_type); 8971 Representation left_rep = Representation::FromType(left_type);
8968 Representation right_rep = Representation::FromType(right_type); 8972 Representation right_rep = Representation::FromType(right_type);
8969 8973
8970 CHECK_ALIVE(VisitForValue(expr->left())); 8974 CHECK_ALIVE(VisitForValue(expr->left()));
8971 CHECK_ALIVE(VisitForValue(expr->right())); 8975 CHECK_ALIVE(VisitForValue(expr->right()));
8972 8976
8977 if (FLAG_emit_opt_code_positions) SetSourcePosition(expr->position());
8978
8973 HValue* right = Pop(); 8979 HValue* right = Pop();
8974 HValue* left = Pop(); 8980 HValue* left = Pop();
8975 Token::Value op = expr->op(); 8981 Token::Value op = expr->op();
8976 8982
8977 if (IsLiteralCompareBool(isolate(), left, op, right)) { 8983 if (IsLiteralCompareBool(isolate(), left, op, right)) {
8978 HCompareObjectEqAndBranch* result = 8984 HCompareObjectEqAndBranch* result =
8979 New<HCompareObjectEqAndBranch>(left, right); 8985 New<HCompareObjectEqAndBranch>(left, right);
8980 return ast_context()->ReturnControl(result, expr->id()); 8986 return ast_context()->ReturnControl(result, expr->id());
8981 } 8987 }
8982 8988
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
9041 switch (op) { 9047 switch (op) {
9042 case Token::EQ: 9048 case Token::EQ:
9043 case Token::EQ_STRICT: { 9049 case Token::EQ_STRICT: {
9044 // Can we get away with map check and not instance type check? 9050 // Can we get away with map check and not instance type check?
9045 if (combined_type->IsClass()) { 9051 if (combined_type->IsClass()) {
9046 Handle<Map> map = combined_type->AsClass(); 9052 Handle<Map> map = combined_type->AsClass();
9047 AddCheckMap(left, map); 9053 AddCheckMap(left, map);
9048 AddCheckMap(right, map); 9054 AddCheckMap(right, map);
9049 HCompareObjectEqAndBranch* result = 9055 HCompareObjectEqAndBranch* result =
9050 New<HCompareObjectEqAndBranch>(left, right); 9056 New<HCompareObjectEqAndBranch>(left, right);
9057 if (FLAG_emit_opt_code_positions) {
9058 result->set_operand_position(zone(), 0, expr->left()->position());
9059 result->set_operand_position(zone(), 1, expr->right()->position());
9060 }
9051 return ast_context()->ReturnControl(result, expr->id()); 9061 return ast_context()->ReturnControl(result, expr->id());
9052 } else { 9062 } else {
9053 BuildCheckHeapObject(left); 9063 BuildCheckHeapObject(left);
9054 Add<HCheckInstanceType>(left, HCheckInstanceType::IS_SPEC_OBJECT); 9064 Add<HCheckInstanceType>(left, HCheckInstanceType::IS_SPEC_OBJECT);
9055 BuildCheckHeapObject(right); 9065 BuildCheckHeapObject(right);
9056 Add<HCheckInstanceType>(right, HCheckInstanceType::IS_SPEC_OBJECT); 9066 Add<HCheckInstanceType>(right, HCheckInstanceType::IS_SPEC_OBJECT);
9057 HCompareObjectEqAndBranch* result = 9067 HCompareObjectEqAndBranch* result =
9058 New<HCompareObjectEqAndBranch>(left, right); 9068 New<HCompareObjectEqAndBranch>(left, right);
9059 return ast_context()->ReturnControl(result, expr->id()); 9069 return ast_context()->ReturnControl(result, expr->id());
9060 } 9070 }
(...skipping 21 matching lines...) Expand all
9082 } else { 9092 } else {
9083 if (combined_rep.IsTagged() || combined_rep.IsNone()) { 9093 if (combined_rep.IsTagged() || combined_rep.IsNone()) {
9084 HCompareGeneric* result = New<HCompareGeneric>(left, right, op); 9094 HCompareGeneric* result = New<HCompareGeneric>(left, right, op);
9085 result->set_observed_input_representation(1, left_rep); 9095 result->set_observed_input_representation(1, left_rep);
9086 result->set_observed_input_representation(2, right_rep); 9096 result->set_observed_input_representation(2, right_rep);
9087 return ast_context()->ReturnInstruction(result, expr->id()); 9097 return ast_context()->ReturnInstruction(result, expr->id());
9088 } else { 9098 } else {
9089 HCompareNumericAndBranch* result = 9099 HCompareNumericAndBranch* result =
9090 New<HCompareNumericAndBranch>(left, right, op); 9100 New<HCompareNumericAndBranch>(left, right, op);
9091 result->set_observed_input_representation(left_rep, right_rep); 9101 result->set_observed_input_representation(left_rep, right_rep);
9102 if (FLAG_emit_opt_code_positions) {
9103 result->SetOperandPositions(zone(),
9104 expr->left()->position(),
9105 expr->right()->position());
9106 }
9092 return ast_context()->ReturnControl(result, expr->id()); 9107 return ast_context()->ReturnControl(result, expr->id());
9093 } 9108 }
9094 } 9109 }
9095 } 9110 }
9096 9111
9097 9112
9098 void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, 9113 void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr,
9099 Expression* sub_expr, 9114 Expression* sub_expr,
9100 NilValue nil) { 9115 NilValue nil) {
9101 ASSERT(!HasStackOverflow()); 9116 ASSERT(!HasStackOverflow());
(...skipping 1296 matching lines...) Expand 10 before | Expand all | Expand 10 after
10398 trace_.Add(" "); 10413 trace_.Add(" ");
10399 phi->PrintTo(&trace_); 10414 phi->PrintTo(&trace_);
10400 trace_.Add("\n"); 10415 trace_.Add("\n");
10401 } 10416 }
10402 } 10417 }
10403 10418
10404 { 10419 {
10405 Tag HIR_tag(this, "HIR"); 10420 Tag HIR_tag(this, "HIR");
10406 for (HInstructionIterator it(current); !it.Done(); it.Advance()) { 10421 for (HInstructionIterator it(current); !it.Done(); it.Advance()) {
10407 HInstruction* instruction = it.Current(); 10422 HInstruction* instruction = it.Current();
10408 int bci = 0; 10423 int bci = FLAG_emit_opt_code_positions && instruction->has_position() ?
10424 instruction->position() : 0;
10409 int uses = instruction->UseCount(); 10425 int uses = instruction->UseCount();
10410 PrintIndent(); 10426 PrintIndent();
10411 trace_.Add("%d %d ", bci, uses); 10427 trace_.Add("%d %d ", bci, uses);
10412 instruction->PrintNameTo(&trace_); 10428 instruction->PrintNameTo(&trace_);
10413 trace_.Add(" "); 10429 trace_.Add(" ");
10414 instruction->PrintTo(&trace_); 10430 instruction->PrintTo(&trace_);
10415 trace_.Add(" <|@\n"); 10431 trace_.Add(" <|@\n");
10416 } 10432 }
10417 } 10433 }
10418 10434
10419 10435
10420 if (chunk != NULL) { 10436 if (chunk != NULL) {
10421 Tag LIR_tag(this, "LIR"); 10437 Tag LIR_tag(this, "LIR");
10422 int first_index = current->first_instruction_index(); 10438 int first_index = current->first_instruction_index();
10423 int last_index = current->last_instruction_index(); 10439 int last_index = current->last_instruction_index();
10424 if (first_index != -1 && last_index != -1) { 10440 if (first_index != -1 && last_index != -1) {
10425 const ZoneList<LInstruction*>* instructions = chunk->instructions(); 10441 const ZoneList<LInstruction*>* instructions = chunk->instructions();
10426 for (int i = first_index; i <= last_index; ++i) { 10442 for (int i = first_index; i <= last_index; ++i) {
10427 LInstruction* linstr = instructions->at(i); 10443 LInstruction* linstr = instructions->at(i);
10428 if (linstr != NULL) { 10444 if (linstr != NULL) {
10429 PrintIndent(); 10445 PrintIndent();
10430 trace_.Add("%d ", 10446 trace_.Add("%d ",
10431 LifetimePosition::FromInstructionIndex(i).Value()); 10447 LifetimePosition::FromInstructionIndex(i).Value());
10432 linstr->PrintTo(&trace_); 10448 linstr->PrintTo(&trace_);
10449 trace_.Add(" [hir:");
10450 linstr->hydrogen_value()->PrintNameTo(&trace_);
10451 trace_.Add("]");
10433 trace_.Add(" <|@\n"); 10452 trace_.Add(" <|@\n");
10434 } 10453 }
10435 } 10454 }
10436 } 10455 }
10437 } 10456 }
10438 } 10457 }
10439 } 10458 }
10440 10459
10441 10460
10442 void HTracer::TraceLiveRanges(const char* name, LAllocator* allocator) { 10461 void HTracer::TraceLiveRanges(const char* name, LAllocator* allocator) {
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
10601 if (ShouldProduceTraceOutput()) { 10620 if (ShouldProduceTraceOutput()) {
10602 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 10621 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
10603 } 10622 }
10604 10623
10605 #ifdef DEBUG 10624 #ifdef DEBUG
10606 graph_->Verify(false); // No full verify. 10625 graph_->Verify(false); // No full verify.
10607 #endif 10626 #endif
10608 } 10627 }
10609 10628
10610 } } // namespace v8::internal 10629 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698