/* Autogenerated by mlir-tblgen; don't manually edit */

#ifdef GEN_PASS_DECL
// Generate declarations for all passes.
#define GEN_PASS_DECL_ASYNCFUNCTOASYNCRUNTIMEPASS
#define GEN_PASS_DECL_ASYNCPARALLELFORPASS
#define GEN_PASS_DECL_ASYNCRUNTIMEPOLICYBASEDREFCOUNTINGPASS
#define GEN_PASS_DECL_ASYNCRUNTIMEREFCOUNTINGOPTPASS
#define GEN_PASS_DECL_ASYNCRUNTIMEREFCOUNTINGPASS
#define GEN_PASS_DECL_ASYNCTOASYNCRUNTIMEPASS
#undef GEN_PASS_DECL
#endif // GEN_PASS_DECL

//===----------------------------------------------------------------------===//
// AsyncFuncToAsyncRuntimePass
//===----------------------------------------------------------------------===//
#ifdef GEN_PASS_DECL_ASYNCFUNCTOASYNCRUNTIMEPASS
std::unique_ptr<::mlir::Pass> createAsyncFuncToAsyncRuntimePass();
#undef GEN_PASS_DECL_ASYNCFUNCTOASYNCRUNTIMEPASS
#endif // GEN_PASS_DECL_ASYNCFUNCTOASYNCRUNTIMEPASS
#ifdef GEN_PASS_DEF_ASYNCFUNCTOASYNCRUNTIMEPASS

namespace impl {
  std::unique_ptr<::mlir::Pass> createAsyncFuncToAsyncRuntimePass();
} // namespace impl
namespace impl {

template <typename DerivedT>
class AsyncFuncToAsyncRuntimePassBase : public ::mlir::OperationPass<ModuleOp> {
public:
  using Base = AsyncFuncToAsyncRuntimePassBase;

  AsyncFuncToAsyncRuntimePassBase() : ::mlir::OperationPass<ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncFuncToAsyncRuntimePassBase(const AsyncFuncToAsyncRuntimePassBase &other) : ::mlir::OperationPass<ModuleOp>(other) {}
  AsyncFuncToAsyncRuntimePassBase& operator=(const AsyncFuncToAsyncRuntimePassBase &) = delete;
  AsyncFuncToAsyncRuntimePassBase(AsyncFuncToAsyncRuntimePassBase &&) = delete;
  AsyncFuncToAsyncRuntimePassBase& operator=(AsyncFuncToAsyncRuntimePassBase &&) = delete;
  ~AsyncFuncToAsyncRuntimePassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-func-to-async-runtime");
  }
  ::llvm::StringRef getArgument() const override { return "async-func-to-async-runtime"; }

  ::llvm::StringRef getDescription() const override { return "Lower async.func operations to the explicit async.runtime andasync.coro operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncFuncToAsyncRuntimePass");
  }
  ::llvm::StringRef getName() const override { return "AsyncFuncToAsyncRuntimePass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Return the dialect that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
    registry.insert<func::FuncDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncFuncToAsyncRuntimePassBase<DerivedT>)

protected:
private:

  friend std::unique_ptr<::mlir::Pass> createAsyncFuncToAsyncRuntimePass() {
    return std::make_unique<DerivedT>();
  }
};
} // namespace impl

std::unique_ptr<::mlir::Pass> createAsyncFuncToAsyncRuntimePass() {
  return impl::createAsyncFuncToAsyncRuntimePass();
}
#undef GEN_PASS_DEF_ASYNCFUNCTOASYNCRUNTIMEPASS
#endif // GEN_PASS_DEF_ASYNCFUNCTOASYNCRUNTIMEPASS

//===----------------------------------------------------------------------===//
// AsyncParallelForPass
//===----------------------------------------------------------------------===//
#ifdef GEN_PASS_DECL_ASYNCPARALLELFORPASS
struct AsyncParallelForPassOptions {
  bool asyncDispatch = true;
  int32_t numWorkerThreads = 8;
  int32_t minTaskSize = 1000;
};
std::unique_ptr<::mlir::Pass> createAsyncParallelForPass();
std::unique_ptr<::mlir::Pass> createAsyncParallelForPass(AsyncParallelForPassOptions options);
#undef GEN_PASS_DECL_ASYNCPARALLELFORPASS
#endif // GEN_PASS_DECL_ASYNCPARALLELFORPASS
#ifdef GEN_PASS_DEF_ASYNCPARALLELFORPASS

