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

Side by Side Diff: src/compiler/instruction-selector.cc

Issue 1008213002: [turbofan] Cache for reusing value vector nodes in frame states. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Embed StateValueCache in AstGraphBuilder 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/instruction-selector.h ('k') | src/compiler/state-values-utils.h » ('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/instruction-selector.h" 5 #include "src/compiler/instruction-selector.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "src/compiler/instruction-selector-impl.h" 9 #include "src/compiler/instruction-selector-impl.h"
10 #include "src/compiler/node-matchers.h" 10 #include "src/compiler/node-matchers.h"
11 #include "src/compiler/node-properties.h" 11 #include "src/compiler/node-properties.h"
12 #include "src/compiler/pipeline.h" 12 #include "src/compiler/pipeline.h"
13 #include "src/compiler/schedule.h" 13 #include "src/compiler/schedule.h"
14 #include "src/compiler/state-values-utils.h"
14 15
15 namespace v8 { 16 namespace v8 {
16 namespace internal { 17 namespace internal {
17 namespace compiler { 18 namespace compiler {
18 19
19 InstructionSelector::InstructionSelector(Zone* zone, size_t node_count, 20 InstructionSelector::InstructionSelector(Zone* zone, size_t node_count,
20 Linkage* linkage, 21 Linkage* linkage,
21 InstructionSequence* sequence, 22 InstructionSequence* sequence,
22 Schedule* schedule, 23 Schedule* schedule,
23 SourcePositionTable* source_positions, 24 SourcePositionTable* source_positions,
(...skipping 1113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1137 Emit(kArchDeoptimize, 0, nullptr, arg_count, &args.front(), 0, nullptr); 1138 Emit(kArchDeoptimize, 0, nullptr, arg_count, &args.front(), 0, nullptr);
1138 } 1139 }
1139 1140
1140 1141
1141 void InstructionSelector::VisitThrow(Node* value) { 1142 void InstructionSelector::VisitThrow(Node* value) {
1142 OperandGenerator g(this); 1143 OperandGenerator g(this);
1143 Emit(kArchNop, g.NoOutput()); // TODO(titzer) 1144 Emit(kArchNop, g.NoOutput()); // TODO(titzer)
1144 } 1145 }
1145 1146
1146 1147
1147 void InstructionSelector::FillTypeVectorFromStateValues(
1148 ZoneVector<MachineType>* types, Node* state_values) {
1149 DCHECK(state_values->opcode() == IrOpcode::kStateValues);
1150 int count = state_values->InputCount();
1151 types->reserve(static_cast<size_t>(count));
1152 for (int i = 0; i < count; i++) {
1153 types->push_back(GetMachineType(state_values->InputAt(i)));
1154 }
1155 }
1156
1157
1158 FrameStateDescriptor* InstructionSelector::GetFrameStateDescriptor( 1148 FrameStateDescriptor* InstructionSelector::GetFrameStateDescriptor(
1159 Node* state) { 1149 Node* state) {
1160 DCHECK(state->opcode() == IrOpcode::kFrameState); 1150 DCHECK(state->opcode() == IrOpcode::kFrameState);
1161 DCHECK_EQ(5, state->InputCount()); 1151 DCHECK_EQ(5, state->InputCount());
1162 DCHECK_EQ(IrOpcode::kStateValues, state->InputAt(0)->opcode()); 1152 DCHECK_EQ(IrOpcode::kStateValues, state->InputAt(0)->opcode());
1163 DCHECK_EQ(IrOpcode::kStateValues, state->InputAt(1)->opcode()); 1153 DCHECK_EQ(IrOpcode::kStateValues, state->InputAt(1)->opcode());
1164 DCHECK_EQ(IrOpcode::kStateValues, state->InputAt(2)->opcode()); 1154 DCHECK_EQ(IrOpcode::kStateValues, state->InputAt(2)->opcode());
1165 FrameStateCallInfo state_info = OpParameter<FrameStateCallInfo>(state); 1155 FrameStateCallInfo state_info = OpParameter<FrameStateCallInfo>(state);
1166 1156
1167 int parameters = state->InputAt(0)->InputCount(); 1157 int parameters =
1168 int locals = state->InputAt(1)->InputCount(); 1158 static_cast<int>(StateValuesAccess(state->InputAt(0)).size());
1169 int stack = state->InputAt(2)->InputCount(); 1159 int locals = static_cast<int>(StateValuesAccess(state->InputAt(1)).size());
1160 int stack = static_cast<int>(StateValuesAccess(state->InputAt(2)).size());
1170 1161
1171 FrameStateDescriptor* outer_state = NULL; 1162 FrameStateDescriptor* outer_state = NULL;
1172 Node* outer_node = state->InputAt(4); 1163 Node* outer_node = state->InputAt(4);
1173 if (outer_node->opcode() == IrOpcode::kFrameState) { 1164 if (outer_node->opcode() == IrOpcode::kFrameState) {
1174 outer_state = GetFrameStateDescriptor(outer_node); 1165 outer_state = GetFrameStateDescriptor(outer_node);
1175 } 1166 }
1176 1167
1177 return new (instruction_zone()) FrameStateDescriptor( 1168 return new (instruction_zone()) FrameStateDescriptor(
1178 instruction_zone(), state_info, parameters, locals, stack, outer_state); 1169 instruction_zone(), state_info, parameters, locals, stack, outer_state);
1179 } 1170 }
(...skipping 23 matching lines...) Expand all
1203 1194
1204 Node* parameters = state->InputAt(0); 1195 Node* parameters = state->InputAt(0);
1205 Node* locals = state->InputAt(1); 1196 Node* locals = state->InputAt(1);
1206 Node* stack = state->InputAt(2); 1197 Node* stack = state->InputAt(2);
1207 Node* context = state->InputAt(3); 1198 Node* context = state->InputAt(3);
1208 1199
1209 DCHECK_EQ(IrOpcode::kStateValues, parameters->op()->opcode()); 1200 DCHECK_EQ(IrOpcode::kStateValues, parameters->op()->opcode());
1210 DCHECK_EQ(IrOpcode::kStateValues, locals->op()->opcode()); 1201 DCHECK_EQ(IrOpcode::kStateValues, locals->op()->opcode());
1211 DCHECK_EQ(IrOpcode::kStateValues, stack->op()->opcode()); 1202 DCHECK_EQ(IrOpcode::kStateValues, stack->op()->opcode());
1212 1203
1213 DCHECK_EQ(static_cast<int>(descriptor->parameters_count()), 1204 DCHECK_EQ(descriptor->parameters_count(),
1214 parameters->InputCount()); 1205 StateValuesAccess(parameters).size());
1215 DCHECK_EQ(static_cast<int>(descriptor->locals_count()), locals->InputCount()); 1206 DCHECK_EQ(descriptor->locals_count(), StateValuesAccess(locals).size());
1216 DCHECK_EQ(static_cast<int>(descriptor->stack_count()), stack->InputCount()); 1207 DCHECK_EQ(descriptor->stack_count(), StateValuesAccess(stack).size());
1217 1208
1218 ZoneVector<MachineType> types(instruction_zone()); 1209 ZoneVector<MachineType> types(instruction_zone());
1219 types.reserve(descriptor->GetSize()); 1210 types.reserve(descriptor->GetSize());
1220 1211
1221 OperandGenerator g(this); 1212 OperandGenerator g(this);
1222 size_t value_index = 0; 1213 size_t value_index = 0;
1223 for (int i = 0; i < static_cast<int>(descriptor->parameters_count()); i++) { 1214 for (Node* input_node : StateValuesAccess(parameters)) {
1224 Node* input_node = parameters->InputAt(i);
1225 inputs->push_back(UseOrImmediate(&g, input_node)); 1215 inputs->push_back(UseOrImmediate(&g, input_node));
1226 descriptor->SetType(value_index++, GetMachineType(input_node)); 1216 descriptor->SetType(value_index++, GetMachineType(input_node));
1227 } 1217 }
1228 if (descriptor->HasContext()) { 1218 if (descriptor->HasContext()) {
1229 inputs->push_back(UseOrImmediate(&g, context)); 1219 inputs->push_back(UseOrImmediate(&g, context));
1230 descriptor->SetType(value_index++, kMachAnyTagged); 1220 descriptor->SetType(value_index++, kMachAnyTagged);
1231 } 1221 }
1232 for (int i = 0; i < static_cast<int>(descriptor->locals_count()); i++) { 1222 for (Node* input_node : StateValuesAccess(locals)) {
1233 Node* input_node = locals->InputAt(i);
1234 inputs->push_back(UseOrImmediate(&g, input_node)); 1223 inputs->push_back(UseOrImmediate(&g, input_node));
1235 descriptor->SetType(value_index++, GetMachineType(input_node)); 1224 descriptor->SetType(value_index++, GetMachineType(input_node));
1236 } 1225 }
1237 for (int i = 0; i < static_cast<int>(descriptor->stack_count()); i++) { 1226 for (Node* input_node : StateValuesAccess(stack)) {
1238 Node* input_node = stack->InputAt(i);
1239 inputs->push_back(UseOrImmediate(&g, input_node)); 1227 inputs->push_back(UseOrImmediate(&g, input_node));
1240 descriptor->SetType(value_index++, GetMachineType(input_node)); 1228 descriptor->SetType(value_index++, GetMachineType(input_node));
1241 } 1229 }
1242 DCHECK(value_index == descriptor->GetSize()); 1230 DCHECK(value_index == descriptor->GetSize());
1243 } 1231 }
1244 1232
1245 1233
1246 #if !V8_TURBOFAN_BACKEND 1234 #if !V8_TURBOFAN_BACKEND
1247 1235
1248 #define DECLARE_UNIMPLEMENTED_SELECTOR(x) \ 1236 #define DECLARE_UNIMPLEMENTED_SELECTOR(x) \
(...skipping 25 matching lines...) Expand all
1274 MachineOperatorBuilder::Flags 1262 MachineOperatorBuilder::Flags
1275 InstructionSelector::SupportedMachineOperatorFlags() { 1263 InstructionSelector::SupportedMachineOperatorFlags() {
1276 return MachineOperatorBuilder::Flag::kNoFlags; 1264 return MachineOperatorBuilder::Flag::kNoFlags;
1277 } 1265 }
1278 1266
1279 #endif // !V8_TURBOFAN_BACKEND 1267 #endif // !V8_TURBOFAN_BACKEND
1280 1268
1281 } // namespace compiler 1269 } // namespace compiler
1282 } // namespace internal 1270 } // namespace internal
1283 } // namespace v8 1271 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/instruction-selector.h ('k') | src/compiler/state-values-utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698