MLIR  20.0.0git
Classes | Namespaces | Macros | Functions
Loops.cpp File Reference
#include "mlir/Dialect/Linalg/Passes.h"
#include "mlir/Dialect/Affine/IR/AffineOps.h"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/Dialect/Arith/Utils/Utils.h"
#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/Dialect/Linalg/IR/Linalg.h"
#include "mlir/Dialect/Linalg/Transforms/Transforms.h"
#include "mlir/Dialect/Linalg/Utils/Utils.h"
#include "mlir/Dialect/SCF/Transforms/Transforms.h"
#include "mlir/Dialect/SCF/Utils/AffineCanonicalizationUtils.h"
#include "mlir/IR/AffineExpr.h"
#include "mlir/IR/AffineMap.h"
#include "mlir/IR/IRMapping.h"
#include "mlir/Support/LLVM.h"
#include "mlir/Transforms/DialectConversion.h"
#include "mlir/Transforms/FoldUtils.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
#include "llvm/ADT/TypeSwitch.h"
#include "mlir/Dialect/Linalg/Passes.h.inc"

Go to the source code of this file.

Classes

struct  InputAndOutputIndices
 

Namespaces

 mlir
 Include the generated interface declarations.
 

Macros

#define GEN_PASS_DEF_CONVERTLINALGTOAFFINELOOPSPASS
 
#define GEN_PASS_DEF_CONVERTLINALGTOLOOPSPASS
 
#define GEN_PASS_DEF_CONVERTLINALGTOPARALLELLOOPSPASS
 

Functions

static SmallVector< ValuemakeCanonicalAffineApplies (OpBuilder &b, Location loc, AffineMap map, ArrayRef< Value > vals)
 
template<typename LoadOpTy , typename StoreOpTy , typename OpType >
static void inlineRegionAndEmitStore (OpBuilder &b, Location loc, OpType op, ArrayRef< Value > indexedValues, ArrayRef< SmallVector< Value >> indexing, ArrayRef< Value > outputBuffers)
 
template<typename SingleInputPoolingOp >
static InputAndOutputIndices getInputAndOutputIndices (OpBuilder &b, Location loc, ArrayRef< Value > allIvs, SingleInputPoolingOp op)
 
template<typename LoadOpTy , typename StoreOpTy >
static void emitScalarImplementation (OpBuilder &b, Location loc, ArrayRef< Value > allIvs, LinalgOp linalgOp)
 Emits the MLIR for the scalar part of the generic op by: More...
 
static void replaceIndexOpsByInductionVariables (RewriterBase &rewriter, LinalgOp linalgOp, ArrayRef< Operation * > loopOps)
 Replace the index operations in the body of the loop nest by the matching induction variables. More...
 
template<typename LoopTy >
static FailureOr< LinalgLoopslinalgOpToLoopsImpl (RewriterBase &rewriter, LinalgOp linalgOp)
 

Macro Definition Documentation

◆ GEN_PASS_DEF_CONVERTLINALGTOAFFINELOOPSPASS

#define GEN_PASS_DEF_CONVERTLINALGTOAFFINELOOPSPASS

Definition at line 30 of file Loops.cpp.

◆ GEN_PASS_DEF_CONVERTLINALGTOLOOPSPASS

#define GEN_PASS_DEF_CONVERTLINALGTOLOOPSPASS

Definition at line 31 of file Loops.cpp.

◆ GEN_PASS_DEF_CONVERTLINALGTOPARALLELLOOPSPASS

#define GEN_PASS_DEF_CONVERTLINALGTOPARALLELLOOPSPASS

Definition at line 32 of file Loops.cpp.

Function Documentation

◆ emitScalarImplementation()

template<typename LoadOpTy , typename StoreOpTy >
static void emitScalarImplementation ( OpBuilder b,
Location  loc,
ArrayRef< Value allIvs,
LinalgOp  linalgOp 
)
static

Emits the MLIR for the scalar part of the generic op by:

  1. Emitting load ops for each input and output view in order. This is achieved by applying the appropriate input or output map to the enclosing induction variables.
  2. Emitting a call to op.fun() that takes as arguments the scalars from point 1. above.
  3. Emitting store ops to store the results of 2. to the output views.

An example output may resemble:

scf.for %i = %c0 to %0 step %c1 {
scf.for %j = %c0 to %1 step %c1 {
scf.for %k = %c0 to %4 step %c1 {
%11 = load %arg0[%i, %j] :
memref<?x?xf32, stride_specification>
%12 = load %arg1[%i, %j, %k] :
memref<?x?x?xf32, stride_specification>
%13 = load %arg2[%i, %k, %j] :
memref<?x?x?xf32, stride_specification>
%14:2 = call @foo(%11, %12, %13) : (f32, f32, f32) -> (f32, f32)
store %14#0, %arg1[%i, %j, %k] :
memref<?x?x?Xf32, stride_specification>
store %14#1, %arg2[%i, %k, %j] :
memref<?x?x?Xf32, stride_specification>
}
}
}
Eliminates variable at the specified position using Fourier-Motzkin variable elimination.

Definition at line 128 of file Loops.cpp.

References mlir::OpBuilder::create(), and makeCanonicalAffineApplies().

◆ getInputAndOutputIndices()

template<typename SingleInputPoolingOp >
static InputAndOutputIndices getInputAndOutputIndices ( OpBuilder b,
Location  loc,
ArrayRef< Value allIvs,
SingleInputPoolingOp  op 
)
static

Definition at line 87 of file Loops.cpp.

References makeCanonicalAffineApplies().

◆ inlineRegionAndEmitStore()

template<typename LoadOpTy , typename StoreOpTy , typename OpType >
static void inlineRegionAndEmitStore ( OpBuilder b,
Location  loc,
OpType  op,
ArrayRef< Value indexedValues,
ArrayRef< SmallVector< Value >>  indexing,
ArrayRef< Value outputBuffers 
)
static

◆ linalgOpToLoopsImpl()

template<typename LoopTy >
static FailureOr<LinalgLoops> linalgOpToLoopsImpl ( RewriterBase rewriter,
LinalgOp  linalgOp 
)
static

Definition at line 209 of file Loops.cpp.

References mlir::linalg::GenerateLoopNest< LoopTy >::doit().

◆ makeCanonicalAffineApplies()

static SmallVector<Value> makeCanonicalAffineApplies ( OpBuilder b,
Location  loc,
AffineMap  map,
ArrayRef< Value vals 
)
static

◆ replaceIndexOpsByInductionVariables()

static void replaceIndexOpsByInductionVariables ( RewriterBase rewriter,
LinalgOp  linalgOp,
ArrayRef< Operation * >  loopOps 
)
static

Replace the index operations in the body of the loop nest by the matching induction variables.

Definition at line 179 of file Loops.cpp.