namespace impl {
  std::unique_ptr<::mlir::Pass> createAsyncParallelForPass();
} // namespace impl

namespace impl {
  std::unique_ptr<::mlir::Pass> createAsyncParallelForPass(AsyncParallelForPassOptions options);
} // namespace impl
namespace impl {

template <typename DerivedT>
class AsyncParallelForPassBase : public ::mlir::OperationPass<ModuleOp> {
public:
  using Base = AsyncParallelForPassBase;

  AsyncParallelForPassBase() : ::mlir::OperationPass<ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncParallelForPassBase(const AsyncParallelForPassBase &other) : ::mlir::OperationPass<ModuleOp>(other) {}
  AsyncParallelForPassBase& operator=(const AsyncParallelForPassBase &) = delete;
  AsyncParallelForPassBase(AsyncParallelForPassBase &&) = delete;
  AsyncParallelForPassBase& operator=(AsyncParallelForPassBase &&) = delete;
  ~AsyncParallelForPassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-parallel-for");
  }
  ::llvm::StringRef getArgument() const override { return "async-parallel-for"; }

  ::llvm::StringRef getDescription() const override { return "Convert scf.parallel operations to multiple async compute ops executed concurrently for non-overlapping iteration ranges"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncParallelForPass");
  }
  ::llvm::StringRef getName() const override { return "AsyncParallelForPass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Return the dialect that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<arith::ArithDialect>();
    registry.insert<async::AsyncDialect>();
    registry.insert<func::FuncDialect>();
    registry.insert<scf::SCFDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncParallelForPassBase<DerivedT>)

  AsyncParallelForPassBase(AsyncParallelForPassOptions options) : AsyncParallelForPassBase() {
    asyncDispatch = std::move(options.asyncDispatch);
    numWorkerThreads = std::move(options.numWorkerThreads);
    minTaskSize = std::move(options.minTaskSize);
  }
protected:
  ::mlir::Pass::Option<bool> asyncDispatch{*this, "async-dispatch", ::llvm::cl::desc("Dispatch async compute tasks using recursive work splitting. If `false` async compute tasks will be launched using simple for loop in the caller thread."), ::llvm::cl::init(true)};
  ::mlir::Pass::Option<int32_t> numWorkerThreads{*this, "num-workers", ::llvm::cl::desc("The number of available workers to execute async operations. If `-1` the value will be retrieved from the runtime."), ::llvm::cl::init(8)};
  ::mlir::Pass::Option<int32_t> minTaskSize{*this, "min-task-size", ::llvm::cl::desc("The minimum task size for sharding parallel operation."), ::llvm::cl::init(1000)};
private:

  friend std::unique_ptr<::mlir::Pass> createAsyncParallelForPass() {
    return std::make_unique<DerivedT>();
  }

  friend std::unique_ptr<::mlir::Pass> createAsyncParallelForPass(AsyncParallelForPassOptions options) {
    return std::make_unique<DerivedT>(std::move(options));
  }
};
} // namespace impl

std::unique_ptr<::mlir::Pass> createAsyncParallelForPass() {
  return impl::createAsyncParallelForPass();
}

std::unique_ptr<::mlir::Pass> createAsyncParallelForPass(AsyncParallelForPassOptions options) {
  return impl::createAsyncParallelForPass(std::move(options));
}
#undef GEN_PASS_DEF_ASYNCPARALLELFORPASS
#endif // GEN_PASS_DEF_ASYNCPARALLELFORPASS

