Chromium Code Reviews| 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 6048 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6059 CHECK_ALIVE(VisitForValue(prop->key())); | 6059 CHECK_ALIVE(VisitForValue(prop->key())); |
| 6060 key = Top(); | 6060 key = Top(); |
| 6061 } | 6061 } |
| 6062 | 6062 |
| 6063 CHECK_ALIVE(PushLoad(prop, object, key)); | 6063 CHECK_ALIVE(PushLoad(prop, object, key)); |
| 6064 | 6064 |
| 6065 CHECK_ALIVE(VisitForValue(expr->value())); | 6065 CHECK_ALIVE(VisitForValue(expr->value())); |
| 6066 HValue* right = Pop(); | 6066 HValue* right = Pop(); |
| 6067 HValue* left = Pop(); | 6067 HValue* left = Pop(); |
| 6068 | 6068 |
| 6069 Push(BuildBinaryOperation(operation, left, right)); | 6069 Push(BuildBinaryOperation(operation, left, right, PUSH_BEFORE_SIMULATE)); |
| 6070 | |
| 6070 BuildStore(expr, prop, expr->id(), | 6071 BuildStore(expr, prop, expr->id(), |
| 6071 expr->AssignmentId(), expr->IsUninitialized()); | 6072 expr->AssignmentId(), expr->IsUninitialized()); |
| 6072 } else { | 6073 } else { |
| 6073 return Bailout(kInvalidLhsInCompoundAssignment); | 6074 return Bailout(kInvalidLhsInCompoundAssignment); |
| 6074 } | 6075 } |
| 6075 } | 6076 } |
| 6076 | 6077 |
| 6077 | 6078 |
| 6078 void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) { | 6079 void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) { |
| 6079 ASSERT(!HasStackOverflow()); | 6080 ASSERT(!HasStackOverflow()); |
| (...skipping 2958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9038 return value; | 9039 return value; |
| 9039 } | 9040 } |
| 9040 | 9041 |
| 9041 return value; | 9042 return value; |
| 9042 } | 9043 } |
| 9043 | 9044 |
| 9044 | 9045 |
| 9045 HValue* HOptimizedGraphBuilder::BuildBinaryOperation( | 9046 HValue* HOptimizedGraphBuilder::BuildBinaryOperation( |
| 9046 BinaryOperation* expr, | 9047 BinaryOperation* expr, |
| 9047 HValue* left, | 9048 HValue* left, |
| 9048 HValue* right) { | 9049 HValue* right, |
| 9050 PushBeforeSimulateBehavior pushSimResult) { | |
| 9049 Type* left_type = expr->left()->bounds().lower; | 9051 Type* left_type = expr->left()->bounds().lower; |
| 9050 Type* right_type = expr->right()->bounds().lower; | 9052 Type* right_type = expr->right()->bounds().lower; |
| 9051 Type* result_type = expr->bounds().lower; | 9053 Type* result_type = expr->bounds().lower; |
| 9052 Maybe<int> fixed_right_arg = expr->fixed_right_arg(); | 9054 Maybe<int> fixed_right_arg = expr->fixed_right_arg(); |
| 9053 Handle<AllocationSite> allocation_site = expr->allocation_site(); | 9055 Handle<AllocationSite> allocation_site = expr->allocation_site(); |
| 9054 | 9056 |
| 9055 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ? | 9057 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ? |
| 9056 isolate()->heap()->GetPretenureMode() : NOT_TENURED; | 9058 isolate()->heap()->GetPretenureMode() : NOT_TENURED; |
| 9057 | 9059 |
| 9058 HAllocationMode allocation_mode = | 9060 HAllocationMode allocation_mode = |
| 9059 FLAG_allocation_site_pretenuring | 9061 FLAG_allocation_site_pretenuring |
| 9060 ? (allocation_site.is_null() | 9062 ? (allocation_site.is_null() |
| 9061 ? HAllocationMode(NOT_TENURED) | 9063 ? HAllocationMode(NOT_TENURED) |
| 9062 : HAllocationMode(allocation_site)) | 9064 : HAllocationMode(allocation_site)) |
| 9063 : HAllocationMode(pretenure_flag); | 9065 : HAllocationMode(pretenure_flag); |
| 9064 | 9066 |
| 9065 HValue* result = HGraphBuilder::BuildBinaryOperation( | 9067 HValue* result = HGraphBuilder::BuildBinaryOperation( |
| 9066 expr->op(), left, right, left_type, right_type, result_type, | 9068 expr->op(), left, right, left_type, right_type, result_type, |
| 9067 fixed_right_arg, allocation_mode); | 9069 fixed_right_arg, allocation_mode); |
| 9068 // Add a simulate after instructions with observable side effects, and | 9070 // Add a simulate after instructions with observable side effects, and |
| 9069 // after phis, which are the result of BuildBinaryOperation when we | 9071 // after phis, which are the result of BuildBinaryOperation when we |
| 9070 // inlined some complex subgraph. | 9072 // inlined some complex subgraph. |
| 9071 if (result->HasObservableSideEffects() || result->IsPhi()) { | 9073 if (result->HasObservableSideEffects() || result->IsPhi()) { |
| 9072 Push(result); | 9074 if (pushSimResult == NO_PUSH_BEFORE_SIMULATE) { |
| 9073 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); | 9075 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
| 9074 Drop(1); | 9076 } else { |
| 9077 ASSERT(pushSimResult == PUSH_BEFORE_SIMULATE); | |
| 9078 Push(result); | |
| 9079 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); | |
| 9080 Drop(1); | |
| 9081 } | |
| 9075 } | 9082 } |
| 9076 return result; | 9083 return result; |
| 9077 } | 9084 } |
| 9078 | 9085 |
| 9079 | 9086 |
| 9080 HValue* HGraphBuilder::BuildBinaryOperation( | 9087 HValue* HGraphBuilder::BuildBinaryOperation( |
| 9081 Token::Value op, | 9088 Token::Value op, |
| 9082 HValue* left, | 9089 HValue* left, |
| 9083 HValue* right, | 9090 HValue* right, |
| 9084 Type* left_type, | 9091 Type* left_type, |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9444 } | 9451 } |
| 9445 } | 9452 } |
| 9446 | 9453 |
| 9447 | 9454 |
| 9448 void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { | 9455 void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { |
| 9449 CHECK_ALIVE(VisitForValue(expr->left())); | 9456 CHECK_ALIVE(VisitForValue(expr->left())); |
| 9450 CHECK_ALIVE(VisitForValue(expr->right())); | 9457 CHECK_ALIVE(VisitForValue(expr->right())); |
| 9451 SetSourcePosition(expr->position()); | 9458 SetSourcePosition(expr->position()); |
| 9452 HValue* right = Pop(); | 9459 HValue* right = Pop(); |
| 9453 HValue* left = Pop(); | 9460 HValue* left = Pop(); |
| 9454 HValue* result = BuildBinaryOperation(expr, left, right); | 9461 HValue* result = |
| 9462 BuildBinaryOperation(expr, left, right, | |
| 9463 ast_context()->IsEffect() | |
|
Jakob Kummerow
2014/02/06 08:33:41
nit: preferred formatting:
ast_context(
| |
| 9464 ? NO_PUSH_BEFORE_SIMULATE | |
| 9465 : PUSH_BEFORE_SIMULATE); | |
| 9455 if (FLAG_emit_opt_code_positions && result->IsBinaryOperation()) { | 9466 if (FLAG_emit_opt_code_positions && result->IsBinaryOperation()) { |
| 9456 HBinaryOperation::cast(result)->SetOperandPositions( | 9467 HBinaryOperation::cast(result)->SetOperandPositions( |
| 9457 zone(), expr->left()->position(), expr->right()->position()); | 9468 zone(), expr->left()->position(), expr->right()->position()); |
| 9458 } | 9469 } |
| 9459 return ast_context()->ReturnValue(result); | 9470 return ast_context()->ReturnValue(result); |
| 9460 } | 9471 } |
| 9461 | 9472 |
| 9462 | 9473 |
| 9463 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, | 9474 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, |
| 9464 Expression* sub_expr, | 9475 Expression* sub_expr, |
| (...skipping 1757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11222 if (ShouldProduceTraceOutput()) { | 11233 if (ShouldProduceTraceOutput()) { |
| 11223 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11234 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 11224 } | 11235 } |
| 11225 | 11236 |
| 11226 #ifdef DEBUG | 11237 #ifdef DEBUG |
| 11227 graph_->Verify(false); // No full verify. | 11238 graph_->Verify(false); // No full verify. |
| 11228 #endif | 11239 #endif |
| 11229 } | 11240 } |
| 11230 | 11241 |
| 11231 } } // namespace v8::internal | 11242 } } // namespace v8::internal |
| OLD | NEW |