MLIR
20.0.0git
|
#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 Operation * | getFirstDependentOpInRange (Operation *opA, Operation *opB) |
static Operation * | getLastDependentOpInRange (Operation *opA, Operation *opB) |
static Operation * | getFusedLoopNestInsertionPoint (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) |
#define DEBUG_TYPE "loop-fusion-utils" |
Definition at line 28 of file LoopFusionUtils.cpp.
|
static |
Definition at line 172 of file LoopFusionUtils.cpp.
Referenced by mlir::affine::canFuseLoops().
|
static |
Definition at line 528 of file LoopFusionUtils.cpp.
References mlir::affine::LoopNestStats::loopMap, mlir::affine::LoopNestStats::opCountMap, and mlir::affine::LoopNestStats::tripCountMap.
Referenced by mlir::affine::getComputeCost(), and mlir::affine::getFusionComputeCost().
Definition at line 63 of file LoopFusionUtils.cpp.
References getLoadAndStoreMemRefAccesses(), isDependentLoadOrStoreOp(), and mlir::Operation::walk().
Referenced by getFusedLoopNestInsertionPoint().
|
static |
Definition at line 134 of file LoopFusionUtils.cpp.
References getFirstDependentOpInRange(), getLastDependentOpInRange(), and mlir::Operation::isBeforeInBlock().
Referenced by mlir::affine::canFuseLoops().
Definition at line 89 of file LoopFusionUtils.cpp.
References mlir::WalkResult::advance(), mlir::affine::getAffineForIVs(), getLoadAndStoreMemRefAccesses(), mlir::Operation::getResults(), mlir::Operation::getUsers(), mlir::WalkResult::interrupt(), isDependentLoadOrStoreOp(), and mlir::Operation::walk().
Referenced by getFusedLoopNestInsertionPoint().
|
static |
Definition at line 35 of file LoopFusionUtils.cpp.
References mlir::Operation::walk().
Referenced by getFirstDependentOpInRange(), and getLastDependentOpInRange().
|
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().
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().
|
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().