blob: 337ff323643280c6cec80171098782fa8297ba41 [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library dart2js.cps_ir.optimizers;
import 'cps_ir_nodes.dart';
import '../constants/values.dart';
import '../common/names.dart';
import '../universe/selector.dart';
export 'type_propagation.dart' show TypePropagator;
export 'scalar_replacement.dart' show ScalarReplacer;
export 'redundant_phi.dart' show RedundantPhiEliminator;
export 'redundant_join.dart' show RedundantJoinEliminator;
export 'shrinking_reductions.dart' show ShrinkingReducer;
export 'mutable_ssa.dart' show MutableVariableEliminator;
export 'insert_refinements.dart' show InsertRefinements;
export 'update_refinements.dart' show UpdateRefinements;
export 'redundant_refinement.dart' show RedundantRefinementEliminator;
export 'optimize_interceptors.dart' show OptimizeInterceptors;
export 'bounds_checker.dart' show BoundsChecker;
export 'backward_null_check_remover.dart' show BackwardNullCheckRemover;
export 'gvn.dart' show GVN;
export 'inline.dart' show Inliner;
export 'eagerly_load_statics.dart' show EagerlyLoadStatics;
export 'loop_invariant_branch.dart' show LoopInvariantBranchMotion;
export 'duplicate_branch.dart' show PathBasedOptimizer;
export 'use_field_initializers.dart' show UseFieldInitializers;
export 'parent_visitor.dart' show ParentVisitor;
/// An optimization pass over the CPS IR.
abstract class Pass {
/// Applies optimizations to root, rewriting it in the process.
void rewrite(FunctionDefinition root);
String get passName;
}
// Shared code between optimizations
/// Returns true if [value] is false, null, 0, -0, NaN, or the empty string.
bool isFalsyConstant(ConstantValue value) {
return value.isFalse ||
value.isNull ||
value.isZero ||
value.isMinusZero ||
value.isNaN ||
value is StringConstantValue && value.primitiveValue.isEmpty;
}
/// Returns true if [value] satisfies a branching condition with the
/// given strictness.
///
/// For non-strict, this is the opposite of [isFalsyConstant].
bool isTruthyConstant(ConstantValue value, {bool strict: false}) {
return strict ? value.isTrue : !isFalsyConstant(value);
}
/// Selectors that do not throw when invoked on the null value.
final List<Selector> selectorsOnNull = <Selector>[
Selectors.equals, Selectors.hashCode_, Selectors.runtimeType_,
Selectors.toString_, Selectors.toStringGetter,
Selectors.noSuchMethodGetter];