#pragma once #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #endif //===- 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 ColumnLoop.Index = 0..NumColumns /// for RowLoop.Index = 0..NumRows /// for KLoop.Index = 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; /// Properties of a single loop used when generating the tiled loop nest. struct MatrixLoop { /// The index updated on every iteration. Value *Index = nullptr; /// The header and latch of the loop. BasicBlock *Header = nullptr; BasicBlock *Latch = nullptr; }; /// The loop iterating on the rows. MatrixLoop RowLoop; /// The loop iterating on the columns. MatrixLoop ColumnLoop; /// The loop iterating on k (inner dimension). MatrixLoop KLoop; 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 ColumnLoop.Index = 0..NumColumns /// for RowLoop.Index = 0..NumRows /// for InnerLoop.Index = 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 #ifdef __GNUC__ #pragma GCC diagnostic pop #endif