//===----------------------------------------------------------------------===//
// AsyncRuntimePolicyBasedRefCountingPass
//===----------------------------------------------------------------------===//
#ifdef GEN_PASS_DECL_ASYNCRUNTIMEPOLICYBASEDREFCOUNTINGPASS
std::unique_ptr<::mlir::Pass> createAsyncRuntimePolicyBasedRefCountingPass();
#undef GEN_PASS_DECL_ASYNCRUNTIMEPOLICYBASEDREFCOUNTINGPASS
#endif // GEN_PASS_DECL_ASYNCRUNTIMEPOLICYBASEDREFCOUNTINGPASS
#ifdef GEN_PASS_DEF_ASYNCRUNTIMEPOLICYBASEDREFCOUNTINGPASS

namespace impl {
  std::unique_ptr<::mlir::Pass> createAsyncRuntimePolicyBasedRefCountingPass();
} // namespace impl
namespace impl {

template <typename DerivedT>
class AsyncRuntimePolicyBasedRefCountingPassBase : public ::mlir::OperationPass<> {
public:
  using Base = AsyncRuntimePolicyBasedRefCountingPassBase;

  AsyncRuntimePolicyBasedRefCountingPassBase() : ::mlir::OperationPass<>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncRuntimePolicyBasedRefCountingPassBase(const AsyncRuntimePolicyBasedRefCountingPassBase &other) : ::mlir::OperationPass<>(other) {}
  AsyncRuntimePolicyBasedRefCountingPassBase& operator=(const AsyncRuntimePolicyBasedRefCountingPassBase &) = delete;
  AsyncRuntimePolicyBasedRefCountingPassBase(AsyncRuntimePolicyBasedRefCountingPassBase &&) = delete;
  AsyncRuntimePolicyBasedRefCountingPassBase& operator=(AsyncRuntimePolicyBasedRefCountingPassBase &&) = delete;
  ~AsyncRuntimePolicyBasedRefCountingPassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-runtime-policy-based-ref-counting");
  }
  ::llvm::StringRef getArgument() const override { return "async-runtime-policy-based-ref-counting"; }

  ::llvm::StringRef getDescription() const override { return "Policy based reference counting for Async runtime operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncRuntimePolicyBasedRefCountingPass");
  }
  ::llvm::StringRef getName() const override { return "AsyncRuntimePolicyBasedRefCountingPass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Return the dialect that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncRuntimePolicyBasedRefCountingPassBase<DerivedT>)

protected:
private:

  friend std::unique_ptr<::mlir::Pass> createAsyncRuntimePolicyBasedRefCountingPass() {
    return std::make_unique<DerivedT>();
  }
};
} // namespace impl

std::unique_ptr<::mlir::Pass> createAsyncRuntimePolicyBasedRefCountingPass() {
  return impl::createAsyncRuntimePolicyBasedRefCountingPass();
}
#undef GEN_PASS_DEF_ASYNCRUNTIMEPOLICYBASEDREFCOUNTINGPASS
#endif // GEN_PASS_DEF_ASYNCRUNTIMEPOLICYBASEDREFCOUNTINGPASS

//===----------------------------------------------------------------------===//
// AsyncRuntimeRefCountingOptPass
//===----------------------------------------------------------------------===//
#ifdef GEN_PASS_DECL_ASYNCRUNTIMEREFCOUNTINGOPTPASS
std::unique_ptr<::mlir::Pass> createAsyncRuntimeRefCountingOptPass();
#undef GEN_PASS_DECL_ASYNCRUNTIMEREFCOUNTINGOPTPASS
#endif // GEN_PASS_DECL_ASYNCRUNTIMEREFCOUNTINGOPTPASS
#ifdef GEN_PASS_DEF_ASYNCRUNTIMEREFCOUNTINGOPTPASS

namespace impl {
  std::unique_ptr<::mlir::Pass> createAsyncRuntimeRefCountingOptPass();
} // namespace impl
namespace impl {

template <typename DerivedT>
class AsyncRuntimeRefCountingOptPassBase : public ::mlir::OperationPass<> {
public:
  using Base = AsyncRuntimeRefCountingOptPassBase;

