MLIR  20.0.0git
Macros | Functions
LoopFusionUtils.cpp File Reference
#include "mlir/Dialect/Affine/LoopFusionUtils.h"
#include "mlir/Analysis/SliceAnalysis.h"
#include "mlir/Analysis/TopologicalSortUtils.h"
#include "mlir/Dialect/Affine/Analysis/AffineAnalysis.h"
#include "mlir/Dialect/Affine/Analysis/LoopAnalysis.h"
#include "mlir/Dialect/Affine/Analysis/Utils.h"
#include "mlir/Dialect/Affine/IR/AffineOps.h"
#include "mlir/Dialect/Affine/LoopUtils.h"
#include "mlir/IR/IRMapping.h"
#include "mlir/IR/Operation.h"
#include "mlir/IR/PatternMatch.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include <optional>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "loop-fusion-utils"
 

Functions

static void getLoadAndStoreMemRefAccesses (Operation *opA, DenseMap< Value, bool > &values)
 
static bool isDependentLoadOrStoreOp (Operation *op, DenseMap< Value, bool > &values)
 Returns true if 'op' is a load or store operation which access a memref accessed 'values' and at least one of the access is a store operation. More...
 
static OperationgetFirstDependentOpInRange (Operation *opA, Operation *opB)
 
static OperationgetLastDependentOpInRange (Operation *opA, Operation *opB)
 
static OperationgetFusedLoopNestInsertionPoint (AffineForOp srcForOp, AffineForOp dstForOp)
 
static bool gatherLoadsAndStores (AffineForOp forOp, SmallVectorImpl< Operation * > &loadAndStoreOps)
 
static unsigned getMaxLoopDepth (ArrayRef< Operation * > srcOps, ArrayRef< Operation * > dstOps)
 Returns the maximum loop depth at which we could fuse producer loop 'srcForOp' into consumer loop 'dstForOp' without violating data dependences. More...
 
static LogicalResult promoteSingleIterReductionLoop (AffineForOp forOp, bool siblingFusionUser)
 Patch the loop body of a forOp that is a single iteration reduction loop into its containing block. More...
 
static int64_t getComputeCostHelper (Operation *forOp, LoopNestStats &stats, llvm::SmallDenseMap< Operation *, uint64_t, 8 > *tripCountOverrideMap, DenseMap< Operation *, int64_t > *computeCostMap)
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "loop-fusion-utils"

Definition at line 28 of file LoopFusionUtils.cpp.

Function Documentation

◆ gatherLoadsAndStores()

static bool gatherLoadsAndStores ( AffineForOp  forOp,
SmallVectorImpl< Operation * > &  loadAndStoreOps 
)
static

Definition at line 172 of file LoopFusionUtils.cpp.

Referenced by mlir::affine::canFuseLoops().

◆ getComputeCostHelper()

static int64_t getComputeCostHelper ( Operation forOp,
LoopNestStats stats,
llvm::SmallDenseMap< Operation *, uint64_t, 8 > *  tripCountOverrideMap,
DenseMap< Operation *, int64_t > *  computeCostMap 
)
static

◆ getFirstDependentOpInRange()

static Operation* getFirstDependentOpInRange ( Operation opA,
Operation opB 
)
static

◆ getFusedLoopNestInsertionPoint()

static Operation* getFusedLoopNestInsertionPoint ( AffineForOp  srcForOp,
AffineForOp  dstForOp 
)
static

◆ getLastDependentOpInRange()

static Operation* getLastDependentOpInRange ( Operation opA,
Operation opB 
)
static

◆ getLoadAndStoreMemRefAccesses()

static void getLoadAndStoreMemRefAccesses ( Operation opA,
DenseMap< Value, bool > &  values 
)
static

Definition at line 35 of file LoopFusionUtils.cpp.

References mlir::Operation::walk().

Referenced by getFirstDependentOpInRange(), and getLastDependentOpInRange().

◆ getMaxLoopDepth()

static unsigned getMaxLoopDepth ( ArrayRef< Operation * >  srcOps,
ArrayRef< Operation * >  dstOps 
)
static

Returns the maximum loop depth at which we could fuse producer loop 'srcForOp' into consumer loop 'dstForOp' without violating data dependences.

Definition at line 188 of file LoopFusionUtils.cpp.

References mlir::affine::checkMemrefAccessDependence(), mlir::affine::gatherProducerConsumerMemrefs(), mlir::affine::getInnermostCommonLoopDepth(), mlir::affine::getNumCommonSurroundingLoops(), mlir::affine::hasDependence(), and min().

Referenced by mlir::affine::canFuseLoops().

◆ isDependentLoadOrStoreOp()

static bool isDependentLoadOrStoreOp ( Operation op,
DenseMap< Value, bool > &  values 
)
static

Returns true if 'op' is a load or store operation which access a memref accessed 'values' and at least one of the access is a store operation.

Returns false otherwise.

Definition at line 50 of file LoopFusionUtils.cpp.

Referenced by getFirstDependentOpInRange(), and getLastDependentOpInRange().

◆ promoteSingleIterReductionLoop()

static LogicalResult promoteSingleIterReductionLoop ( AffineForOp  forOp,
bool  siblingFusionUser 
)
static

Patch the loop body of a forOp that is a single iteration reduction loop into its containing block.

Definition at line 358 of file LoopFusionUtils.cpp.

References mlir::affine::getConstantTripCount(), mlir::getForwardSlice(), and mlir::topologicalSort().

Referenced by mlir::affine::fuseLoops().