//===- FrozenRewritePatternSet.h --------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef MLIR_REWRITE_FROZENREWRITEPATTERNSET_H
#define MLIR_REWRITE_FROZENREWRITEPATTERNSET_H

#include "mlir/IR/PatternMatch.h"

namespace mlir {
namespace detail {
class PDLByteCode;
} // end namespace detail

/// This class represents a frozen set of patterns that can be processed by a
/// pattern applicator. This class is designed to enable caching pattern lists
/// such that they need not be continuously recomputed. Note that all copies of
/// this class share the same compiled pattern list, allowing for a reduction in
/// the number of duplicated patterns that need to be created.
class FrozenRewritePatternSet {
  using NativePatternListT = std::vector<std::unique_ptr<RewritePattern>>;

public:
  /// A map of operation specific native patterns.
  using OpSpecificNativePatternListT =
      DenseMap<OperationName, std::vector<RewritePattern *>>;

  FrozenRewritePatternSet();
  FrozenRewritePatternSet(FrozenRewritePatternSet &&patterns) = default;
  FrozenRewritePatternSet(const FrozenRewritePatternSet &patterns) = default;
  FrozenRewritePatternSet &
  operator=(const FrozenRewritePatternSet &patterns) = default;
  FrozenRewritePatternSet &
  operator=(FrozenRewritePatternSet &&patterns) = default;
  ~FrozenRewritePatternSet();

  /// Freeze the patterns held in `patterns`, and take ownership.
  /// `disabledPatternLabels` is a set of labels used to filter out input
  /// patterns with a label in this set. `enabledPatternLabels` is a set of
  /// labels used to filter out input patterns that do not have one of the
  /// labels in this set.
  FrozenRewritePatternSet(
      RewritePatternSet &&patterns,
      ArrayRef<std::string> disabledPatternLabels = llvm::None,
      ArrayRef<std::string> enabledPatternLabels = llvm::None);

  /// Return the op specific native patterns held by this list.
  const OpSpecificNativePatternListT &getOpSpecificNativePatterns() const {
    return impl->nativeOpSpecificPatternMap;
  }

  /// Return the "match any" native patterns held by this list.
  iterator_range<llvm::pointee_iterator<NativePatternListT::const_iterator>>
  getMatchAnyOpNativePatterns() const {
    const NativePatternListT &nativeList = impl->nativeAnyOpPatterns;
    return llvm::make_pointee_range(nativeList);
  }

  /// Return the compiled PDL bytecode held by this list. Returns null if
  /// there are no PDL patterns within the list.
  const detail::PDLByteCode *getPDLByteCode() const {
    return impl->pdlByteCode.get();
  }

private:
  /// The internal implementation of the frozen pattern list.
  struct Impl {
    /// The set of native C++ rewrite patterns that are matched to specific
    /// operation kinds.
    OpSpecificNativePatternListT nativeOpSpecificPatternMap;

    /// The full op-specific native rewrite list. This allows for the map above
    /// to contain duplicate patterns, e.g. for interfaces and traits.
    NativePatternListT nativeOpSpecificPatternList;

    /// The set of native C++ rewrite patterns that are matched to "any"
    /// operation.
    NativePatternListT nativeAnyOpPatterns;

    /// The bytecode containing the compiled PDL patterns.
    std::unique_ptr<detail::PDLByteCode> pdlByteCode;
  };

  /// A pointer to the internal pattern list. This uses a shared_ptr to avoid
  /// the need to compile the same pattern list multiple times. For example,
  /// during multi-threaded pass execution, all copies of a pass can share the
  /// same pattern list.
  std::shared_ptr<Impl> impl;
};

} // end namespace mlir

#endif // MLIR_REWRITE_FROZENREWRITEPATTERNSET_H
