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

Side by Side Diff: src/compiler/typer.cc

Issue 874983002: [turbofan] Handle cyclic dependencies in context typing. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 11 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 | « no previous file | test/mjsunit/compiler/regress-451012.js » ('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/bootstrapper.h" 5 #include "src/bootstrapper.h"
6 #include "src/compiler/graph-inl.h" 6 #include "src/compiler/graph-inl.h"
7 #include "src/compiler/graph-reducer.h" 7 #include "src/compiler/graph-reducer.h"
8 #include "src/compiler/js-operator.h" 8 #include "src/compiler/js-operator.h"
9 #include "src/compiler/node.h" 9 #include "src/compiler/node.h"
10 #include "src/compiler/node-properties-inl.h" 10 #include "src/compiler/node-properties-inl.h"
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 Bounds BoundsOrNone(Node* node) { 309 Bounds BoundsOrNone(Node* node) {
310 return NodeProperties::IsTyped(node) ? NodeProperties::GetBounds(node) 310 return NodeProperties::IsTyped(node) ? NodeProperties::GetBounds(node)
311 : Bounds(Type::None()); 311 : Bounds(Type::None());
312 } 312 }
313 313
314 Bounds Operand(Node* node, int i) { 314 Bounds Operand(Node* node, int i) {
315 Node* operand_node = NodeProperties::GetValueInput(node, i); 315 Node* operand_node = NodeProperties::GetValueInput(node, i);
316 return BoundsOrNone(operand_node); 316 return BoundsOrNone(operand_node);
317 } 317 }
318 318
319 Bounds ContextOperand(Node* node) { 319 Bounds WrapContextBoundsForInput(Node* node);
320 Bounds result = BoundsOrNone(NodeProperties::GetContextInput(node));
321 DCHECK(result.upper->Maybe(Type::Internal()));
322 // TODO(rossberg): More precisely, instead of the above assertion, we should
323 // back-propagate the constraint that it has to be a subtype of Internal.
324 return result;
325 }
326
327 Type* Weaken(Type* current_type, Type* previous_type); 320 Type* Weaken(Type* current_type, Type* previous_type);
328 321
329 Zone* zone() { return typer_->zone(); } 322 Zone* zone() { return typer_->zone(); }
330 Isolate* isolate() { return typer_->isolate(); } 323 Isolate* isolate() { return typer_->isolate(); }
331 Graph* graph() { return typer_->graph(); } 324 Graph* graph() { return typer_->graph(); }
332 MaybeHandle<Context> context() { return typer_->context(); } 325 MaybeHandle<Context> context() { return typer_->context(); }
333 326
334 typedef Type* (*UnaryTyperFun)(Type*, Typer* t); 327 typedef Type* (*UnaryTyperFun)(Type*, Typer* t);
335 typedef Type* (*BinaryTyperFun)(Type*, Type*, Typer* t); 328 typedef Type* (*BinaryTyperFun)(Type*, Type*, Typer* t);
336 329
(...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after
1374 } 1367 }
1375 } 1368 }
1376 1369
1377 1370
1378 Bounds Typer::Visitor::TypeJSStoreContext(Node* node) { 1371 Bounds Typer::Visitor::TypeJSStoreContext(Node* node) {
1379 UNREACHABLE(); 1372 UNREACHABLE();
1380 return Bounds(); 1373 return Bounds();
1381 } 1374 }
1382 1375
1383 1376
1377 Bounds Typer::Visitor::WrapContextBoundsForInput(Node* node) {
1378 Bounds outer = BoundsOrNone(NodeProperties::GetContextInput(node));
1379 if (outer.upper->Is(Type::None())) {
1380 return Bounds(Type::None());
1381 } else {
1382 DCHECK(outer.upper->Maybe(Type::Internal()));
1383 return Bounds(Type::Context(outer.upper, zone()));
1384 }
1385 }
1386
1387
1384 Bounds Typer::Visitor::TypeJSCreateFunctionContext(Node* node) { 1388 Bounds Typer::Visitor::TypeJSCreateFunctionContext(Node* node) {
1385 Bounds outer = ContextOperand(node); 1389 return WrapContextBoundsForInput(node);
1386 return Bounds(Type::Context(outer.upper, zone()));
1387 } 1390 }
1388 1391
1389 1392
1390 Bounds Typer::Visitor::TypeJSCreateCatchContext(Node* node) { 1393 Bounds Typer::Visitor::TypeJSCreateCatchContext(Node* node) {
1391 Bounds outer = ContextOperand(node); 1394 return WrapContextBoundsForInput(node);
1392 return Bounds(Type::Context(outer.upper, zone()));
1393 } 1395 }
1394 1396
1395 1397
1396 Bounds Typer::Visitor::TypeJSCreateWithContext(Node* node) { 1398 Bounds Typer::Visitor::TypeJSCreateWithContext(Node* node) {
1397 Bounds outer = ContextOperand(node); 1399 return WrapContextBoundsForInput(node);
1398 return Bounds(Type::Context(outer.upper, zone()));
1399 } 1400 }
1400 1401
1401 1402
1402 Bounds Typer::Visitor::TypeJSCreateBlockContext(Node* node) { 1403 Bounds Typer::Visitor::TypeJSCreateBlockContext(Node* node) {
1403 Bounds outer = ContextOperand(node); 1404 return WrapContextBoundsForInput(node);
1404 return Bounds(Type::Context(outer.upper, zone()));
1405 } 1405 }
1406 1406
1407 1407
1408 Bounds Typer::Visitor::TypeJSCreateModuleContext(Node* node) { 1408 Bounds Typer::Visitor::TypeJSCreateModuleContext(Node* node) {
1409 // TODO(rossberg): this is probably incorrect 1409 // TODO(rossberg): this is probably incorrect
1410 Bounds outer = ContextOperand(node); 1410 return WrapContextBoundsForInput(node);
1411 return Bounds(Type::Context(outer.upper, zone()));
1412 } 1411 }
1413 1412
1414 1413
1415 Bounds Typer::Visitor::TypeJSCreateScriptContext(Node* node) { 1414 Bounds Typer::Visitor::TypeJSCreateScriptContext(Node* node) {
1416 Bounds outer = ContextOperand(node); 1415 return WrapContextBoundsForInput(node);
1417 return Bounds(Type::Context(outer.upper, zone()));
1418 } 1416 }
1419 1417
1420 1418
1421 // JS other operators. 1419 // JS other operators.
1422 1420
1423 1421
1424 Bounds Typer::Visitor::TypeJSYield(Node* node) { 1422 Bounds Typer::Visitor::TypeJSYield(Node* node) {
1425 return Bounds::Unbounded(zone()); 1423 return Bounds::Unbounded(zone());
1426 } 1424 }
1427 1425
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after
2117 TYPED_ARRAYS(TYPED_ARRAY_CASE) 2115 TYPED_ARRAYS(TYPED_ARRAY_CASE)
2118 #undef TYPED_ARRAY_CASE 2116 #undef TYPED_ARRAY_CASE
2119 } 2117 }
2120 } 2118 }
2121 return Type::Constant(value, zone()); 2119 return Type::Constant(value, zone());
2122 } 2120 }
2123 2121
2124 } // namespace compiler 2122 } // namespace compiler
2125 } // namespace internal 2123 } // namespace internal
2126 } // namespace v8 2124 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/compiler/regress-451012.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698