//===- UseDefLists.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 // //===----------------------------------------------------------------------===// // // This file defines generic use/def list machinery and manipulation utilities. // //===----------------------------------------------------------------------===// #ifndef MLIR_IR_USEDEFLISTS_H #define MLIR_IR_USEDEFLISTS_H #include "mlir/IR/Location.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/iterator_range.h" namespace mlir { class Operation; template <typename OperandType> class ValueUseIterator; template <typename UseIteratorT, typename OperandType> class ValueUserIterator; //===----------------------------------------------------------------------===// // IROperand //===----------------------------------------------------------------------===// namespace detail { /// This class is the base for IROperand, and provides all of the non-templated /// facilities for operand use management. class IROperandBase { … }; } // namespace detail //===----------------------------------------------------------------------===// // IROperand //===----------------------------------------------------------------------===// /// A reference to a value, suitable for use as an operand of an operation. /// IRValueT is the root type to use for values this tracks. Derived operand /// types are expected to provide the following: /// * static IRObjectWithUseList *getUseList(IRValueT value); /// - Provide the use list that is attached to the given value. template <typename DerivedT, typename IRValueT> class IROperand : public detail::IROperandBase { … }; //===----------------------------------------------------------------------===// // IRObjectWithUseList //===----------------------------------------------------------------------===// /// This class represents a single IR object that contains a use list. template <typename OperandType> class IRObjectWithUseList { … }; //===----------------------------------------------------------------------===// // ValueUseIterator //===----------------------------------------------------------------------===// /// An iterator class that allows for iterating over the uses of an IR operand /// type. template <typename OperandType> class ValueUseIterator : public llvm::iterator_facade_base<ValueUseIterator<OperandType>, std::forward_iterator_tag, OperandType> { … }; //===----------------------------------------------------------------------===// // ValueUserIterator //===----------------------------------------------------------------------===// /// An iterator over the users of an IRObject. This is a wrapper iterator around /// a specific use iterator. template <typename UseIteratorT, typename OperandType> class ValueUserIterator final : public llvm::mapped_iterator_base< ValueUserIterator<UseIteratorT, OperandType>, UseIteratorT, Operation *> { … }; } // namespace mlir #endif