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

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

Issue 968113002: [turbofan] Skip write barriers when storing smi. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add test case. Created 5 years, 9 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
« no previous file with comments | « src/compiler/simplified-lowering.h ('k') | test/cctest/compiler/test-simplified-lowering.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 1117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 Node* shift_amount = jsgraph()->Int32Constant(kSmiTagSize + kSmiShiftSize); 1128 Node* shift_amount = jsgraph()->Int32Constant(kSmiTagSize + kSmiShiftSize);
1129 return graph()->NewNode(machine()->WordShl(), node, shift_amount); 1129 return graph()->NewNode(machine()->WordShl(), node, shift_amount);
1130 } 1130 }
1131 1131
1132 1132
1133 Node* SimplifiedLowering::OffsetMinusTagConstant(int32_t offset) { 1133 Node* SimplifiedLowering::OffsetMinusTagConstant(int32_t offset) {
1134 return jsgraph()->Int32Constant(offset - kHeapObjectTag); 1134 return jsgraph()->Int32Constant(offset - kHeapObjectTag);
1135 } 1135 }
1136 1136
1137 1137
1138 static WriteBarrierKind ComputeWriteBarrierKind(BaseTaggedness base_is_tagged, 1138 WriteBarrierKind SimplifiedLowering::ComputeWriteBarrierKind(
1139 MachineType representation, 1139 BaseTaggedness base_is_tagged, MachineType representation, Node* value) {
1140 Type* type) {
1141 // TODO(turbofan): skip write barriers for Smis, etc. 1140 // TODO(turbofan): skip write barriers for Smis, etc.
1141 if (machine()->Is64() && value->opcode() == IrOpcode::kChangeInt32ToTagged) {
1142 // TODO(bmeurer): Remove this hack once we have a way to represent "sminess"
1143 // of values, either in types or representations.
1144 return kNoWriteBarrier;
1145 }
1142 if (base_is_tagged == kTaggedBase && 1146 if (base_is_tagged == kTaggedBase &&
1143 RepresentationOf(representation) == kRepTagged) { 1147 RepresentationOf(representation) == kRepTagged) {
1144 // Write barriers are only for writes into heap objects (i.e. tagged base). 1148 // Write barriers are only for writes into heap objects (i.e. tagged base).
1145 return kFullWriteBarrier; 1149 return kFullWriteBarrier;
1146 } 1150 }
1147 return kNoWriteBarrier; 1151 return kNoWriteBarrier;
1148 } 1152 }
1149 1153
1150 1154
1151 void SimplifiedLowering::DoLoadField(Node* node) { 1155 void SimplifiedLowering::DoLoadField(Node* node) {
1152 const FieldAccess& access = FieldAccessOf(node->op()); 1156 const FieldAccess& access = FieldAccessOf(node->op());
1153 node->set_op(machine()->Load(access.machine_type)); 1157 node->set_op(machine()->Load(access.machine_type));
1154 Node* offset = jsgraph()->IntPtrConstant(access.offset - access.tag()); 1158 Node* offset = jsgraph()->IntPtrConstant(access.offset - access.tag());
1155 node->InsertInput(graph()->zone(), 1, offset); 1159 node->InsertInput(graph()->zone(), 1, offset);
1156 } 1160 }
1157 1161
1158 1162
1159 void SimplifiedLowering::DoStoreField(Node* node) { 1163 void SimplifiedLowering::DoStoreField(Node* node) {
1160 const FieldAccess& access = FieldAccessOf(node->op()); 1164 const FieldAccess& access = FieldAccessOf(node->op());
1161 WriteBarrierKind kind = ComputeWriteBarrierKind( 1165 WriteBarrierKind kind = ComputeWriteBarrierKind(
1162 access.base_is_tagged, access.machine_type, access.type); 1166 access.base_is_tagged, access.machine_type, node->InputAt(1));
1163 node->set_op( 1167 node->set_op(
1164 machine()->Store(StoreRepresentation(access.machine_type, kind))); 1168 machine()->Store(StoreRepresentation(access.machine_type, kind)));
1165 Node* offset = jsgraph()->IntPtrConstant(access.offset - access.tag()); 1169 Node* offset = jsgraph()->IntPtrConstant(access.offset - access.tag());
1166 node->InsertInput(graph()->zone(), 1, offset); 1170 node->InsertInput(graph()->zone(), 1, offset);
1167 } 1171 }
1168 1172
1169 1173
1170 Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access, 1174 Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access,
1171 Node* const key) { 1175 Node* const key) {
1172 Node* index = key; 1176 Node* index = key;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1260 node->set_op(machine()->Load(access.machine_type)); 1264 node->set_op(machine()->Load(access.machine_type));
1261 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); 1265 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1)));
1262 } 1266 }
1263 1267
1264 1268
1265 void SimplifiedLowering::DoStoreElement(Node* node) { 1269 void SimplifiedLowering::DoStoreElement(Node* node) {
1266 const ElementAccess& access = ElementAccessOf(node->op()); 1270 const ElementAccess& access = ElementAccessOf(node->op());
1267 node->set_op(machine()->Store(StoreRepresentation( 1271 node->set_op(machine()->Store(StoreRepresentation(
1268 access.machine_type, 1272 access.machine_type,
1269 ComputeWriteBarrierKind(access.base_is_tagged, access.machine_type, 1273 ComputeWriteBarrierKind(access.base_is_tagged, access.machine_type,
1270 access.type)))); 1274 node->InputAt(2)))));
1271 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); 1275 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1)));
1272 } 1276 }
1273 1277
1274 1278
1275 void SimplifiedLowering::DoStringAdd(Node* node) { 1279 void SimplifiedLowering::DoStringAdd(Node* node) {
1276 Operator::Properties properties = node->op()->properties(); 1280 Operator::Properties properties = node->op()->properties();
1277 Callable callable = CodeFactory::StringAdd( 1281 Callable callable = CodeFactory::StringAdd(
1278 jsgraph()->isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED); 1282 jsgraph()->isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED);
1279 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; 1283 CallDescriptor::Flags flags = CallDescriptor::kNoFlags;
1280 CallDescriptor* desc = Linkage::GetStubCallDescriptor( 1284 CallDescriptor* desc = Linkage::GetStubCallDescriptor(
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
1573 1577
1574 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { 1578 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) {
1575 node->set_op(machine()->IntLessThanOrEqual()); 1579 node->set_op(machine()->IntLessThanOrEqual());
1576 node->ReplaceInput(0, StringComparison(node, true)); 1580 node->ReplaceInput(0, StringComparison(node, true));
1577 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); 1581 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL));
1578 } 1582 }
1579 1583
1580 } // namespace compiler 1584 } // namespace compiler
1581 } // namespace internal 1585 } // namespace internal
1582 } // namespace v8 1586 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/simplified-lowering.h ('k') | test/cctest/compiler/test-simplified-lowering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698