95 lines
3.2 KiB
C++
95 lines
3.2 KiB
C++
//===- 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
|