// 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 'path_based_optimizer.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];
