//===- MatrixUtils.h - Utilities to lower matrix intrinsics -----*- 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 // //===----------------------------------------------------------------------===// // // Utilities for generating tiled loops for matrix operations. // //===----------------------------------------------------------------------===// #ifndef LLVM_TRANSFORMS_UTILS_MATRIXUTILS_H #define LLVM_TRANSFORMS_UTILS_MATRIXUTILS_H #include "llvm/ADT/StringRef.h" namespace llvm { class DomTreeUpdater; class BasicBlock; class Value; class Loop; class LoopInfo; class IRBuilderBase; /// A helper struct to create IR loop nests for tiling in IR of the following /// form: /// for CurrentColumn = 0..NumColumns /// for CurrentRow = 0..NumRows /// for CurrentInner = 0..NumInner struct TileInfo { /// Number of rows of the matrix. unsigned NumRows; /// Number of columns of the matrix. unsigned NumColumns; /// Number of columns of the first matrix of a multiply / /// number of rows of the second matrix of a multiply. unsigned NumInner; /// Number of rows/columns in a tile. unsigned TileSize = -1; /// Start row of the current tile to compute. Value *CurrentRow; /// Start column of the current tile to compute. Value *CurrentCol; /// Current tile offset during the tile computation. Value *CurrentK; /// Header of the outermost loop iterating from 0..NumColumns. BasicBlock *ColumnLoopHeader = nullptr; /// Header of the second loop iterating from 0..NumRows. BasicBlock *RowLoopHeader = nullptr; /// Latch of the second loop iterating from 0..NumRows. BasicBlock *RowLoopLatch = nullptr; /// Header of the innermost loop iterating from 0..NumInner. BasicBlock *InnerLoopHeader = nullptr; /// Latch of the innermost loop iterating from 0..NumInner. BasicBlock *InnerLoopLatch = nullptr; TileInfo(unsigned NumRows, unsigned NumColumns, unsigned NumInner, unsigned TileSize) : NumRows(NumRows), NumColumns(NumColumns), NumInner(NumInner), TileSize(TileSize) {} /// Creates an IR loop nests for tiling of the form below. Returns the block /// for the inner loop body and sets {Column,Row,Inner}LoopHeader/Latch /// fields. /// /// for CurrentColumn = 0..NumColumns /// for CurrentRow = 0..NumRows /// for CurrentInner = 0..NumInner BasicBlock *CreateTiledLoops(BasicBlock *Start, BasicBlock *End, IRBuilderBase &B, DomTreeUpdater &DTU, LoopInfo &LI); private: /// Creates a new loop with header, body and latch blocks that iterates from /// [0, Bound). Updates \p Preheader to branch to the new header and uses \p /// Exit as exit block. Adds the new loop blocks to \L and applies dominator /// tree updates to \p DTU. static BasicBlock *CreateLoop(BasicBlock *Preheader, BasicBlock *Exit, Value *Bound, Value *Step, StringRef Name, IRBuilderBase &B, DomTreeUpdater &DTU, Loop *L, LoopInfo &LI); }; } // namespace llvm #endif