OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/effect-control-linearizer.h" | 5 #include "src/compiler/effect-control-linearizer.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 break; | 707 break; |
708 case IrOpcode::kStringCharCodeAt: | 708 case IrOpcode::kStringCharCodeAt: |
709 state = LowerStringCharCodeAt(node, *effect, *control); | 709 state = LowerStringCharCodeAt(node, *effect, *control); |
710 break; | 710 break; |
711 case IrOpcode::kCheckFloat64Hole: | 711 case IrOpcode::kCheckFloat64Hole: |
712 state = LowerCheckFloat64Hole(node, frame_state, *effect, *control); | 712 state = LowerCheckFloat64Hole(node, frame_state, *effect, *control); |
713 break; | 713 break; |
714 case IrOpcode::kCheckTaggedHole: | 714 case IrOpcode::kCheckTaggedHole: |
715 state = LowerCheckTaggedHole(node, frame_state, *effect, *control); | 715 state = LowerCheckTaggedHole(node, frame_state, *effect, *control); |
716 break; | 716 break; |
| 717 case IrOpcode::kConvertTaggedHoleToUndefined: |
| 718 state = LowerConvertTaggedHoleToUndefined(node, *effect, *control); |
| 719 break; |
717 case IrOpcode::kPlainPrimitiveToNumber: | 720 case IrOpcode::kPlainPrimitiveToNumber: |
718 state = LowerPlainPrimitiveToNumber(node, *effect, *control); | 721 state = LowerPlainPrimitiveToNumber(node, *effect, *control); |
719 break; | 722 break; |
720 case IrOpcode::kPlainPrimitiveToWord32: | 723 case IrOpcode::kPlainPrimitiveToWord32: |
721 state = LowerPlainPrimitiveToWord32(node, *effect, *control); | 724 state = LowerPlainPrimitiveToWord32(node, *effect, *control); |
722 break; | 725 break; |
723 case IrOpcode::kPlainPrimitiveToFloat64: | 726 case IrOpcode::kPlainPrimitiveToFloat64: |
724 state = LowerPlainPrimitiveToFloat64(node, *effect, *control); | 727 state = LowerPlainPrimitiveToFloat64(node, *effect, *control); |
725 break; | 728 break; |
726 case IrOpcode::kEnsureWritableFastElements: | 729 case IrOpcode::kEnsureWritableFastElements: |
(...skipping 1684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2411 control = effect = | 2414 control = effect = |
2412 graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kHole), check, | 2415 graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kHole), check, |
2413 frame_state, effect, control); | 2416 frame_state, effect, control); |
2414 | 2417 |
2415 return ValueEffectControl(value, effect, control); | 2418 return ValueEffectControl(value, effect, control); |
2416 } | 2419 } |
2417 | 2420 |
2418 EffectControlLinearizer::ValueEffectControl | 2421 EffectControlLinearizer::ValueEffectControl |
2419 EffectControlLinearizer::LowerCheckTaggedHole(Node* node, Node* frame_state, | 2422 EffectControlLinearizer::LowerCheckTaggedHole(Node* node, Node* frame_state, |
2420 Node* effect, Node* control) { | 2423 Node* effect, Node* control) { |
2421 CheckTaggedHoleMode mode = CheckTaggedHoleModeOf(node->op()); | |
2422 Node* value = node->InputAt(0); | 2424 Node* value = node->InputAt(0); |
2423 Node* check = graph()->NewNode(machine()->WordEqual(), value, | 2425 Node* check = graph()->NewNode(machine()->WordEqual(), value, |
2424 jsgraph()->TheHoleConstant()); | 2426 jsgraph()->TheHoleConstant()); |
2425 switch (mode) { | 2427 control = effect = |
2426 case CheckTaggedHoleMode::kConvertHoleToUndefined: | 2428 graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kHole), check, |
2427 value = graph()->NewNode( | 2429 frame_state, effect, control); |
2428 common()->Select(MachineRepresentation::kTagged, BranchHint::kFalse), | |
2429 check, jsgraph()->UndefinedConstant(), value); | |
2430 break; | |
2431 case CheckTaggedHoleMode::kNeverReturnHole: | |
2432 control = effect = | |
2433 graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kHole), | |
2434 check, frame_state, effect, control); | |
2435 break; | |
2436 } | |
2437 | 2430 |
2438 return ValueEffectControl(value, effect, control); | 2431 return ValueEffectControl(value, effect, control); |
2439 } | 2432 } |
| 2433 |
| 2434 EffectControlLinearizer::ValueEffectControl |
| 2435 EffectControlLinearizer::LowerConvertTaggedHoleToUndefined(Node* node, |
| 2436 Node* effect, |
| 2437 Node* control) { |
| 2438 Node* value = node->InputAt(0); |
| 2439 Node* check = graph()->NewNode(machine()->WordEqual(), value, |
| 2440 jsgraph()->TheHoleConstant()); |
| 2441 Node* branch = |
| 2442 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); |
| 2443 |
| 2444 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
| 2445 Node* vtrue = jsgraph()->UndefinedConstant(); |
| 2446 |
| 2447 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
| 2448 Node* vfalse = value; |
| 2449 |
| 2450 control = graph()->NewNode(common()->Merge(2), if_true, if_false); |
| 2451 value = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
| 2452 vtrue, vfalse, control); |
| 2453 |
| 2454 return ValueEffectControl(value, effect, control); |
| 2455 } |
2440 | 2456 |
2441 EffectControlLinearizer::ValueEffectControl | 2457 EffectControlLinearizer::ValueEffectControl |
2442 EffectControlLinearizer::AllocateHeapNumberWithValue(Node* value, Node* effect, | 2458 EffectControlLinearizer::AllocateHeapNumberWithValue(Node* value, Node* effect, |
2443 Node* control) { | 2459 Node* control) { |
2444 Node* result = effect = graph()->NewNode( | 2460 Node* result = effect = graph()->NewNode( |
2445 simplified()->Allocate(NOT_TENURED), | 2461 simplified()->Allocate(NOT_TENURED), |
2446 jsgraph()->Int32Constant(HeapNumber::kSize), effect, control); | 2462 jsgraph()->Int32Constant(HeapNumber::kSize), effect, control); |
2447 effect = graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), | 2463 effect = graph()->NewNode(simplified()->StoreField(AccessBuilder::ForMap()), |
2448 result, jsgraph()->HeapNumberMapConstant(), effect, | 2464 result, jsgraph()->HeapNumberMapConstant(), effect, |
2449 control); | 2465 control); |
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3289 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3305 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
3290 Operator::kNoThrow); | 3306 Operator::kNoThrow); |
3291 to_number_operator_.set(common()->Call(desc)); | 3307 to_number_operator_.set(common()->Call(desc)); |
3292 } | 3308 } |
3293 return to_number_operator_.get(); | 3309 return to_number_operator_.get(); |
3294 } | 3310 } |
3295 | 3311 |
3296 } // namespace compiler | 3312 } // namespace compiler |
3297 } // namespace internal | 3313 } // namespace internal |
3298 } // namespace v8 | 3314 } // namespace v8 |
OLD | NEW |