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

Unified Diff: pkg/compiler/lib/src/cps_ir/bounds_checker.dart

Issue 1645053002: dart2js cps: Refactor tracking of side effects. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Clarification Created 4 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 side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/cps_ir/bounds_checker.dart
diff --git a/pkg/compiler/lib/src/cps_ir/bounds_checker.dart b/pkg/compiler/lib/src/cps_ir/bounds_checker.dart
index 798875f1eed952c1eb98958d0e2a8695e9be7779..f57b8300d6d5f78587d85b7f5f2452534e4195fa 100644
--- a/pkg/compiler/lib/src/cps_ir/bounds_checker.dart
+++ b/pkg/compiler/lib/src/cps_ir/bounds_checker.dart
@@ -14,6 +14,7 @@ import '../types/types.dart';
import '../world.dart';
import '../elements/elements.dart';
import 'loop_effects.dart';
+import 'effects.dart';
/// Eliminates bounds checks when they can be proven safe.
///
@@ -548,7 +549,7 @@ class BoundsChecker extends TrampolineRecursiveVisitor implements Pass {
}
}
}
- if (loopEffects.loopChangesLength(cont)) {
+ if (loopEffects.changesIndexableLength(cont)) {
currentEffectNumber = effectNumberAt[cont] = makeNewEffect();
}
push(cont);
@@ -613,6 +614,18 @@ class BoundsChecker extends TrampolineRecursiveVisitor implements Pass {
// ---------------- PRIMITIVES --------------------
@override
+ Expression traverseLetPrim(LetPrim node) {
+ visit(node.primitive);
+ // visitApplyBuiltinMethod updates the effect number.
+ if (node.primitive is! ApplyBuiltinMethod) {
+ if (node.primitive.effectFlags & Effects.changesIndexableLength != 0) {
+ currentEffectNumber = makeNewEffect();
+ }
+ }
+ return node.body;
+ }
+
+ @override
void visitInvokeMethod(InvokeMethod node) {
if (node.selector.isGetter && node.selector.name == 'length') {
// If the receiver type is not known to be indexable, the length call
@@ -624,65 +637,6 @@ class BoundsChecker extends TrampolineRecursiveVisitor implements Pass {
valueOf[node] = getLength(node.dartReceiver, currentEffectNumber);
}
}
- // TODO(asgerf): What we really need is a "changes length" side effect flag.
- if (world
- .getSideEffectsOfSelector(node.selector, node.mask)
- .changesIndex()) {
- currentEffectNumber = makeNewEffect();
- }
- }
-
- @override
- void visitInvokeStatic(InvokeStatic node) {
- if (world.getSideEffectsOfElement(node.target).changesIndex()) {
- currentEffectNumber = makeNewEffect();
- }
- }
-
- @override
- void visitInvokeMethodDirectly(InvokeMethodDirectly node) {
- FunctionElement target = node.target;
- if (target is ConstructorBodyElement) {
- ConstructorBodyElement body = target;
- target = body.constructor;
- }
- if (world.getSideEffectsOfElement(target).changesIndex()) {
- currentEffectNumber = makeNewEffect();
- }
- }
-
- @override
- void visitInvokeConstructor(InvokeConstructor node) {
- if (world.getSideEffectsOfElement(node.target).changesIndex()) {
- currentEffectNumber = makeNewEffect();
- }
- }
-
- @override
- void visitTypeCast(TypeCast node) {
- }
-
- @override
- void visitGetLazyStatic(GetLazyStatic node) {
- // TODO(asgerf): How do we get the side effects of a lazy field initializer?
- currentEffectNumber = makeNewEffect();
- }
-
- @override
- void visitForeignCode(ForeignCode node) {
- if (node.nativeBehavior.sideEffects.changesIndex()) {
- currentEffectNumber = makeNewEffect();
- }
- }
-
- @override
- void visitAwait(Await node) {
- currentEffectNumber = makeNewEffect();
- }
-
- @override
- void visitYield(Yield node) {
- currentEffectNumber = makeNewEffect();
}
@override
« no previous file with comments | « no previous file | pkg/compiler/lib/src/cps_ir/builtin_operator.dart » ('j') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698