  AsyncRuntimeRefCountingOptPassBase() : ::mlir::OperationPass<>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncRuntimeRefCountingOptPassBase(const AsyncRuntimeRefCountingOptPassBase &other) : ::mlir::OperationPass<>(other) {}
  AsyncRuntimeRefCountingOptPassBase& operator=(const AsyncRuntimeRefCountingOptPassBase &) = delete;
  AsyncRuntimeRefCountingOptPassBase(AsyncRuntimeRefCountingOptPassBase &&) = delete;
  AsyncRuntimeRefCountingOptPassBase& operator=(AsyncRuntimeRefCountingOptPassBase &&) = delete;
  ~AsyncRuntimeRefCountingOptPassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-runtime-ref-counting-opt");
  }
  ::llvm::StringRef getArgument() const override { return "async-runtime-ref-counting-opt"; }

  ::llvm::StringRef getDescription() const override { return "Optimize automatic reference counting operations for theAsync runtime by removing redundant operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncRuntimeRefCountingOptPass");
  }
  ::llvm::StringRef getName() const override { return "AsyncRuntimeRefCountingOptPass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Return the dialect that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncRuntimeRefCountingOptPassBase<DerivedT>)

protected:
private:

  friend std::unique_ptr<::mlir::Pass> createAsyncRuntimeRefCountingOptPass() {
    return std::make_unique<DerivedT>();
  }
};
} // namespace impl

std::unique_ptr<::mlir::Pass> createAsyncRuntimeRefCountingOptPass() {
  return impl::createAsyncRuntimeRefCountingOptPass();
}
#undef GEN_PASS_DEF_ASYNCRUNTIMEREFCOUNTINGOPTPASS
#endif // GEN_PASS_DEF_ASYNCRUNTIMEREFCOUNTINGOPTPASS

//===----------------------------------------------------------------------===//
// AsyncRuntimeRefCountingPass
//===----------------------------------------------------------------------===//
#ifdef GEN_PASS_DECL_ASYNCRUNTIMEREFCOUNTINGPASS
std::unique_ptr<::mlir::Pass> createAsyncRuntimeRefCountingPass();
#undef GEN_PASS_DECL_ASYNCRUNTIMEREFCOUNTINGPASS
#endif // GEN_PASS_DECL_ASYNCRUNTIMEREFCOUNTINGPASS
#ifdef GEN_PASS_DEF_ASYNCRUNTIMEREFCOUNTINGPASS

namespace impl {
  std::unique_ptr<::mlir::Pass> createAsyncRuntimeRefCountingPass();
} // namespace impl
namespace impl {

template <typename DerivedT>
class AsyncRuntimeRefCountingPassBase : public ::mlir::OperationPass<> {
public:
  using Base = AsyncRuntimeRefCountingPassBase;

  AsyncRuntimeRefCountingPassBase() : ::mlir::OperationPass<>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncRuntimeRefCountingPassBase(const AsyncRuntimeRefCountingPassBase &other) : ::mlir::OperationPass<>(other) {}
  AsyncRuntimeRefCountingPassBase& operator=(const AsyncRuntimeRefCountingPassBase &) = delete;
  AsyncRuntimeRefCountingPassBase(AsyncRuntimeRefCountingPassBase &&) = delete;
  AsyncRuntimeRefCountingPassBase& operator=(AsyncRuntimeRefCountingPassBase &&) = delete;
  ~AsyncRuntimeRefCountingPassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-runtime-ref-counting");
  }
  ::llvm::StringRef getArgument() const override { return "async-runtime-ref-counting"; }

  ::llvm::StringRef getDescription() const override { return "Automatic reference counting for Async runtime operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncRuntimeRefCountingPass");
  }
  ::llvm::StringRef getName() const override { return "AsyncRuntimeRefCountingPass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Return the dialect that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncRuntimeRefCountingPassBase<DerivedT>)

protected:
private:

  friend std::unique_ptr<::mlir::Pass> createAsyncRuntimeRefCountingPass() {
    return std::make_unique<DerivedT>();
  }
};
} // namespace impl

std::unique_ptr<::mlir::Pass> createAsyncRuntimeRefCountingPass() {
  return impl::createAsyncRuntimeRefCountingPass();
}
#undef GEN_PASS_DEF_ASYNCRUNTIMEREFCOUNTINGPASS
#endif // GEN_PASS_DEF_ASYNCRUNTIMEREFCOUNTINGPASS

