MLIR  16.0.0git
Classes | Functions
Loops.cpp File Reference
#include "PassDetail.h"
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/Arithmetic/Utils/Utils.h"
#include "mlir/Dialect/Linalg/IR/Linalg.h"
#include "mlir/Dialect/Linalg/Passes.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/BlockAndValueMapping.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 dependency graph for Loops.cpp:

Go to the source code of this file.

Classes

struct  InputAndOutputIndices
 

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 (LinalgOp linalgOp, PatternRewriter &rewriter, 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 (PatternRewriter &rewriter, LinalgOp linalgOp)
 

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>
}
}
}

Definition at line 119 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 78 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 ( PatternRewriter rewriter,
LinalgOp  linalgOp 
)
static

◆ makeCanonicalAffineApplies()

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

◆ replaceIndexOpsByInductionVariables()

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

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

Definition at line 166 of file Loops.cpp.

References mlir::RewriterBase::replaceOp().

Referenced by linalgOpToLoopsImpl().