123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #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
|