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

Unified Diff: pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart

Issue 1519513002: dart2js cps: Retain refinement nodes and update refinements after GVN. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Merge Created 5 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/js_backend/codegen/task.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
index ee108de6e357ae04b1d0e3f5abc964ef269cae38..e6b8c34597602dc4b2cc88c901b214dc7c930ef8 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
@@ -98,6 +98,7 @@ class Builder implements cps_ir.Visitor/*<NodeCallback|Node>*/ {
/// Obtains the variable representing the given primitive. Returns null for
/// primitives that have no reference and do not need a variable.
Variable getVariable(cps_ir.Primitive primitive) {
+ primitive = primitive.effectiveDefinition;
return primitive2variable.putIfAbsent(primitive,
() => new Variable(currentElement, primitive.hint));
}
@@ -458,7 +459,7 @@ class Builder implements cps_ir.Visitor/*<NodeCallback|Node>*/ {
Expression visitGetField(cps_ir.GetField node) {
return new GetField(getVariableUse(node.object), node.field,
- objectIsNotNull: node.objectIsNotNull);
+ objectIsNotNull: !node.object.definition.type.isNullable);
}
Expression visitCreateBox(cps_ir.CreateBox node) {
@@ -555,7 +556,7 @@ class Builder implements cps_ir.Visitor/*<NodeCallback|Node>*/ {
return new ApplyBuiltinMethod(node.method,
getVariableUse(node.receiver),
translateArguments(node.arguments),
- receiverIsNotNull: node.receiverIsNotNull);
+ receiverIsNotNull: !node.receiver.definition.type.isNullable);
}
Expression visitGetLength(cps_ir.GetLength node) {
@@ -586,7 +587,15 @@ class Builder implements cps_ir.Visitor/*<NodeCallback|Node>*/ {
node.mask,
translateArguments(node.arguments),
node.sourceInformation);
- invoke.receiverIsNotNull = node.receiverIsNotNull;
+ // Sometimes we know the Dart receiver is non-null because it has been
+ // refined, which implies that the JS receiver also can not be null at the
+ // use-site. Interceptors are not refined, so this information is not
+ // always available on the JS receiver.
+ // Also check the JS receiver's type, however, because sometimes we know an
+ // interceptor is non-null because it intercepts JSNull.
+ invoke.receiverIsNotNull =
+ !node.dartReceiver.type.isNullable ||
+ !node.receiver.definition.type.isNullable;
return invoke;
}
@@ -673,8 +682,8 @@ class Builder implements cps_ir.Visitor/*<NodeCallback|Node>*/ {
}
@override
- Expression visitRefinement(cps_ir.Refinement node) {
- throw 'Unexpected Refinement node in tree builder';
+ visitRefinement(cps_ir.Refinement node) {
+ return (Statement next) => next; // Compile to nothing.
}
@override
« no previous file with comments | « pkg/compiler/lib/src/js_backend/codegen/task.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698