//===- 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