//===----------------------------------------------------------------------===//
// AsyncToAsyncRuntimePass
//===----------------------------------------------------------------------===//
#ifdef GEN_PASS_DECL_ASYNCTOASYNCRUNTIMEPASS
std::unique_ptr<::mlir::Pass> createAsyncToAsyncRuntimePass();
#undef GEN_PASS_DECL_ASYNCTOASYNCRUNTIMEPASS
#endif // GEN_PASS_DECL_ASYNCTOASYNCRUNTIMEPASS
#ifdef GEN_PASS_DEF_ASYNCTOASYNCRUNTIMEPASS

namespace impl {
  std::unique_ptr<::mlir::Pass> createAsyncToAsyncRuntimePass();
} // namespace impl
namespace impl {

template <typename DerivedT>
class AsyncToAsyncRuntimePassBase : public ::mlir::OperationPass<ModuleOp> {
public:
  using Base = AsyncToAsyncRuntimePassBase;

  AsyncToAsyncRuntimePassBase() : ::mlir::OperationPass<ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncToAsyncRuntimePassBase(const AsyncToAsyncRuntimePassBase &other) : ::mlir::OperationPass<ModuleOp>(other) {}
  AsyncToAsyncRuntimePassBase& operator=(const AsyncToAsyncRuntimePassBase &) = delete;
  AsyncToAsyncRuntimePassBase(AsyncToAsyncRuntimePassBase &&) = delete;
  AsyncToAsyncRuntimePassBase& operator=(AsyncToAsyncRuntimePassBase &&) = delete;
  ~AsyncToAsyncRuntimePassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-to-async-runtime");
  }
  ::llvm::StringRef getArgument() const override { return "async-to-async-runtime"; }

  ::llvm::StringRef getDescription() const override { return "Lower all high level async operations (e.g. async.execute) tothe explicit async.runtime and async.coro operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncToAsyncRuntimePass");
  }
  ::llvm::StringRef getName() const override { return "AsyncToAsyncRuntimePass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Return the dialect that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
    registry.insert<func::FuncDialect>();
    registry.insert<cf::ControlFlowDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncToAsyncRuntimePassBase<DerivedT>)

protected:
private:

  friend std::unique_ptr<::mlir::Pass> createAsyncToAsyncRuntimePass() {
    return std::make_unique<DerivedT>();
  }
};
} // namespace impl

std::unique_ptr<::mlir::Pass> createAsyncToAsyncRuntimePass() {
  return impl::createAsyncToAsyncRuntimePass();
}
#undef GEN_PASS_DEF_ASYNCTOASYNCRUNTIMEPASS
#endif // GEN_PASS_DEF_ASYNCTOASYNCRUNTIMEPASS
#ifdef GEN_PASS_REGISTRATION

//===----------------------------------------------------------------------===//
// AsyncFuncToAsyncRuntimePass Registration
//===----------------------------------------------------------------------===//

inline void registerAsyncFuncToAsyncRuntimePass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncFuncToAsyncRuntimePass();
  });
}

// Old registration code, kept for temporary backwards compatibility.
inline void registerAsyncFuncToAsyncRuntimePassPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncFuncToAsyncRuntimePass();
  });
}

//===----------------------------------------------------------------------===//
// AsyncParallelForPass Registration
//===----------------------------------------------------------------------===//

inline void registerAsyncParallelForPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncParallelForPass();
  });
}

// Old registration code, kept for temporary backwards compatibility.
inline void registerAsyncParallelForPassPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncParallelForPass();
  });
}

//===----------------------------------------------------------------------===//
// AsyncRuntimePolicyBasedRefCountingPass Registration
//===----------------------------------------------------------------------===//

inline void registerAsyncRuntimePolicyBasedRefCountingPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncRuntimePolicyBasedRefCountingPass();
  });
}

// Old registration code, kept for temporary backwards compatibility.
inline void registerAsyncRuntimePolicyBasedRefCountingPassPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncRuntimePolicyBasedRefCountingPass();
  });
}

