// 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];
