OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/simplified-lowering.h" | 5 #include "src/compiler/simplified-lowering.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/address-map.h" | 9 #include "src/address-map.h" |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 2453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2464 case IrOpcode::kLoadField: { | 2464 case IrOpcode::kLoadField: { |
2465 if (truncation.IsUnused()) return VisitUnused(node); | 2465 if (truncation.IsUnused()) return VisitUnused(node); |
2466 FieldAccess access = FieldAccessOf(node->op()); | 2466 FieldAccess access = FieldAccessOf(node->op()); |
2467 MachineRepresentation const representation = | 2467 MachineRepresentation const representation = |
2468 access.machine_type.representation(); | 2468 access.machine_type.representation(); |
2469 VisitUnop(node, UseInfoForBasePointer(access), representation); | 2469 VisitUnop(node, UseInfoForBasePointer(access), representation); |
2470 return; | 2470 return; |
2471 } | 2471 } |
2472 case IrOpcode::kStoreField: { | 2472 case IrOpcode::kStoreField: { |
2473 FieldAccess access = FieldAccessOf(node->op()); | 2473 FieldAccess access = FieldAccessOf(node->op()); |
2474 NodeInfo* input_info = GetInfo(node->InputAt(1)); | 2474 Node* value_node = node->InputAt(1); |
| 2475 NodeInfo* input_info = GetInfo(value_node); |
| 2476 MachineRepresentation field_representation = |
| 2477 access.machine_type.representation(); |
| 2478 |
| 2479 // Make sure we convert to Smi if possible. This should help write |
| 2480 // barrier elimination. |
| 2481 if (field_representation == MachineRepresentation::kTagged && |
| 2482 TypeOf(value_node)->Is(Type::SignedSmall())) { |
| 2483 field_representation = MachineRepresentation::kTaggedSigned; |
| 2484 } |
2475 WriteBarrierKind write_barrier_kind = WriteBarrierKindFor( | 2485 WriteBarrierKind write_barrier_kind = WriteBarrierKindFor( |
2476 access.base_is_tagged, access.machine_type.representation(), | 2486 access.base_is_tagged, field_representation, access.offset, |
2477 access.offset, access.type, input_info->representation(), | 2487 access.type, input_info->representation(), value_node); |
2478 node->InputAt(1)); | 2488 |
2479 ProcessInput(node, 0, UseInfoForBasePointer(access)); | 2489 ProcessInput(node, 0, UseInfoForBasePointer(access)); |
2480 ProcessInput(node, 1, TruncatingUseInfoFromRepresentation( | 2490 ProcessInput(node, 1, |
2481 access.machine_type.representation())); | 2491 TruncatingUseInfoFromRepresentation(field_representation)); |
2482 ProcessRemainingInputs(node, 2); | 2492 ProcessRemainingInputs(node, 2); |
2483 SetOutput(node, MachineRepresentation::kNone); | 2493 SetOutput(node, MachineRepresentation::kNone); |
2484 if (lower()) { | 2494 if (lower()) { |
2485 if (write_barrier_kind < access.write_barrier_kind) { | 2495 if (write_barrier_kind < access.write_barrier_kind) { |
2486 access.write_barrier_kind = write_barrier_kind; | 2496 access.write_barrier_kind = write_barrier_kind; |
2487 NodeProperties::ChangeOp( | 2497 NodeProperties::ChangeOp( |
2488 node, jsgraph_->simplified()->StoreField(access)); | 2498 node, jsgraph_->simplified()->StoreField(access)); |
2489 } | 2499 } |
2490 } | 2500 } |
2491 return; | 2501 return; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2540 case IrOpcode::kLoadElement: { | 2550 case IrOpcode::kLoadElement: { |
2541 if (truncation.IsUnused()) return VisitUnused(node); | 2551 if (truncation.IsUnused()) return VisitUnused(node); |
2542 ElementAccess access = ElementAccessOf(node->op()); | 2552 ElementAccess access = ElementAccessOf(node->op()); |
2543 VisitBinop(node, UseInfoForBasePointer(access), | 2553 VisitBinop(node, UseInfoForBasePointer(access), |
2544 UseInfo::TruncatingWord32(), | 2554 UseInfo::TruncatingWord32(), |
2545 access.machine_type.representation()); | 2555 access.machine_type.representation()); |
2546 return; | 2556 return; |
2547 } | 2557 } |
2548 case IrOpcode::kStoreElement: { | 2558 case IrOpcode::kStoreElement: { |
2549 ElementAccess access = ElementAccessOf(node->op()); | 2559 ElementAccess access = ElementAccessOf(node->op()); |
2550 NodeInfo* input_info = GetInfo(node->InputAt(2)); | 2560 Node* value_node = node->InputAt(2); |
| 2561 NodeInfo* input_info = GetInfo(value_node); |
| 2562 MachineRepresentation element_representation = |
| 2563 access.machine_type.representation(); |
| 2564 |
| 2565 // Make sure we convert to Smi if possible. This should help write |
| 2566 // barrier elimination. |
| 2567 if (element_representation == MachineRepresentation::kTagged && |
| 2568 TypeOf(value_node)->Is(Type::SignedSmall())) { |
| 2569 element_representation = MachineRepresentation::kTaggedSigned; |
| 2570 } |
2551 WriteBarrierKind write_barrier_kind = WriteBarrierKindFor( | 2571 WriteBarrierKind write_barrier_kind = WriteBarrierKindFor( |
2552 access.base_is_tagged, access.machine_type.representation(), | 2572 access.base_is_tagged, element_representation, access.type, |
2553 access.type, input_info->representation(), node->InputAt(2)); | 2573 input_info->representation(), value_node); |
2554 ProcessInput(node, 0, UseInfoForBasePointer(access)); // base | 2574 ProcessInput(node, 0, UseInfoForBasePointer(access)); // base |
2555 ProcessInput(node, 1, UseInfo::TruncatingWord32()); // index | 2575 ProcessInput(node, 1, UseInfo::TruncatingWord32()); // index |
2556 ProcessInput(node, 2, | 2576 ProcessInput(node, 2, |
2557 TruncatingUseInfoFromRepresentation( | 2577 TruncatingUseInfoFromRepresentation( |
2558 access.machine_type.representation())); // value | 2578 element_representation)); // value |
2559 ProcessRemainingInputs(node, 3); | 2579 ProcessRemainingInputs(node, 3); |
2560 SetOutput(node, MachineRepresentation::kNone); | 2580 SetOutput(node, MachineRepresentation::kNone); |
2561 if (lower()) { | 2581 if (lower()) { |
2562 if (write_barrier_kind < access.write_barrier_kind) { | 2582 if (write_barrier_kind < access.write_barrier_kind) { |
2563 access.write_barrier_kind = write_barrier_kind; | 2583 access.write_barrier_kind = write_barrier_kind; |
2564 NodeProperties::ChangeOp( | 2584 NodeProperties::ChangeOp( |
2565 node, jsgraph_->simplified()->StoreElement(access)); | 2585 node, jsgraph_->simplified()->StoreElement(access)); |
2566 } | 2586 } |
2567 } | 2587 } |
2568 return; | 2588 return; |
(...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3716 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3736 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
3717 Operator::kNoProperties); | 3737 Operator::kNoProperties); |
3718 to_number_operator_.set(common()->Call(desc)); | 3738 to_number_operator_.set(common()->Call(desc)); |
3719 } | 3739 } |
3720 return to_number_operator_.get(); | 3740 return to_number_operator_.get(); |
3721 } | 3741 } |
3722 | 3742 |
3723 } // namespace compiler | 3743 } // namespace compiler |
3724 } // namespace internal | 3744 } // namespace internal |
3725 } // namespace v8 | 3745 } // namespace v8 |
OLD | NEW |