//===----------------------------------------------------------------------===//
// AsyncRuntimeRefCountingOptPass Registration
//===----------------------------------------------------------------------===//

inline void registerAsyncRuntimeRefCountingOptPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncRuntimeRefCountingOptPass();
  });
}

// Old registration code, kept for temporary backwards compatibility.
inline void registerAsyncRuntimeRefCountingOptPassPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncRuntimeRefCountingOptPass();
  });
}

//===----------------------------------------------------------------------===//
// AsyncRuntimeRefCountingPass Registration
//===----------------------------------------------------------------------===//

inline void registerAsyncRuntimeRefCountingPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncRuntimeRefCountingPass();
  });
}

// Old registration code, kept for temporary backwards compatibility.
inline void registerAsyncRuntimeRefCountingPassPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncRuntimeRefCountingPass();
  });
}

//===----------------------------------------------------------------------===//
// AsyncToAsyncRuntimePass Registration
//===----------------------------------------------------------------------===//

inline void registerAsyncToAsyncRuntimePass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncToAsyncRuntimePass();
  });
}

// Old registration code, kept for temporary backwards compatibility.
inline void registerAsyncToAsyncRuntimePassPass() {
  ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
    return createAsyncToAsyncRuntimePass();
  });
}

//===----------------------------------------------------------------------===//
// Async Registration
//===----------------------------------------------------------------------===//

inline void registerAsyncPasses() {
  registerAsyncFuncToAsyncRuntimePass();
  registerAsyncParallelForPass();
  registerAsyncRuntimePolicyBasedRefCountingPass();
  registerAsyncRuntimeRefCountingOptPass();
  registerAsyncRuntimeRefCountingPass();
  registerAsyncToAsyncRuntimePass();
}
#undef GEN_PASS_REGISTRATION
#endif // GEN_PASS_REGISTRATION
// Deprecated. Please use the new per-pass macros.
#ifdef GEN_PASS_CLASSES

template <typename DerivedT>
class AsyncFuncToAsyncRuntimePassBase : public ::mlir::OperationPass<ModuleOp> {
public:
  using Base = AsyncFuncToAsyncRuntimePassBase;

  AsyncFuncToAsyncRuntimePassBase() : ::mlir::OperationPass<ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncFuncToAsyncRuntimePassBase(const AsyncFuncToAsyncRuntimePassBase &other) : ::mlir::OperationPass<ModuleOp>(other) {}
  AsyncFuncToAsyncRuntimePassBase& operator=(const AsyncFuncToAsyncRuntimePassBase &) = delete;
  AsyncFuncToAsyncRuntimePassBase(AsyncFuncToAsyncRuntimePassBase &&) = delete;
  AsyncFuncToAsyncRuntimePassBase& operator=(AsyncFuncToAsyncRuntimePassBase &&) = delete;
  ~AsyncFuncToAsyncRuntimePassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-func-to-async-runtime");
  }
  ::llvm::StringRef getArgument() const override { return "async-func-to-async-runtime"; }

  ::llvm::StringRef getDescription() const override { return "Lower async.func operations to the explicit async.runtime andasync.coro operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncFuncToAsyncRuntimePass");
  }
  ::llvm::StringRef getName() const override { return "AsyncFuncToAsyncRuntimePass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Register the dialects that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
    registry.insert<func::FuncDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncFuncToAsyncRuntimePassBase<DerivedT>)

protected:
};

template <typename DerivedT>
class AsyncParallelForPassBase : public ::mlir::OperationPass<ModuleOp> {
public:
  using Base = AsyncParallelForPassBase;

