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

Side by Side Diff: src/compiler/simplified-lowering.cc

Issue 1938993002: [turbofan] Restore basic write barrier elimination. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months 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
OLDNEW
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/base/bits.h" 10 #include "src/base/bits.h"
10 #include "src/code-factory.h" 11 #include "src/code-factory.h"
11 #include "src/compiler/access-builder.h" 12 #include "src/compiler/access-builder.h"
12 #include "src/compiler/common-operator.h" 13 #include "src/compiler/common-operator.h"
13 #include "src/compiler/diamond.h" 14 #include "src/compiler/diamond.h"
14 #include "src/compiler/linkage.h" 15 #include "src/compiler/linkage.h"
15 #include "src/compiler/node-matchers.h" 16 #include "src/compiler/node-matchers.h"
16 #include "src/compiler/node-properties.h" 17 #include "src/compiler/node-properties.h"
17 #include "src/compiler/operator-properties.h" 18 #include "src/compiler/operator-properties.h"
18 #include "src/compiler/representation-change.h" 19 #include "src/compiler/representation-change.h"
19 #include "src/compiler/simplified-operator.h" 20 #include "src/compiler/simplified-operator.h"
20 #include "src/compiler/source-position.h" 21 #include "src/compiler/source-position.h"
22 #include "src/conversions-inl.h"
21 #include "src/objects.h" 23 #include "src/objects.h"
22 #include "src/type-cache.h" 24 #include "src/type-cache.h"
23 25
24 namespace v8 { 26 namespace v8 {
25 namespace internal { 27 namespace internal {
26 namespace compiler { 28 namespace compiler {
27 29
28 // Macro for outputting trace information from representation inference. 30 // Macro for outputting trace information from representation inference.
29 #define TRACE(...) \ 31 #define TRACE(...) \
30 do { \ 32 do { \
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 } 704 }
703 705
704 const Operator* Uint32Op(Node* node) { 706 const Operator* Uint32Op(Node* node) {
705 return changer_->Uint32OperatorFor(node->opcode()); 707 return changer_->Uint32OperatorFor(node->opcode());
706 } 708 }
707 709
708 const Operator* Float64Op(Node* node) { 710 const Operator* Float64Op(Node* node) {
709 return changer_->Float64OperatorFor(node->opcode()); 711 return changer_->Float64OperatorFor(node->opcode());
710 } 712 }
711 713
714 WriteBarrierKind WriteBarrierKindFor(
715 BaseTaggedness base_taggedness,
716 MachineRepresentation field_representation, Type* field_type,
717 Node* value) {
718 if (base_taggedness == kTaggedBase &&
719 field_representation == MachineRepresentation::kTagged) {
720 Type* value_type = NodeProperties::GetType(value);
721 if (field_type->Is(Type::TaggedSigned()) ||
722 value_type->Is(Type::TaggedSigned())) {
723 // Write barriers are only for stores of heap objects.
724 return kNoWriteBarrier;
725 }
726 if (field_type->Is(Type::BooleanOrNullOrUndefined()) ||
727 value_type->Is(Type::BooleanOrNullOrUndefined())) {
728 // Write barriers are not necessary when storing true, false, null or
729 // undefined, because these special oddballs are always in the root set.
730 return kNoWriteBarrier;
731 }
732 if (value_type->IsConstant() &&
733 value_type->AsConstant()->Value()->IsHeapObject()) {
734 Handle<HeapObject> value_object =
735 Handle<HeapObject>::cast(value_type->AsConstant()->Value());
736 if (value_object->IsMap()) {
737 // Write barriers for storing maps are cheaper.
738 return kMapWriteBarrier;
739 }
740 RootIndexMap root_index_map(jsgraph_->isolate());
741 int root_index = root_index_map.Lookup(*value_object);
742 if (root_index != RootIndexMap::kInvalidRootIndex &&
743 jsgraph_->isolate()->heap()->RootIsImmortalImmovable(root_index)) {
744 // Write barriers are unnecessary for immortal immovable roots.
745 return kNoWriteBarrier;
746 }
747 }
748 if (field_type->Is(Type::TaggedPointer()) ||
749 value_type->Is(Type::TaggedPointer())) {
750 // Write barriers for heap objects are cheaper.
751 return kPointerWriteBarrier;
752 }
753 NumberMatcher m(value);
754 if (m.HasValue()) {
755 if (IsSmiDouble(m.Value())) {
756 // Storing a smi doesn't need a write barrier.
757 return kNoWriteBarrier;
758 }
759 // The NumberConstant will be represented as HeapNumber.
760 return kPointerWriteBarrier;
761 }
762 return kFullWriteBarrier;
763 }
764 return kNoWriteBarrier;
765 }
766
767 WriteBarrierKind WriteBarrierKindFor(
768 BaseTaggedness base_taggedness,
769 MachineRepresentation field_representation, int field_offset,
770 Type* field_type, Node* value) {
771 if (base_taggedness == kTaggedBase &&
772 field_offset == HeapObject::kMapOffset) {
773 return kMapWriteBarrier;
774 }
775 return WriteBarrierKindFor(base_taggedness, field_representation,
776 field_type, value);
777 }
778
712 // Dispatching routine for visiting the node {node} with the usage {use}. 779 // Dispatching routine for visiting the node {node} with the usage {use}.
713 // Depending on the operator, propagate new usage info to the inputs. 780 // Depending on the operator, propagate new usage info to the inputs.
714 void VisitNode(Node* node, Truncation truncation, 781 void VisitNode(Node* node, Truncation truncation,
715 SimplifiedLowering* lowering) { 782 SimplifiedLowering* lowering) {
716 switch (node->opcode()) { 783 switch (node->opcode()) {
717 //------------------------------------------------------------------ 784 //------------------------------------------------------------------
718 // Common operators. 785 // Common operators.
719 //------------------------------------------------------------------ 786 //------------------------------------------------------------------
720 case IrOpcode::kStart: 787 case IrOpcode::kStart:
721 case IrOpcode::kDead: 788 case IrOpcode::kDead:
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
1120 SetOutput(node, access.machine_type.representation()); 1187 SetOutput(node, access.machine_type.representation());
1121 break; 1188 break;
1122 } 1189 }
1123 case IrOpcode::kStoreField: { 1190 case IrOpcode::kStoreField: {
1124 FieldAccess access = FieldAccessOf(node->op()); 1191 FieldAccess access = FieldAccessOf(node->op());
1125 ProcessInput(node, 0, UseInfoForBasePointer(access)); 1192 ProcessInput(node, 0, UseInfoForBasePointer(access));
1126 ProcessInput(node, 1, TruncatingUseInfoFromRepresentation( 1193 ProcessInput(node, 1, TruncatingUseInfoFromRepresentation(
1127 access.machine_type.representation())); 1194 access.machine_type.representation()));
1128 ProcessRemainingInputs(node, 2); 1195 ProcessRemainingInputs(node, 2);
1129 SetOutput(node, MachineRepresentation::kNone); 1196 SetOutput(node, MachineRepresentation::kNone);
1197 if (lower()) {
1198 WriteBarrierKind write_barrier_kind = WriteBarrierKindFor(
1199 access.base_is_tagged, access.machine_type.representation(),
1200 access.offset, access.type, node->InputAt(1));
1201 if (write_barrier_kind < access.write_barrier_kind) {
1202 access.write_barrier_kind = write_barrier_kind;
1203 NodeProperties::ChangeOp(
1204 node, jsgraph_->simplified()->StoreField(access));
1205 }
1206 }
1130 break; 1207 break;
1131 } 1208 }
1132 case IrOpcode::kLoadBuffer: { 1209 case IrOpcode::kLoadBuffer: {
1133 BufferAccess access = BufferAccessOf(node->op()); 1210 BufferAccess access = BufferAccessOf(node->op());
1134 ProcessInput(node, 0, UseInfo::PointerInt()); // buffer 1211 ProcessInput(node, 0, UseInfo::PointerInt()); // buffer
1135 ProcessInput(node, 1, UseInfo::TruncatingWord32()); // offset 1212 ProcessInput(node, 1, UseInfo::TruncatingWord32()); // offset
1136 ProcessInput(node, 2, UseInfo::TruncatingWord32()); // length 1213 ProcessInput(node, 2, UseInfo::TruncatingWord32()); // length
1137 ProcessRemainingInputs(node, 3); 1214 ProcessRemainingInputs(node, 3);
1138 1215
1139 MachineRepresentation output; 1216 MachineRepresentation output;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1185 } 1262 }
1186 case IrOpcode::kStoreElement: { 1263 case IrOpcode::kStoreElement: {
1187 ElementAccess access = ElementAccessOf(node->op()); 1264 ElementAccess access = ElementAccessOf(node->op());
1188 ProcessInput(node, 0, UseInfoForBasePointer(access)); // base 1265 ProcessInput(node, 0, UseInfoForBasePointer(access)); // base
1189 ProcessInput(node, 1, UseInfo::TruncatingWord32()); // index 1266 ProcessInput(node, 1, UseInfo::TruncatingWord32()); // index
1190 ProcessInput(node, 2, 1267 ProcessInput(node, 2,
1191 TruncatingUseInfoFromRepresentation( 1268 TruncatingUseInfoFromRepresentation(
1192 access.machine_type.representation())); // value 1269 access.machine_type.representation())); // value
1193 ProcessRemainingInputs(node, 3); 1270 ProcessRemainingInputs(node, 3);
1194 SetOutput(node, MachineRepresentation::kNone); 1271 SetOutput(node, MachineRepresentation::kNone);
1272 if (lower()) {
1273 WriteBarrierKind write_barrier_kind = WriteBarrierKindFor(
1274 access.base_is_tagged, access.machine_type.representation(),
1275 access.type, node->InputAt(2));
1276 if (write_barrier_kind < access.write_barrier_kind) {
1277 access.write_barrier_kind = write_barrier_kind;
1278 NodeProperties::ChangeOp(
1279 node, jsgraph_->simplified()->StoreElement(access));
1280 }
1281 }
1195 break; 1282 break;
1196 } 1283 }
1197 case IrOpcode::kObjectIsCallable: 1284 case IrOpcode::kObjectIsCallable:
1198 case IrOpcode::kObjectIsNumber: 1285 case IrOpcode::kObjectIsNumber:
1199 case IrOpcode::kObjectIsReceiver: 1286 case IrOpcode::kObjectIsReceiver:
1200 case IrOpcode::kObjectIsSmi: 1287 case IrOpcode::kObjectIsSmi:
1201 case IrOpcode::kObjectIsString: 1288 case IrOpcode::kObjectIsString:
1202 case IrOpcode::kObjectIsUndetectable: { 1289 case IrOpcode::kObjectIsUndetectable: {
1203 ProcessInput(node, 0, UseInfo::AnyTagged()); 1290 ProcessInput(node, 0, UseInfo::AnyTagged());
1204 SetOutput(node, MachineRepresentation::kBit); 1291 SetOutput(node, MachineRepresentation::kBit);
(...skipping 1159 matching lines...) Expand 10 before | Expand all | Expand 10 after
2364 isolate(), graph()->zone(), callable.descriptor(), 0, flags, 2451 isolate(), graph()->zone(), callable.descriptor(), 0, flags,
2365 Operator::kNoProperties); 2452 Operator::kNoProperties);
2366 to_number_operator_.set(common()->Call(desc)); 2453 to_number_operator_.set(common()->Call(desc));
2367 } 2454 }
2368 return to_number_operator_.get(); 2455 return to_number_operator_.get();
2369 } 2456 }
2370 2457
2371 } // namespace compiler 2458 } // namespace compiler
2372 } // namespace internal 2459 } // namespace internal
2373 } // namespace v8 2460 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698