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

Side by Side Diff: pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart

Issue 1385423002: dart2js cps_ir: Use interceptors for is-checks (version 2) (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: fix analyzer warnings Created 5 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
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library tree_ir.optimization.logical_rewriter; 5 library tree_ir.optimization.logical_rewriter;
6 6
7 import '../tree_ir_nodes.dart'; 7 import '../tree_ir_nodes.dart';
8 import 'optimization.dart' show Pass; 8 import 'optimization.dart' show Pass;
9 import '../../constants/values.dart' as values; 9 import '../../constants/values.dart' as values;
10 10
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 } 328 }
329 329
330 /// True if the given expression is known to evaluate to a boolean. 330 /// True if the given expression is known to evaluate to a boolean.
331 /// This will not recursively traverse [Conditional] expressions, but if 331 /// This will not recursively traverse [Conditional] expressions, but if
332 /// applied to the result of [visitExpression] conditionals will have been 332 /// applied to the result of [visitExpression] conditionals will have been
333 /// rewritten anyway. 333 /// rewritten anyway.
334 bool isBooleanValued(Expression e) { 334 bool isBooleanValued(Expression e) {
335 return isTrue(e) || 335 return isTrue(e) ||
336 isFalse(e) || 336 isFalse(e) ||
337 e is Not || 337 e is Not ||
338 e is LogicalOperator || 338 e is LogicalOperator && isBooleanValuedLogicalOperator(e) ||
339 e is ApplyBuiltinOperator && operatorReturnsBool(e.operator); 339 e is ApplyBuiltinOperator && operatorReturnsBool(e.operator) ||
340 e is TypeOperator && isBooleanValuedTypeOperator(e);
341 }
342
343 bool isBooleanValuedLogicalOperator(LogicalOperator e) {
344 return isBooleanValued(e.left) && isBooleanValued(e.right);
340 } 345 }
341 346
342 /// True if the given operator always returns `true` or `false`. 347 /// True if the given operator always returns `true` or `false`.
343 bool operatorReturnsBool(BuiltinOperator operator) { 348 bool operatorReturnsBool(BuiltinOperator operator) {
344 switch (operator) { 349 switch (operator) {
345 case BuiltinOperator.StrictEq: 350 case BuiltinOperator.StrictEq:
346 case BuiltinOperator.StrictNeq: 351 case BuiltinOperator.StrictNeq:
347 case BuiltinOperator.LooseEq: 352 case BuiltinOperator.LooseEq:
348 case BuiltinOperator.LooseNeq: 353 case BuiltinOperator.LooseNeq:
349 case BuiltinOperator.NumLt: 354 case BuiltinOperator.NumLt:
350 case BuiltinOperator.NumLe: 355 case BuiltinOperator.NumLe:
351 case BuiltinOperator.NumGt: 356 case BuiltinOperator.NumGt:
352 case BuiltinOperator.NumGe: 357 case BuiltinOperator.NumGe:
353 case BuiltinOperator.IsNumber: 358 case BuiltinOperator.IsNumber:
354 case BuiltinOperator.IsNotNumber: 359 case BuiltinOperator.IsNotNumber:
355 case BuiltinOperator.IsFloor: 360 case BuiltinOperator.IsFloor:
356 case BuiltinOperator.IsNumberAndFloor: 361 case BuiltinOperator.IsNumberAndFloor:
357 case BuiltinOperator.Identical: 362 case BuiltinOperator.Identical:
358 return true; 363 return true;
359 default: 364 default:
360 return false; 365 return false;
361 } 366 }
362 } 367 }
363 368
369 bool isBooleanValuedTypeOperator(TypeOperator e) {
370 return e.isTypeTest;
371 }
372
364 BuiltinOperator negateBuiltin(BuiltinOperator operator) { 373 BuiltinOperator negateBuiltin(BuiltinOperator operator) {
365 switch (operator) { 374 switch (operator) {
366 case BuiltinOperator.StrictEq: return BuiltinOperator.StrictNeq; 375 case BuiltinOperator.StrictEq: return BuiltinOperator.StrictNeq;
367 case BuiltinOperator.StrictNeq: return BuiltinOperator.StrictEq; 376 case BuiltinOperator.StrictNeq: return BuiltinOperator.StrictEq;
368 case BuiltinOperator.LooseEq: return BuiltinOperator.LooseNeq; 377 case BuiltinOperator.LooseEq: return BuiltinOperator.LooseNeq;
369 case BuiltinOperator.LooseNeq: return BuiltinOperator.LooseEq; 378 case BuiltinOperator.LooseNeq: return BuiltinOperator.LooseEq;
370 case BuiltinOperator.IsNumber: return BuiltinOperator.IsNotNumber; 379 case BuiltinOperator.IsNumber: return BuiltinOperator.IsNotNumber;
371 case BuiltinOperator.IsNotNumber: return BuiltinOperator.IsNumber; 380 case BuiltinOperator.IsNotNumber: return BuiltinOperator.IsNumber;
372 381
373 // Because of NaN, these do not have a negated form. 382 // Because of NaN, these do not have a negated form.
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 } else if (e1 is Assign) { 554 } else if (e1 is Assign) {
546 return e2 is VariableUse && e1.variable == e2.variable; 555 return e2 is VariableUse && e1.variable == e2.variable;
547 } 556 }
548 return false; 557 return false;
549 } 558 }
550 559
551 void destroyVariableUse(VariableUse node) { 560 void destroyVariableUse(VariableUse node) {
552 --node.variable.readCount; 561 --node.variable.readCount;
553 } 562 }
554 } 563 }
555
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698