  AsyncParallelForPassBase() : ::mlir::OperationPass<ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncParallelForPassBase(const AsyncParallelForPassBase &other) : ::mlir::OperationPass<ModuleOp>(other) {}
  AsyncParallelForPassBase& operator=(const AsyncParallelForPassBase &) = delete;
  AsyncParallelForPassBase(AsyncParallelForPassBase &&) = delete;
  AsyncParallelForPassBase& operator=(AsyncParallelForPassBase &&) = delete;
  ~AsyncParallelForPassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-parallel-for");
  }
  ::llvm::StringRef getArgument() const override { return "async-parallel-for"; }

  ::llvm::StringRef getDescription() const override { return "Convert scf.parallel operations to multiple async compute ops executed concurrently for non-overlapping iteration ranges"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncParallelForPass");
  }
  ::llvm::StringRef getName() const override { return "AsyncParallelForPass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Register the dialects that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<arith::ArithDialect>();
    registry.insert<async::AsyncDialect>();
    registry.insert<func::FuncDialect>();
    registry.insert<scf::SCFDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncParallelForPassBase<DerivedT>)

protected:
  ::mlir::Pass::Option<bool> asyncDispatch{*this, "async-dispatch", ::llvm::cl::desc("Dispatch async compute tasks using recursive work splitting. If `false` async compute tasks will be launched using simple for loop in the caller thread."), ::llvm::cl::init(true)};
  ::mlir::Pass::Option<int32_t> numWorkerThreads{*this, "num-workers", ::llvm::cl::desc("The number of available workers to execute async operations. If `-1` the value will be retrieved from the runtime."), ::llvm::cl::init(8)};
  ::mlir::Pass::Option<int32_t> minTaskSize{*this, "min-task-size", ::llvm::cl::desc("The minimum task size for sharding parallel operation."), ::llvm::cl::init(1000)};
};

template <typename DerivedT>
class AsyncRuntimePolicyBasedRefCountingPassBase : public ::mlir::OperationPass<> {
public:
  using Base = AsyncRuntimePolicyBasedRefCountingPassBase;

  AsyncRuntimePolicyBasedRefCountingPassBase() : ::mlir::OperationPass<>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncRuntimePolicyBasedRefCountingPassBase(const AsyncRuntimePolicyBasedRefCountingPassBase &other) : ::mlir::OperationPass<>(other) {}
  AsyncRuntimePolicyBasedRefCountingPassBase& operator=(const AsyncRuntimePolicyBasedRefCountingPassBase &) = delete;
  AsyncRuntimePolicyBasedRefCountingPassBase(AsyncRuntimePolicyBasedRefCountingPassBase &&) = delete;
  AsyncRuntimePolicyBasedRefCountingPassBase& operator=(AsyncRuntimePolicyBasedRefCountingPassBase &&) = delete;
  ~AsyncRuntimePolicyBasedRefCountingPassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-runtime-policy-based-ref-counting");
  }
  ::llvm::StringRef getArgument() const override { return "async-runtime-policy-based-ref-counting"; }

  ::llvm::StringRef getDescription() const override { return "Policy based reference counting for Async runtime operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncRuntimePolicyBasedRefCountingPass");
  }
  ::llvm::StringRef getName() const override { return "AsyncRuntimePolicyBasedRefCountingPass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Register the dialects that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncRuntimePolicyBasedRefCountingPassBase<DerivedT>)

protected:
};

template <typename DerivedT>
class AsyncRuntimeRefCountingOptPassBase : public ::mlir::OperationPass<> {
public:
  using Base = AsyncRuntimeRefCountingOptPassBase;

  AsyncRuntimeRefCountingOptPassBase() : ::mlir::OperationPass<>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncRuntimeRefCountingOptPassBase(const AsyncRuntimeRefCountingOptPassBase &other) : ::mlir::OperationPass<>(other) {}
  AsyncRuntimeRefCountingOptPassBase& operator=(const AsyncRuntimeRefCountingOptPassBase &) = delete;
  AsyncRuntimeRefCountingOptPassBase(AsyncRuntimeRefCountingOptPassBase &&) = delete;
  AsyncRuntimeRefCountingOptPassBase& operator=(AsyncRuntimeRefCountingOptPassBase &&) = delete;
  ~AsyncRuntimeRefCountingOptPassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-runtime-ref-counting-opt");
  }
  ::llvm::StringRef getArgument() const override { return "async-runtime-ref-counting-opt"; }

  ::llvm::StringRef getDescription() const override { return "Optimize automatic reference counting operations for theAsync runtime by removing redundant operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncRuntimeRefCountingOptPass");
  }
  ::llvm::StringRef getName() const override { return "AsyncRuntimeRefCountingOptPass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Register the dialects that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncRuntimeRefCountingOptPassBase<DerivedT>)

protected:
};

