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

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: Ports. 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
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | src/compiler/js-generic-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/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"
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 compare_if.Then(); 830 compare_if.Then();
831 Visit(expr->then_expression()); 831 Visit(expr->then_expression());
832 compare_if.Else(); 832 compare_if.Else();
833 Visit(expr->else_expression()); 833 Visit(expr->else_expression());
834 compare_if.End(); 834 compare_if.End();
835 ast_context()->ReplaceValue(); 835 ast_context()->ReplaceValue();
836 } 836 }
837 837
838 838
839 void AstGraphBuilder::VisitVariableProxy(VariableProxy* expr) { 839 void AstGraphBuilder::VisitVariableProxy(VariableProxy* expr) {
840 Node* value = BuildVariableLoad(expr->var(), expr->id()); 840 VectorSlotPair pair = CreateVectorSlotPair(expr->VariableFeedbackSlot());
841 Node* value = BuildVariableLoad(expr->var(), expr->id(), pair);
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 VectorSlotPair pair =
1097 CreateVectorSlotPair(proxy->VariableFeedbackSlot());
1098 old_value = BuildVariableLoad(proxy->var(), expr->target()->id(), pair);
1096 break; 1099 break;
1097 } 1100 }
1098 case NAMED_PROPERTY: { 1101 case NAMED_PROPERTY: {
1099 Node* object = environment()->Top(); 1102 Node* object = environment()->Top();
1100 Unique<Name> name = 1103 Unique<Name> name =
1101 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); 1104 MakeUnique(property->key()->AsLiteral()->AsPropertyName());
1102 old_value = NewNode(javascript()->LoadNamed(name), object); 1105 int slot = property->PropertyFeedbackSlot();
Michael Starzinger 2014/10/10 09:09:58 nit: Instead of randomly pulling either "slot" or
mvstanton 2014/10/10 09:31:15 Good idea, done.
1106 old_value = NewNode(
1107 javascript()->LoadNamed(name, CreateVectorSlotPair(slot)), object);
1103 PrepareFrameState(old_value, property->LoadId(), 1108 PrepareFrameState(old_value, property->LoadId(),
1104 OutputFrameStateCombine::Push()); 1109 OutputFrameStateCombine::Push());
1105 break; 1110 break;
1106 } 1111 }
1107 case KEYED_PROPERTY: { 1112 case KEYED_PROPERTY: {
1108 Node* key = environment()->Top(); 1113 Node* key = environment()->Top();
1109 Node* object = environment()->Peek(1); 1114 Node* object = environment()->Peek(1);
1110 old_value = NewNode(javascript()->LoadProperty(), object, key); 1115 int slot = property->PropertyFeedbackSlot();
1116 old_value =
1117 NewNode(javascript()->LoadProperty(CreateVectorSlotPair(slot)),
1118 object, key);
1111 PrepareFrameState(old_value, property->LoadId(), 1119 PrepareFrameState(old_value, property->LoadId(),
1112 OutputFrameStateCombine::Push()); 1120 OutputFrameStateCombine::Push());
1113 break; 1121 break;
1114 } 1122 }
1115 } 1123 }
1116 environment()->Push(old_value); 1124 environment()->Push(old_value);
1117 VisitForValue(expr->value()); 1125 VisitForValue(expr->value());
1118 Node* right = environment()->Pop(); 1126 Node* right = environment()->Pop();
1119 Node* left = environment()->Pop(); 1127 Node* left = environment()->Pop();
1120 Node* value = BuildBinaryOp(left, right, expr->binary_op()); 1128 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(); 1180 Node* exception = environment()->Pop();
1173 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); 1181 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1);
1174 Node* value = NewNode(op, exception); 1182 Node* value = NewNode(op, exception);
1175 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); 1183 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
1176 ast_context()->ProduceValue(value); 1184 ast_context()->ProduceValue(value);
1177 } 1185 }
1178 1186
1179 1187
1180 void AstGraphBuilder::VisitProperty(Property* expr) { 1188 void AstGraphBuilder::VisitProperty(Property* expr) {
1181 Node* value; 1189 Node* value;
1190 int slot = expr->PropertyFeedbackSlot();
1182 if (expr->key()->IsPropertyName()) { 1191 if (expr->key()->IsPropertyName()) {
1183 VisitForValue(expr->obj()); 1192 VisitForValue(expr->obj());
1184 Node* object = environment()->Pop(); 1193 Node* object = environment()->Pop();
1185 Unique<Name> name = MakeUnique(expr->key()->AsLiteral()->AsPropertyName()); 1194 Unique<Name> name = MakeUnique(expr->key()->AsLiteral()->AsPropertyName());
1186 value = NewNode(javascript()->LoadNamed(name), object); 1195 value = NewNode(javascript()->LoadNamed(name, CreateVectorSlotPair(slot)),
1196 object);
1187 } else { 1197 } else {
1188 VisitForValue(expr->obj()); 1198 VisitForValue(expr->obj());
1189 VisitForValue(expr->key()); 1199 VisitForValue(expr->key());
1190 Node* key = environment()->Pop(); 1200 Node* key = environment()->Pop();
1191 Node* object = environment()->Pop(); 1201 Node* object = environment()->Pop();
1192 value = NewNode(javascript()->LoadProperty(), object, key); 1202 value = NewNode(javascript()->LoadProperty(CreateVectorSlotPair(slot)),
1203 object, key);
1193 } 1204 }
1194 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); 1205 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
1195 ast_context()->ProduceValue(value); 1206 ast_context()->ProduceValue(value);
1196 } 1207 }
1197 1208
1198 1209
1199 void AstGraphBuilder::VisitCall(Call* expr) { 1210 void AstGraphBuilder::VisitCall(Call* expr) {
1200 Expression* callee = expr->expression(); 1211 Expression* callee = expr->expression();
1201 Call::CallType call_type = expr->GetCallType(isolate()); 1212 Call::CallType call_type = expr->GetCallType(isolate());
1202 1213
1203 // Prepare the callee and the receiver to the function call. This depends on 1214 // Prepare the callee and the receiver to the function call. This depends on
1204 // the semantics of the underlying call type. 1215 // the semantics of the underlying call type.
1205 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; 1216 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS;
1206 Node* receiver_value = NULL; 1217 Node* receiver_value = NULL;
1207 Node* callee_value = NULL; 1218 Node* callee_value = NULL;
1208 bool possibly_eval = false; 1219 bool possibly_eval = false;
1209 switch (call_type) { 1220 switch (call_type) {
1210 case Call::GLOBAL_CALL: { 1221 case Call::GLOBAL_CALL: {
1211 Variable* variable = callee->AsVariableProxy()->var(); 1222 VariableProxy* proxy = callee->AsVariableProxy();
1212 callee_value = BuildVariableLoad(variable, expr->expression()->id()); 1223 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot());
1224 callee_value =
1225 BuildVariableLoad(proxy->var(), expr->expression()->id(), pair);
1213 receiver_value = jsgraph()->UndefinedConstant(); 1226 receiver_value = jsgraph()->UndefinedConstant();
1214 break; 1227 break;
1215 } 1228 }
1216 case Call::LOOKUP_SLOT_CALL: { 1229 case Call::LOOKUP_SLOT_CALL: {
1217 Variable* variable = callee->AsVariableProxy()->var(); 1230 Variable* variable = callee->AsVariableProxy()->var();
1218 DCHECK(variable->location() == Variable::LOOKUP); 1231 DCHECK(variable->location() == Variable::LOOKUP);
1219 Node* name = jsgraph()->Constant(variable->name()); 1232 Node* name = jsgraph()->Constant(variable->name());
1220 const Operator* op = 1233 const Operator* op =
1221 javascript()->CallRuntime(Runtime::kLoadLookupSlot, 2); 1234 javascript()->CallRuntime(Runtime::kLoadLookupSlot, 2);
1222 Node* pair = NewNode(op, current_context(), name); 1235 Node* pair = NewNode(op, current_context(), name);
1223 callee_value = NewNode(common()->Projection(0), pair); 1236 callee_value = NewNode(common()->Projection(0), pair);
1224 receiver_value = NewNode(common()->Projection(1), pair); 1237 receiver_value = NewNode(common()->Projection(1), pair);
1225 1238
1226 PrepareFrameState(pair, expr->EvalOrLookupId(), 1239 PrepareFrameState(pair, expr->EvalOrLookupId(),
1227 OutputFrameStateCombine::Push()); 1240 OutputFrameStateCombine::Push());
1228 break; 1241 break;
1229 } 1242 }
1230 case Call::PROPERTY_CALL: { 1243 case Call::PROPERTY_CALL: {
1231 Property* property = callee->AsProperty(); 1244 Property* property = callee->AsProperty();
1232 VisitForValue(property->obj()); 1245 VisitForValue(property->obj());
1233 Node* object = environment()->Top(); 1246 Node* object = environment()->Top();
1247 int slot = property->PropertyFeedbackSlot();
1234 if (property->key()->IsPropertyName()) { 1248 if (property->key()->IsPropertyName()) {
1235 Unique<Name> name = 1249 Unique<Name> name =
1236 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); 1250 MakeUnique(property->key()->AsLiteral()->AsPropertyName());
1237 callee_value = NewNode(javascript()->LoadNamed(name), object); 1251 callee_value = NewNode(
1252 javascript()->LoadNamed(name, CreateVectorSlotPair(slot)), object);
1238 } else { 1253 } else {
1239 VisitForValue(property->key()); 1254 VisitForValue(property->key());
1240 Node* key = environment()->Pop(); 1255 Node* key = environment()->Pop();
1241 callee_value = NewNode(javascript()->LoadProperty(), object, key); 1256 callee_value =
1257 NewNode(javascript()->LoadProperty(CreateVectorSlotPair(slot)),
1258 object, key);
1242 } 1259 }
1243 PrepareFrameState(callee_value, property->LoadId(), 1260 PrepareFrameState(callee_value, property->LoadId(),
1244 OutputFrameStateCombine::Push()); 1261 OutputFrameStateCombine::Push());
1245 receiver_value = environment()->Pop(); 1262 receiver_value = environment()->Pop();
1246 // Note that a PROPERTY_CALL requires the receiver to be wrapped into an 1263 // 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, 1264 // object for sloppy callees. This could also be modeled explicitly here,
1248 // thereby obsoleting the need for a flag to the call operator. 1265 // thereby obsoleting the need for a flag to the call operator.
1249 flags = CALL_AS_METHOD; 1266 flags = CALL_AS_METHOD;
1250 break; 1267 break;
1251 } 1268 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 1336
1320 1337
1321 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { 1338 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) {
1322 Handle<String> name = expr->name(); 1339 Handle<String> name = expr->name();
1323 1340
1324 // The callee and the receiver both have to be pushed onto the operand stack 1341 // The callee and the receiver both have to be pushed onto the operand stack
1325 // before arguments are being evaluated. 1342 // before arguments are being evaluated.
1326 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; 1343 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS;
1327 Node* receiver_value = BuildLoadBuiltinsObject(); 1344 Node* receiver_value = BuildLoadBuiltinsObject();
1328 Unique<String> unique = MakeUnique(name); 1345 Unique<String> unique = MakeUnique(name);
1329 Node* callee_value = NewNode(javascript()->LoadNamed(unique), receiver_value); 1346 int slot = expr->CallRuntimeFeedbackSlot();
1347 Node* callee_value =
1348 NewNode(javascript()->LoadNamed(unique, CreateVectorSlotPair(slot)),
1349 receiver_value);
1330 // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft 1350 // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft
1331 // refuses to optimize functions with jsruntime calls). 1351 // refuses to optimize functions with jsruntime calls).
1332 PrepareFrameState(callee_value, BailoutId::None(), 1352 PrepareFrameState(callee_value, BailoutId::None(),
1333 OutputFrameStateCombine::Push()); 1353 OutputFrameStateCombine::Push());
1334 environment()->Push(callee_value); 1354 environment()->Push(callee_value);
1335 environment()->Push(receiver_value); 1355 environment()->Push(receiver_value);
1336 1356
1337 // Evaluate all arguments to the JS runtime call. 1357 // Evaluate all arguments to the JS runtime call.
1338 ZoneList<Expression*>* args = expr->arguments(); 1358 ZoneList<Expression*>* args = expr->arguments();
1339 VisitForValues(args); 1359 VisitForValues(args);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1394 1414
1395 // Reserve space for result of postfix operation. 1415 // Reserve space for result of postfix operation.
1396 bool is_postfix = expr->is_postfix() && !ast_context()->IsEffect(); 1416 bool is_postfix = expr->is_postfix() && !ast_context()->IsEffect();
1397 if (is_postfix) environment()->Push(jsgraph()->UndefinedConstant()); 1417 if (is_postfix) environment()->Push(jsgraph()->UndefinedConstant());
1398 1418
1399 // Evaluate LHS expression and get old value. 1419 // Evaluate LHS expression and get old value.
1400 Node* old_value = NULL; 1420 Node* old_value = NULL;
1401 int stack_depth = -1; 1421 int stack_depth = -1;
1402 switch (assign_type) { 1422 switch (assign_type) {
1403 case VARIABLE: { 1423 case VARIABLE: {
1404 Variable* variable = expr->expression()->AsVariableProxy()->var(); 1424 VariableProxy* proxy = expr->expression()->AsVariableProxy();
1405 old_value = BuildVariableLoad(variable, expr->expression()->id()); 1425 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot());
1426 old_value =
1427 BuildVariableLoad(proxy->var(), expr->expression()->id(), pair);
1406 stack_depth = 0; 1428 stack_depth = 0;
1407 break; 1429 break;
1408 } 1430 }
1409 case NAMED_PROPERTY: { 1431 case NAMED_PROPERTY: {
1410 VisitForValue(property->obj()); 1432 VisitForValue(property->obj());
1411 Node* object = environment()->Top(); 1433 Node* object = environment()->Top();
1412 Unique<Name> name = 1434 Unique<Name> name =
1413 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); 1435 MakeUnique(property->key()->AsLiteral()->AsPropertyName());
1414 old_value = NewNode(javascript()->LoadNamed(name), object); 1436 int slot = property->PropertyFeedbackSlot();
1437 old_value = NewNode(
1438 javascript()->LoadNamed(name, CreateVectorSlotPair(slot)), object);
1415 PrepareFrameState(old_value, property->LoadId(), 1439 PrepareFrameState(old_value, property->LoadId(),
1416 OutputFrameStateCombine::Push()); 1440 OutputFrameStateCombine::Push());
1417 stack_depth = 1; 1441 stack_depth = 1;
1418 break; 1442 break;
1419 } 1443 }
1420 case KEYED_PROPERTY: { 1444 case KEYED_PROPERTY: {
1421 VisitForValue(property->obj()); 1445 VisitForValue(property->obj());
1422 VisitForValue(property->key()); 1446 VisitForValue(property->key());
1423 Node* key = environment()->Top(); 1447 Node* key = environment()->Top();
1424 Node* object = environment()->Peek(1); 1448 Node* object = environment()->Peek(1);
1425 old_value = NewNode(javascript()->LoadProperty(), object, key); 1449 int slot = property->PropertyFeedbackSlot();
1450 old_value = NewNode(
1451 javascript()->LoadProperty(CreateVectorSlotPair(slot)), object, key);
1426 PrepareFrameState(old_value, property->LoadId(), 1452 PrepareFrameState(old_value, property->LoadId(),
1427 OutputFrameStateCombine::Push()); 1453 OutputFrameStateCombine::Push());
1428 stack_depth = 2; 1454 stack_depth = 2;
1429 break; 1455 break;
1430 } 1456 }
1431 } 1457 }
1432 1458
1433 // Convert old value into a number. 1459 // Convert old value into a number.
1434 old_value = NewNode(javascript()->ToNumber(), old_value); 1460 old_value = NewNode(javascript()->ToNumber(), old_value);
1435 1461
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1625 Node* value = jsgraph()->UndefinedConstant(); 1651 Node* value = jsgraph()->UndefinedConstant();
1626 ast_context()->ProduceValue(value); 1652 ast_context()->ProduceValue(value);
1627 } 1653 }
1628 1654
1629 1655
1630 void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) { 1656 void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) {
1631 Node* operand; 1657 Node* operand;
1632 if (expr->expression()->IsVariableProxy()) { 1658 if (expr->expression()->IsVariableProxy()) {
1633 // Typeof does not throw a reference error on global variables, hence we 1659 // 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. 1660 // perform a non-contextual load in case the operand is a variable proxy.
1635 Variable* variable = expr->expression()->AsVariableProxy()->var(); 1661 VariableProxy* proxy = expr->expression()->AsVariableProxy();
1636 operand = 1662 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot());
1637 BuildVariableLoad(variable, expr->expression()->id(), NOT_CONTEXTUAL); 1663 operand = BuildVariableLoad(proxy->var(), expr->expression()->id(), pair,
1664 NOT_CONTEXTUAL);
1638 } else { 1665 } else {
1639 VisitForValue(expr->expression()); 1666 VisitForValue(expr->expression());
1640 operand = environment()->Pop(); 1667 operand = environment()->Pop();
1641 } 1668 }
1642 Node* value = NewNode(javascript()->TypeOf(), operand); 1669 Node* value = NewNode(javascript()->TypeOf(), operand);
1643 ast_context()->ProduceValue(value); 1670 ast_context()->ProduceValue(value);
1644 } 1671 }
1645 1672
1646 1673
1647 void AstGraphBuilder::VisitNot(UnaryOperation* expr) { 1674 void AstGraphBuilder::VisitNot(UnaryOperation* expr) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1683 compare_if.End(); 1710 compare_if.End();
1684 ast_context()->ReplaceValue(); 1711 ast_context()->ReplaceValue();
1685 } 1712 }
1686 1713
1687 1714
1688 StrictMode AstGraphBuilder::strict_mode() const { 1715 StrictMode AstGraphBuilder::strict_mode() const {
1689 return info()->strict_mode(); 1716 return info()->strict_mode();
1690 } 1717 }
1691 1718
1692 1719
1720 VectorSlotPair AstGraphBuilder::CreateVectorSlotPair(int slot) const {
1721 return VectorSlotPair(handle(info()->shared_info()->feedback_vector()), slot);
1722 }
1723
1724
1693 Node* AstGraphBuilder::ProcessArguments(const Operator* op, int arity) { 1725 Node* AstGraphBuilder::ProcessArguments(const Operator* op, int arity) {
1694 DCHECK(environment()->stack_height() >= arity); 1726 DCHECK(environment()->stack_height() >= arity);
1695 Node** all = info()->zone()->NewArray<Node*>(arity); 1727 Node** all = info()->zone()->NewArray<Node*>(arity);
1696 for (int i = arity - 1; i >= 0; --i) { 1728 for (int i = arity - 1; i >= 0; --i) {
1697 all[i] = environment()->Pop(); 1729 all[i] = environment()->Pop();
1698 } 1730 }
1699 Node* value = NewNode(op, arity, all); 1731 Node* value = NewNode(op, arity, all);
1700 return value; 1732 return value;
1701 } 1733 }
1702 1734
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1772 environment()->Push(BuildThrowReferenceError(variable, bailout_id)); 1804 environment()->Push(BuildThrowReferenceError(variable, bailout_id));
1773 hole_check.Else(); 1805 hole_check.Else();
1774 environment()->Push(not_hole); 1806 environment()->Push(not_hole);
1775 hole_check.End(); 1807 hole_check.End();
1776 return environment()->Pop(); 1808 return environment()->Pop();
1777 } 1809 }
1778 1810
1779 1811
1780 Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, 1812 Node* AstGraphBuilder::BuildVariableLoad(Variable* variable,
1781 BailoutId bailout_id, 1813 BailoutId bailout_id,
1814 const VectorSlotPair& feedback,
1782 ContextualMode contextual_mode) { 1815 ContextualMode contextual_mode) {
1783 Node* the_hole = jsgraph()->TheHoleConstant(); 1816 Node* the_hole = jsgraph()->TheHoleConstant();
1784 VariableMode mode = variable->mode(); 1817 VariableMode mode = variable->mode();
1785 switch (variable->location()) { 1818 switch (variable->location()) {
1786 case Variable::UNALLOCATED: { 1819 case Variable::UNALLOCATED: {
1787 // Global var, const, or let variable. 1820 // Global var, const, or let variable.
1788 Node* global = BuildLoadGlobalObject(); 1821 Node* global = BuildLoadGlobalObject();
1789 Unique<Name> name = MakeUnique(variable->name()); 1822 Unique<Name> name = MakeUnique(variable->name());
1790 const Operator* op = javascript()->LoadNamed(name, contextual_mode); 1823 const Operator* op =
1824 javascript()->LoadNamed(name, feedback, contextual_mode);
1791 Node* node = NewNode(op, global); 1825 Node* node = NewNode(op, global);
1792 PrepareFrameState(node, bailout_id, OutputFrameStateCombine::Push()); 1826 PrepareFrameState(node, bailout_id, OutputFrameStateCombine::Push());
1793 return node; 1827 return node;
1794 } 1828 }
1795 case Variable::PARAMETER: 1829 case Variable::PARAMETER:
1796 case Variable::LOCAL: { 1830 case Variable::LOCAL: {
1797 // Local var, const, or let variable. 1831 // Local var, const, or let variable.
1798 Node* value = environment()->Lookup(variable); 1832 Node* value = environment()->Lookup(variable);
1799 if (mode == CONST_LEGACY) { 1833 if (mode == CONST_LEGACY) {
1800 // Perform check for uninitialized legacy const variables. 1834 // 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() == 2116 DCHECK(NodeProperties::GetFrameStateInput(node)->opcode() ==
2083 IrOpcode::kDead); 2117 IrOpcode::kDead);
2084 NodeProperties::ReplaceFrameStateInput( 2118 NodeProperties::ReplaceFrameStateInput(
2085 node, environment()->Checkpoint(ast_id, combine)); 2119 node, environment()->Checkpoint(ast_id, combine));
2086 } 2120 }
2087 } 2121 }
2088 2122
2089 } 2123 }
2090 } 2124 }
2091 } // namespace v8::internal::compiler 2125 } // namespace v8::internal::compiler
OLDNEW
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | src/compiler/js-generic-lowering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698