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

Side by Side Diff: src/compiler/ast-graph-builder.cc

Issue 633423002: Teach TurboFan to call vector-based ICs. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Patch One. Created 6 years, 2 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 | Annotate | Revision Log
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/ast-graph-builder.h" 5 #include "src/compiler/ast-graph-builder.h"
6 6
7 #include "src/compiler.h" 7 #include "src/compiler.h"
8 #include "src/compiler/control-builders.h" 8 #include "src/compiler/control-builders.h"
9 #include "src/compiler/machine-operator.h" 9 #include "src/compiler/machine-operator.h"
10 #include "src/compiler/node-properties.h" 10 #include "src/compiler/node-properties.h"
11 #include "src/compiler/node-properties-inl.h" 11 #include "src/compiler/node-properties-inl.h"
12 #include "src/full-codegen.h" 12 #include "src/full-codegen.h"
13 #include "src/parser.h" 13 #include "src/parser.h"
14 #include "src/scopes.h" 14 #include "src/scopes.h"
15 15
16 namespace v8 { 16 namespace v8 {
17 namespace internal { 17 namespace internal {
18 namespace compiler { 18 namespace compiler {
19 19
20 AstGraphBuilder::AstGraphBuilder(CompilationInfo* info, JSGraph* jsgraph) 20 AstGraphBuilder::AstGraphBuilder(CompilationInfo* info, JSGraph* jsgraph)
21 : StructuredGraphBuilder(jsgraph->graph(), jsgraph->common()), 21 : StructuredGraphBuilder(jsgraph->graph(), jsgraph->common()),
22 info_(info), 22 info_(info),
23 vector_(handle(info->shared_info()->feedback_vector())),
23 jsgraph_(jsgraph), 24 jsgraph_(jsgraph),
24 globals_(0, info->zone()), 25 globals_(0, info->zone()),
25 breakable_(NULL), 26 breakable_(NULL),
26 execution_context_(NULL) { 27 execution_context_(NULL) {
27 InitializeAstVisitor(info->zone()); 28 InitializeAstVisitor(info->zone());
28 } 29 }
29 30
30 31
31 Node* AstGraphBuilder::GetFunctionClosure() { 32 Node* AstGraphBuilder::GetFunctionClosure() {
32 if (!function_closure_.is_set()) { 33 if (!function_closure_.is_set()) {
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 compare_if.Then(); 831 compare_if.Then();
831 Visit(expr->then_expression()); 832 Visit(expr->then_expression());
832 compare_if.Else(); 833 compare_if.Else();
833 Visit(expr->else_expression()); 834 Visit(expr->else_expression());
834 compare_if.End(); 835 compare_if.End();
835 ast_context()->ReplaceValue(); 836 ast_context()->ReplaceValue();
836 } 837 }
837 838
838 839
839 void AstGraphBuilder::VisitVariableProxy(VariableProxy* expr) { 840 void AstGraphBuilder::VisitVariableProxy(VariableProxy* expr) {
840 Node* value = BuildVariableLoad(expr->var(), expr->id()); 841 Node* value = BuildVariableLoad(expr, expr->id());
841 ast_context()->ProduceValue(value); 842 ast_context()->ProduceValue(value);
842 } 843 }
843 844
844 845
845 void AstGraphBuilder::VisitLiteral(Literal* expr) { 846 void AstGraphBuilder::VisitLiteral(Literal* expr) {
846 Node* value = jsgraph()->Constant(expr->value()); 847 Node* value = jsgraph()->Constant(expr->value());
847 ast_context()->ProduceValue(value); 848 ast_context()->ProduceValue(value);
848 } 849 }
849 850
850 851
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1084 break; 1085 break;
1085 } 1086 }
1086 } 1087 }
1087 1088
1088 // Evaluate the value and potentially handle compound assignments by loading 1089 // Evaluate the value and potentially handle compound assignments by loading
1089 // the left-hand side value and performing a binary operation. 1090 // the left-hand side value and performing a binary operation.
1090 if (expr->is_compound()) { 1091 if (expr->is_compound()) {
1091 Node* old_value = NULL; 1092 Node* old_value = NULL;
1092 switch (assign_type) { 1093 switch (assign_type) {
1093 case VARIABLE: { 1094 case VARIABLE: {
1094 Variable* variable = expr->target()->AsVariableProxy()->var(); 1095 VariableProxy* proxy = expr->target()->AsVariableProxy();
1095 old_value = BuildVariableLoad(variable, expr->target()->id()); 1096 old_value = BuildVariableLoad(proxy, expr->target()->id());
1096 break; 1097 break;
1097 } 1098 }
1098 case NAMED_PROPERTY: { 1099 case NAMED_PROPERTY: {
1099 Node* object = environment()->Top(); 1100 Node* object = environment()->Top();
1100 Unique<Name> name = 1101 Unique<Name> name =
1101 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); 1102 MakeUnique(property->key()->AsLiteral()->AsPropertyName());
1102 old_value = NewNode(javascript()->LoadNamed(name), object); 1103 int slot = property->PropertyFeedbackSlot();
1104 old_value = NewNode(
1105 javascript()->LoadNamed(name, LoadNamedFeedback(slot)), object);
1103 PrepareFrameState(old_value, property->LoadId(), 1106 PrepareFrameState(old_value, property->LoadId(),
1104 OutputFrameStateCombine::Push()); 1107 OutputFrameStateCombine::Push());
1105 break; 1108 break;
1106 } 1109 }
1107 case KEYED_PROPERTY: { 1110 case KEYED_PROPERTY: {
1108 Node* key = environment()->Top(); 1111 Node* key = environment()->Top();
1109 Node* object = environment()->Peek(1); 1112 Node* object = environment()->Peek(1);
1110 old_value = NewNode(javascript()->LoadProperty(), object, key); 1113 int slot = property->PropertyFeedbackSlot();
1114 old_value =
1115 NewNode(javascript()->LoadProperty(LoadPropertyFeedback(slot)),
1116 object, key);
1111 PrepareFrameState(old_value, property->LoadId(), 1117 PrepareFrameState(old_value, property->LoadId(),
1112 OutputFrameStateCombine::Push()); 1118 OutputFrameStateCombine::Push());
1113 break; 1119 break;
1114 } 1120 }
1115 } 1121 }
1116 environment()->Push(old_value); 1122 environment()->Push(old_value);
1117 VisitForValue(expr->value()); 1123 VisitForValue(expr->value());
1118 Node* right = environment()->Pop(); 1124 Node* right = environment()->Pop();
1119 Node* left = environment()->Pop(); 1125 Node* left = environment()->Pop();
1120 Node* value = BuildBinaryOp(left, right, expr->binary_op()); 1126 Node* value = BuildBinaryOp(left, right, expr->binary_op());
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1172 Node* exception = environment()->Pop(); 1178 Node* exception = environment()->Pop();
1173 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); 1179 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1);
1174 Node* value = NewNode(op, exception); 1180 Node* value = NewNode(op, exception);
1175 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); 1181 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
1176 ast_context()->ProduceValue(value); 1182 ast_context()->ProduceValue(value);
1177 } 1183 }
1178 1184
1179 1185
1180 void AstGraphBuilder::VisitProperty(Property* expr) { 1186 void AstGraphBuilder::VisitProperty(Property* expr) {
1181 Node* value; 1187 Node* value;
1188 int slot = expr->PropertyFeedbackSlot();
1182 if (expr->key()->IsPropertyName()) { 1189 if (expr->key()->IsPropertyName()) {
1183 VisitForValue(expr->obj()); 1190 VisitForValue(expr->obj());
1184 Node* object = environment()->Pop(); 1191 Node* object = environment()->Pop();
1185 Unique<Name> name = MakeUnique(expr->key()->AsLiteral()->AsPropertyName()); 1192 Unique<Name> name = MakeUnique(expr->key()->AsLiteral()->AsPropertyName());
1186 value = NewNode(javascript()->LoadNamed(name), object); 1193 value =
1194 NewNode(javascript()->LoadNamed(name, LoadNamedFeedback(slot)), object);
1187 } else { 1195 } else {
1188 VisitForValue(expr->obj()); 1196 VisitForValue(expr->obj());
1189 VisitForValue(expr->key()); 1197 VisitForValue(expr->key());
1190 Node* key = environment()->Pop(); 1198 Node* key = environment()->Pop();
1191 Node* object = environment()->Pop(); 1199 Node* object = environment()->Pop();
1192 value = NewNode(javascript()->LoadProperty(), object, key); 1200 value = NewNode(javascript()->LoadProperty(LoadPropertyFeedback(slot)),
1201 object, key);
1193 } 1202 }
1194 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); 1203 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
1195 ast_context()->ProduceValue(value); 1204 ast_context()->ProduceValue(value);
1196 } 1205 }
1197 1206
1198 1207
1199 void AstGraphBuilder::VisitCall(Call* expr) { 1208 void AstGraphBuilder::VisitCall(Call* expr) {
1200 Expression* callee = expr->expression(); 1209 Expression* callee = expr->expression();
1201 Call::CallType call_type = expr->GetCallType(isolate()); 1210 Call::CallType call_type = expr->GetCallType(isolate());
1202 1211
1203 // Prepare the callee and the receiver to the function call. This depends on 1212 // Prepare the callee and the receiver to the function call. This depends on
1204 // the semantics of the underlying call type. 1213 // the semantics of the underlying call type.
1205 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; 1214 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS;
1206 Node* receiver_value = NULL; 1215 Node* receiver_value = NULL;
1207 Node* callee_value = NULL; 1216 Node* callee_value = NULL;
1208 bool possibly_eval = false; 1217 bool possibly_eval = false;
1209 switch (call_type) { 1218 switch (call_type) {
1210 case Call::GLOBAL_CALL: { 1219 case Call::GLOBAL_CALL: {
1211 Variable* variable = callee->AsVariableProxy()->var(); 1220 VariableProxy* proxy = callee->AsVariableProxy();
1212 callee_value = BuildVariableLoad(variable, expr->expression()->id()); 1221 callee_value = BuildVariableLoad(proxy, expr->expression()->id());
1213 receiver_value = jsgraph()->UndefinedConstant(); 1222 receiver_value = jsgraph()->UndefinedConstant();
1214 break; 1223 break;
1215 } 1224 }
1216 case Call::LOOKUP_SLOT_CALL: { 1225 case Call::LOOKUP_SLOT_CALL: {
1217 Variable* variable = callee->AsVariableProxy()->var(); 1226 Variable* variable = callee->AsVariableProxy()->var();
1218 DCHECK(variable->location() == Variable::LOOKUP); 1227 DCHECK(variable->location() == Variable::LOOKUP);
1219 Node* name = jsgraph()->Constant(variable->name()); 1228 Node* name = jsgraph()->Constant(variable->name());
1220 const Operator* op = 1229 const Operator* op =
1221 javascript()->CallRuntime(Runtime::kLoadLookupSlot, 2); 1230 javascript()->CallRuntime(Runtime::kLoadLookupSlot, 2);
1222 Node* pair = NewNode(op, current_context(), name); 1231 Node* pair = NewNode(op, current_context(), name);
1223 callee_value = NewNode(common()->Projection(0), pair); 1232 callee_value = NewNode(common()->Projection(0), pair);
1224 receiver_value = NewNode(common()->Projection(1), pair); 1233 receiver_value = NewNode(common()->Projection(1), pair);
1225 1234
1226 PrepareFrameState(pair, expr->EvalOrLookupId(), 1235 PrepareFrameState(pair, expr->EvalOrLookupId(),
1227 OutputFrameStateCombine::Push()); 1236 OutputFrameStateCombine::Push());
1228 break; 1237 break;
1229 } 1238 }
1230 case Call::PROPERTY_CALL: { 1239 case Call::PROPERTY_CALL: {
1231 Property* property = callee->AsProperty(); 1240 Property* property = callee->AsProperty();
1232 VisitForValue(property->obj()); 1241 VisitForValue(property->obj());
1233 Node* object = environment()->Top(); 1242 Node* object = environment()->Top();
1243 int slot = property->PropertyFeedbackSlot();
1234 if (property->key()->IsPropertyName()) { 1244 if (property->key()->IsPropertyName()) {
1235 Unique<Name> name = 1245 Unique<Name> name =
1236 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); 1246 MakeUnique(property->key()->AsLiteral()->AsPropertyName());
1237 callee_value = NewNode(javascript()->LoadNamed(name), object); 1247 callee_value = NewNode(
1248 javascript()->LoadNamed(name, LoadNamedFeedback(slot)), object);
1238 } else { 1249 } else {
1239 VisitForValue(property->key()); 1250 VisitForValue(property->key());
1240 Node* key = environment()->Pop(); 1251 Node* key = environment()->Pop();
1241 callee_value = NewNode(javascript()->LoadProperty(), object, key); 1252 callee_value =
1253 NewNode(javascript()->LoadProperty(LoadPropertyFeedback(slot)),
1254 object, key);
1242 } 1255 }
1243 PrepareFrameState(callee_value, property->LoadId(), 1256 PrepareFrameState(callee_value, property->LoadId(),
1244 OutputFrameStateCombine::Push()); 1257 OutputFrameStateCombine::Push());
1245 receiver_value = environment()->Pop(); 1258 receiver_value = environment()->Pop();
1246 // Note that a PROPERTY_CALL requires the receiver to be wrapped into an 1259 // Note that a PROPERTY_CALL requires the receiver to be wrapped into an
1247 // object for sloppy callees. This could also be modeled explicitly here, 1260 // object for sloppy callees. This could also be modeled explicitly here,
1248 // thereby obsoleting the need for a flag to the call operator. 1261 // thereby obsoleting the need for a flag to the call operator.
1249 flags = CALL_AS_METHOD; 1262 flags = CALL_AS_METHOD;
1250 break; 1263 break;
1251 } 1264 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 1332
1320 1333
1321 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { 1334 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) {
1322 Handle<String> name = expr->name(); 1335 Handle<String> name = expr->name();
1323 1336
1324 // The callee and the receiver both have to be pushed onto the operand stack 1337 // The callee and the receiver both have to be pushed onto the operand stack
1325 // before arguments are being evaluated. 1338 // before arguments are being evaluated.
1326 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; 1339 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS;
1327 Node* receiver_value = BuildLoadBuiltinsObject(); 1340 Node* receiver_value = BuildLoadBuiltinsObject();
1328 Unique<String> unique = MakeUnique(name); 1341 Unique<String> unique = MakeUnique(name);
1329 Node* callee_value = NewNode(javascript()->LoadNamed(unique), receiver_value); 1342 int slot = expr->CallRuntimeFeedbackSlot();
1343 Node* callee_value = NewNode(
1344 javascript()->LoadNamed(unique, LoadNamedFeedback(slot)), receiver_value);
1330 // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft 1345 // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft
1331 // refuses to optimize functions with jsruntime calls). 1346 // refuses to optimize functions with jsruntime calls).
1332 PrepareFrameState(callee_value, BailoutId::None(), 1347 PrepareFrameState(callee_value, BailoutId::None(),
1333 OutputFrameStateCombine::Push()); 1348 OutputFrameStateCombine::Push());
1334 environment()->Push(callee_value); 1349 environment()->Push(callee_value);
1335 environment()->Push(receiver_value); 1350 environment()->Push(receiver_value);
1336 1351
1337 // Evaluate all arguments to the JS runtime call. 1352 // Evaluate all arguments to the JS runtime call.
1338 ZoneList<Expression*>* args = expr->arguments(); 1353 ZoneList<Expression*>* args = expr->arguments();
1339 VisitForValues(args); 1354 VisitForValues(args);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1394 1409
1395 // Reserve space for result of postfix operation. 1410 // Reserve space for result of postfix operation.
1396 bool is_postfix = expr->is_postfix() && !ast_context()->IsEffect(); 1411 bool is_postfix = expr->is_postfix() && !ast_context()->IsEffect();
1397 if (is_postfix) environment()->Push(jsgraph()->UndefinedConstant()); 1412 if (is_postfix) environment()->Push(jsgraph()->UndefinedConstant());
1398 1413
1399 // Evaluate LHS expression and get old value. 1414 // Evaluate LHS expression and get old value.
1400 Node* old_value = NULL; 1415 Node* old_value = NULL;
1401 int stack_depth = -1; 1416 int stack_depth = -1;
1402 switch (assign_type) { 1417 switch (assign_type) {
1403 case VARIABLE: { 1418 case VARIABLE: {
1404 Variable* variable = expr->expression()->AsVariableProxy()->var(); 1419 VariableProxy* proxy = expr->expression()->AsVariableProxy();
1405 old_value = BuildVariableLoad(variable, expr->expression()->id()); 1420 old_value = BuildVariableLoad(proxy, expr->expression()->id());
1406 stack_depth = 0; 1421 stack_depth = 0;
1407 break; 1422 break;
1408 } 1423 }
1409 case NAMED_PROPERTY: { 1424 case NAMED_PROPERTY: {
1410 VisitForValue(property->obj()); 1425 VisitForValue(property->obj());
1411 Node* object = environment()->Top(); 1426 Node* object = environment()->Top();
1412 Unique<Name> name = 1427 Unique<Name> name =
1413 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); 1428 MakeUnique(property->key()->AsLiteral()->AsPropertyName());
1414 old_value = NewNode(javascript()->LoadNamed(name), object); 1429 int slot = property->PropertyFeedbackSlot();
1430 old_value = NewNode(
1431 javascript()->LoadNamed(name, LoadNamedFeedback(slot)), object);
1415 PrepareFrameState(old_value, property->LoadId(), 1432 PrepareFrameState(old_value, property->LoadId(),
1416 OutputFrameStateCombine::Push()); 1433 OutputFrameStateCombine::Push());
1417 stack_depth = 1; 1434 stack_depth = 1;
1418 break; 1435 break;
1419 } 1436 }
1420 case KEYED_PROPERTY: { 1437 case KEYED_PROPERTY: {
1421 VisitForValue(property->obj()); 1438 VisitForValue(property->obj());
1422 VisitForValue(property->key()); 1439 VisitForValue(property->key());
1423 Node* key = environment()->Top(); 1440 Node* key = environment()->Top();
1424 Node* object = environment()->Peek(1); 1441 Node* object = environment()->Peek(1);
1425 old_value = NewNode(javascript()->LoadProperty(), object, key); 1442 int slot = property->PropertyFeedbackSlot();
1443 old_value = NewNode(
1444 javascript()->LoadProperty(LoadPropertyFeedback(slot)), object, key);
1426 PrepareFrameState(old_value, property->LoadId(), 1445 PrepareFrameState(old_value, property->LoadId(),
1427 OutputFrameStateCombine::Push()); 1446 OutputFrameStateCombine::Push());
1428 stack_depth = 2; 1447 stack_depth = 2;
1429 break; 1448 break;
1430 } 1449 }
1431 } 1450 }
1432 1451
1433 // Convert old value into a number. 1452 // Convert old value into a number.
1434 old_value = NewNode(javascript()->ToNumber(), old_value); 1453 old_value = NewNode(javascript()->ToNumber(), old_value);
1435 1454
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1625 Node* value = jsgraph()->UndefinedConstant(); 1644 Node* value = jsgraph()->UndefinedConstant();
1626 ast_context()->ProduceValue(value); 1645 ast_context()->ProduceValue(value);
1627 } 1646 }
1628 1647
1629 1648
1630 void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) { 1649 void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) {
1631 Node* operand; 1650 Node* operand;
1632 if (expr->expression()->IsVariableProxy()) { 1651 if (expr->expression()->IsVariableProxy()) {
1633 // Typeof does not throw a reference error on global variables, hence we 1652 // Typeof does not throw a reference error on global variables, hence we
1634 // perform a non-contextual load in case the operand is a variable proxy. 1653 // perform a non-contextual load in case the operand is a variable proxy.
1635 Variable* variable = expr->expression()->AsVariableProxy()->var(); 1654 VariableProxy* proxy = expr->expression()->AsVariableProxy();
1636 operand = 1655 operand =
1637 BuildVariableLoad(variable, expr->expression()->id(), NOT_CONTEXTUAL); 1656 BuildVariableLoad(proxy, expr->expression()->id(), NOT_CONTEXTUAL);
1638 } else { 1657 } else {
1639 VisitForValue(expr->expression()); 1658 VisitForValue(expr->expression());
1640 operand = environment()->Pop(); 1659 operand = environment()->Pop();
1641 } 1660 }
1642 Node* value = NewNode(javascript()->TypeOf(), operand); 1661 Node* value = NewNode(javascript()->TypeOf(), operand);
1643 ast_context()->ProduceValue(value); 1662 ast_context()->ProduceValue(value);
1644 } 1663 }
1645 1664
1646 1665
1647 void AstGraphBuilder::VisitNot(UnaryOperation* expr) { 1666 void AstGraphBuilder::VisitNot(UnaryOperation* expr) {
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1770 hole_check.If(check); 1789 hole_check.If(check);
1771 hole_check.Then(); 1790 hole_check.Then();
1772 environment()->Push(BuildThrowReferenceError(variable, bailout_id)); 1791 environment()->Push(BuildThrowReferenceError(variable, bailout_id));
1773 hole_check.Else(); 1792 hole_check.Else();
1774 environment()->Push(not_hole); 1793 environment()->Push(not_hole);
1775 hole_check.End(); 1794 hole_check.End();
1776 return environment()->Pop(); 1795 return environment()->Pop();
1777 } 1796 }
1778 1797
1779 1798
1780 Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, 1799 Node* AstGraphBuilder::BuildVariableLoad(VariableProxy* proxy,
1781 BailoutId bailout_id, 1800 BailoutId bailout_id,
1782 ContextualMode contextual_mode) { 1801 ContextualMode contextual_mode) {
1802 Variable* variable = proxy->var();
1803 int slot = proxy->VariableFeedbackSlot();
1783 Node* the_hole = jsgraph()->TheHoleConstant(); 1804 Node* the_hole = jsgraph()->TheHoleConstant();
1784 VariableMode mode = variable->mode(); 1805 VariableMode mode = variable->mode();
1785 switch (variable->location()) { 1806 switch (variable->location()) {
1786 case Variable::UNALLOCATED: { 1807 case Variable::UNALLOCATED: {
1787 // Global var, const, or let variable. 1808 // Global var, const, or let variable.
1788 Node* global = BuildLoadGlobalObject(); 1809 Node* global = BuildLoadGlobalObject();
1789 Unique<Name> name = MakeUnique(variable->name()); 1810 Unique<Name> name = MakeUnique(variable->name());
1790 const Operator* op = javascript()->LoadNamed(name, contextual_mode); 1811 const Operator* op = javascript()->LoadNamed(
1812 name, LoadNamedFeedback(slot), contextual_mode);
1791 Node* node = NewNode(op, global); 1813 Node* node = NewNode(op, global);
1792 PrepareFrameState(node, bailout_id, OutputFrameStateCombine::Push()); 1814 PrepareFrameState(node, bailout_id, OutputFrameStateCombine::Push());
1793 return node; 1815 return node;
1794 } 1816 }
1795 case Variable::PARAMETER: 1817 case Variable::PARAMETER:
1796 case Variable::LOCAL: { 1818 case Variable::LOCAL: {
1797 // Local var, const, or let variable. 1819 // Local var, const, or let variable.
1798 Node* value = environment()->Lookup(variable); 1820 Node* value = environment()->Lookup(variable);
1799 if (mode == CONST_LEGACY) { 1821 if (mode == CONST_LEGACY) {
1800 // Perform check for uninitialized legacy const variables. 1822 // Perform check for uninitialized legacy const variables.
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
2082 DCHECK(NodeProperties::GetFrameStateInput(node)->opcode() == 2104 DCHECK(NodeProperties::GetFrameStateInput(node)->opcode() ==
2083 IrOpcode::kDead); 2105 IrOpcode::kDead);
2084 NodeProperties::ReplaceFrameStateInput( 2106 NodeProperties::ReplaceFrameStateInput(
2085 node, environment()->Checkpoint(ast_id, combine)); 2107 node, environment()->Checkpoint(ast_id, combine));
2086 } 2108 }
2087 } 2109 }
2088 2110
2089 } 2111 }
2090 } 2112 }
2091 } // namespace v8::internal::compiler 2113 } // namespace v8::internal::compiler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698