template <typename DerivedT>
class AsyncRuntimeRefCountingPassBase : public ::mlir::OperationPass<> {
public:
  using Base = AsyncRuntimeRefCountingPassBase;

  AsyncRuntimeRefCountingPassBase() : ::mlir::OperationPass<>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncRuntimeRefCountingPassBase(const AsyncRuntimeRefCountingPassBase &other) : ::mlir::OperationPass<>(other) {}
  AsyncRuntimeRefCountingPassBase& operator=(const AsyncRuntimeRefCountingPassBase &) = delete;
  AsyncRuntimeRefCountingPassBase(AsyncRuntimeRefCountingPassBase &&) = delete;
  AsyncRuntimeRefCountingPassBase& operator=(AsyncRuntimeRefCountingPassBase &&) = delete;
  ~AsyncRuntimeRefCountingPassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-runtime-ref-counting");
  }
  ::llvm::StringRef getArgument() const override { return "async-runtime-ref-counting"; }

  ::llvm::StringRef getDescription() const override { return "Automatic reference counting for Async runtime operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncRuntimeRefCountingPass");
  }
  ::llvm::StringRef getName() const override { return "AsyncRuntimeRefCountingPass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Register the dialects that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncRuntimeRefCountingPassBase<DerivedT>)

protected:
};

template <typename DerivedT>
class AsyncToAsyncRuntimePassBase : public ::mlir::OperationPass<ModuleOp> {
public:
  using Base = AsyncToAsyncRuntimePassBase;

  AsyncToAsyncRuntimePassBase() : ::mlir::OperationPass<ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
  AsyncToAsyncRuntimePassBase(const AsyncToAsyncRuntimePassBase &other) : ::mlir::OperationPass<ModuleOp>(other) {}
  AsyncToAsyncRuntimePassBase& operator=(const AsyncToAsyncRuntimePassBase &) = delete;
  AsyncToAsyncRuntimePassBase(AsyncToAsyncRuntimePassBase &&) = delete;
  AsyncToAsyncRuntimePassBase& operator=(AsyncToAsyncRuntimePassBase &&) = delete;
  ~AsyncToAsyncRuntimePassBase() = default;

  /// Returns the command-line argument attached to this pass.
  static constexpr ::llvm::StringLiteral getArgumentName() {
    return ::llvm::StringLiteral("async-to-async-runtime");
  }
  ::llvm::StringRef getArgument() const override { return "async-to-async-runtime"; }

  ::llvm::StringRef getDescription() const override { return "Lower all high level async operations (e.g. async.execute) tothe explicit async.runtime and async.coro operations"; }

  /// Returns the derived pass name.
  static constexpr ::llvm::StringLiteral getPassName() {
    return ::llvm::StringLiteral("AsyncToAsyncRuntimePass");
  }
  ::llvm::StringRef getName() const override { return "AsyncToAsyncRuntimePass"; }

  /// Support isa/dyn_cast functionality for the derived pass class.
  static bool classof(const ::mlir::Pass *pass) {
    return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
  }

  /// A clone method to create a copy of this pass.
  std::unique_ptr<::mlir::Pass> clonePass() const override {
    return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
  }

  /// Register the dialects that must be loaded in the context before this pass.
  void getDependentDialects(::mlir::DialectRegistry &registry) const override {
    registry.insert<async::AsyncDialect>();
    registry.insert<func::FuncDialect>();
    registry.insert<cf::ControlFlowDialect>();
  }

  /// Explicitly declare the TypeID for this class. We declare an explicit private
  /// instantiation because Pass classes should only be visible by the current
  /// library.
  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(AsyncToAsyncRuntimePassBase<DerivedT>)

protected:
};
#undef GEN_PASS_CLASSES
#endif // GEN_PASS_CLASSES
