OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <sstream> | 8 #include <sstream> |
9 | 9 |
10 #include "src/allocation-site-scopes.h" | 10 #include "src/allocation-site-scopes.h" |
(...skipping 10368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10379 | 10379 |
10380 static Representation RepresentationFor(AstType* type) { | 10380 static Representation RepresentationFor(AstType* type) { |
10381 DisallowHeapAllocation no_allocation; | 10381 DisallowHeapAllocation no_allocation; |
10382 if (type->Is(AstType::None())) return Representation::None(); | 10382 if (type->Is(AstType::None())) return Representation::None(); |
10383 if (type->Is(AstType::SignedSmall())) return Representation::Smi(); | 10383 if (type->Is(AstType::SignedSmall())) return Representation::Smi(); |
10384 if (type->Is(AstType::Signed32())) return Representation::Integer32(); | 10384 if (type->Is(AstType::Signed32())) return Representation::Integer32(); |
10385 if (type->Is(AstType::Number())) return Representation::Double(); | 10385 if (type->Is(AstType::Number())) return Representation::Double(); |
10386 return Representation::Tagged(); | 10386 return Representation::Tagged(); |
10387 } | 10387 } |
10388 | 10388 |
10389 | 10389 HInstruction* HOptimizedGraphBuilder::BuildIncrement(CountOperation* expr) { |
10390 HInstruction* HOptimizedGraphBuilder::BuildIncrement( | |
10391 bool returns_original_input, | |
10392 CountOperation* expr) { | |
10393 // The input to the count operation is on top of the expression stack. | 10390 // The input to the count operation is on top of the expression stack. |
10394 Representation rep = RepresentationFor(expr->type()); | 10391 Representation rep = RepresentationFor(expr->type()); |
10395 if (rep.IsNone() || rep.IsTagged()) { | 10392 if (rep.IsNone() || rep.IsTagged()) { |
10396 rep = Representation::Smi(); | 10393 rep = Representation::Smi(); |
10397 } | 10394 } |
10398 | 10395 |
10399 if (returns_original_input) { | 10396 // We need an explicit HValue representing ToNumber(input). The |
10400 // We need an explicit HValue representing ToNumber(input). The | 10397 // actual HChange instruction we need is (sometimes) added in a later |
10401 // actual HChange instruction we need is (sometimes) added in a later | 10398 // phase, so it is not available now to be used as an input to HAdd and |
10402 // phase, so it is not available now to be used as an input to HAdd and | 10399 // as the return value. |
10403 // as the return value. | 10400 HInstruction* number_input = AddUncasted<HForceRepresentation>(Pop(), rep); |
10404 HInstruction* number_input = AddUncasted<HForceRepresentation>(Pop(), rep); | 10401 if (!rep.IsDouble()) { |
10405 if (!rep.IsDouble()) { | 10402 number_input->SetFlag(HInstruction::kFlexibleRepresentation); |
10406 number_input->SetFlag(HInstruction::kFlexibleRepresentation); | 10403 number_input->SetFlag(HInstruction::kCannotBeTagged); |
10407 number_input->SetFlag(HInstruction::kCannotBeTagged); | |
10408 } | |
10409 Push(number_input); | |
10410 } | 10404 } |
| 10405 Push(number_input); |
10411 | 10406 |
10412 // The addition has no side effects, so we do not need | 10407 // The addition has no side effects, so we do not need |
10413 // to simulate the expression stack after this instruction. | 10408 // to simulate the expression stack after this instruction. |
10414 // Any later failures deopt to the load of the input or earlier. | 10409 // Any later failures deopt to the load of the input or earlier. |
10415 HConstant* delta = (expr->op() == Token::INC) | 10410 HConstant* delta = (expr->op() == Token::INC) |
10416 ? graph()->GetConstant1() | 10411 ? graph()->GetConstant1() |
10417 : graph()->GetConstantMinus1(); | 10412 : graph()->GetConstantMinus1(); |
10418 HInstruction* instr = AddUncasted<HAdd>(Top(), delta); | 10413 HInstruction* instr = AddUncasted<HAdd>(Top(), delta); |
10419 if (instr->IsAdd()) { | 10414 if (instr->IsAdd()) { |
10420 HAdd* add = HAdd::cast(instr); | 10415 HAdd* add = HAdd::cast(instr); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10459 | 10454 |
10460 if (proxy != NULL) { | 10455 if (proxy != NULL) { |
10461 Variable* var = proxy->var(); | 10456 Variable* var = proxy->var(); |
10462 if (var->mode() == CONST) { | 10457 if (var->mode() == CONST) { |
10463 return Bailout(kNonInitializerAssignmentToConst); | 10458 return Bailout(kNonInitializerAssignmentToConst); |
10464 } | 10459 } |
10465 // Argument of the count operation is a variable, not a property. | 10460 // Argument of the count operation is a variable, not a property. |
10466 DCHECK(prop == NULL); | 10461 DCHECK(prop == NULL); |
10467 CHECK_ALIVE(VisitForValue(target)); | 10462 CHECK_ALIVE(VisitForValue(target)); |
10468 | 10463 |
10469 after = BuildIncrement(returns_original_input, expr); | 10464 after = BuildIncrement(expr); |
10470 input = returns_original_input ? Top() : Pop(); | 10465 input = returns_original_input ? Top() : Pop(); |
10471 Push(after); | 10466 Push(after); |
10472 | 10467 |
10473 switch (var->location()) { | 10468 switch (var->location()) { |
10474 case VariableLocation::UNALLOCATED: | 10469 case VariableLocation::UNALLOCATED: |
10475 HandleGlobalVariableAssignment(var, after, expr->CountSlot(), | 10470 HandleGlobalVariableAssignment(var, after, expr->CountSlot(), |
10476 expr->AssignmentId()); | 10471 expr->AssignmentId()); |
10477 break; | 10472 break; |
10478 | 10473 |
10479 case VariableLocation::PARAMETER: | 10474 case VariableLocation::PARAMETER: |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10512 HValue* object = Top(); | 10507 HValue* object = Top(); |
10513 | 10508 |
10514 HValue* key = NULL; | 10509 HValue* key = NULL; |
10515 if (!prop->key()->IsPropertyName() || prop->IsStringAccess()) { | 10510 if (!prop->key()->IsPropertyName() || prop->IsStringAccess()) { |
10516 CHECK_ALIVE(VisitForValue(prop->key())); | 10511 CHECK_ALIVE(VisitForValue(prop->key())); |
10517 key = Top(); | 10512 key = Top(); |
10518 } | 10513 } |
10519 | 10514 |
10520 CHECK_ALIVE(PushLoad(prop, object, key)); | 10515 CHECK_ALIVE(PushLoad(prop, object, key)); |
10521 | 10516 |
10522 after = BuildIncrement(returns_original_input, expr); | 10517 after = BuildIncrement(expr); |
10523 | 10518 |
10524 if (returns_original_input) { | 10519 if (returns_original_input) { |
10525 input = Pop(); | 10520 input = Pop(); |
10526 // Drop object and key to push it again in the effect context below. | 10521 // Drop object and key to push it again in the effect context below. |
10527 Drop(key == NULL ? 1 : 2); | 10522 Drop(key == NULL ? 1 : 2); |
10528 environment()->SetExpressionStackAt(0, input); | 10523 environment()->SetExpressionStackAt(0, input); |
10529 CHECK_ALIVE(BuildStoreForEffect(expr, prop, expr->CountSlot(), expr->id(), | 10524 CHECK_ALIVE(BuildStoreForEffect(expr, prop, expr->CountSlot(), expr->id(), |
10530 expr->AssignmentId(), object, key, after)); | 10525 expr->AssignmentId(), object, key, after)); |
10531 return ast_context()->ReturnValue(Pop()); | 10526 return ast_context()->ReturnValue(Pop()); |
10532 } | 10527 } |
(...skipping 2512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13045 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13040 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13046 } | 13041 } |
13047 | 13042 |
13048 #ifdef DEBUG | 13043 #ifdef DEBUG |
13049 graph_->Verify(false); // No full verify. | 13044 graph_->Verify(false); // No full verify. |
13050 #endif | 13045 #endif |
13051 } | 13046 } |
13052 | 13047 |
13053 } // namespace internal | 13048 } // namespace internal |
13054 } // namespace v8 | 13049 } // namespace v8 |
OLD | NEW |