My Project
LoopFusionUtils.h
Go to the documentation of this file.
1 //===- LoopFusionUtils.h - Loop fusion utilities ----------------*- C++ -*-===//
2 //
3 // Part of the MLIR Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This header file defines prototypes for various loop fusion utility
10 // methods: these are not passes by themselves but are used either by passes,
11 // optimization sequences, or in turn by other transformation utilities.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef MLIR_TRANSFORMS_LOOP_FUSION_UTILS_H
16 #define MLIR_TRANSFORMS_LOOP_FUSION_UTILS_H
17 
18 #include "mlir/Support/LLVM.h"
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/ADT/SmallVector.h"
21 
22 namespace mlir {
23 class AffineForOp;
24 struct ComputationSliceState;
25 class Operation;
26 
27 // TODO(andydavis) Extend this module to include utility functions for querying
28 // fusion cost/storage reduction, and for performing the loop fusion
29 // transformation.
30 
31 struct FusionResult {
32  enum ResultEnum {
34  FailPrecondition, // Failed precondition for fusion. (e.g. same block).
35  FailBlockDependence, // Fusion would violate another dependence in block.
36  FailFusionDependence, // Fusion would reverse dependences between loops.
37  FailComputationSlice, // Unable to compute src loop computation slice.
38  } value;
39  FusionResult(ResultEnum v) : value(v) {}
40 };
41 
50 FusionResult canFuseLoops(AffineForOp srcForOp, AffineForOp dstForOp,
51  unsigned dstLoopDepth,
52  ComputationSliceState *srcSlice);
53 
57 struct LoopNestStats {
64 };
65 
69 // TODO(andydavis) Consider moving this to LoopUtils.
70 bool getLoopNestStats(AffineForOp forOp, LoopNestStats *stats);
71 
76 // TODO(andydavis) Improve this cost model.
77 int64_t getComputeCost(AffineForOp forOp, LoopNestStats &stats);
78 
85 // TODO(andydavis) Improve this cost model.
86 bool getFusionComputeCost(AffineForOp srcForOp, LoopNestStats &srcStats,
87  AffineForOp dstForOp, LoopNestStats &dstStats,
88  ComputationSliceState *slice, int64_t *computeCost);
89 
90 } // end namespace mlir
91 
92 #endif // MLIR_TRANSFORMS_LOOP_FUSION_UTILS_H
Definition: InferTypeOpInterface.cpp:20
Definition: LLVM.h:48
Definition: LoopFusionUtils.h:33
FusionResult canFuseLoops(AffineForOp srcForOp, AffineForOp dstForOp, unsigned dstLoopDepth, ComputationSliceState *srcSlice)
Definition: LoopFusionUtils.cpp:191
DenseMap< Operation *, uint64_t > opCountMap
Map from AffineForOp to count of operations in its loop body.
Definition: LoopFusionUtils.h:61
ResultEnum
Definition: LoopFusionUtils.h:32
Definition: LoopFusionUtils.h:57
FusionResult(ResultEnum v)
Definition: LoopFusionUtils.h:39
DenseMap< Operation *, SmallVector< AffineForOp, 2 > > loopMap
Map from AffineForOp to immediate child AffineForOps in its loop body.
Definition: LoopFusionUtils.h:59
Definition: Utils.h:55
bool getLoopNestStats(AffineForOp forOp, LoopNestStats *stats)
Definition: LoopFusionUtils.cpp:252
Definition: LoopFusionUtils.h:36
DenseMap< Operation *, uint64_t > tripCountMap
Map from AffineForOp to its constant trip count.
Definition: LoopFusionUtils.h:63
mlir::edsc::intrinsics::ValueBuilder< SliceOp > slice
Definition: Intrinsics.h:24
Definition: LoopFusionUtils.h:34
Definition: LoopFusionUtils.h:31
enum mlir::FusionResult::ResultEnum value
Definition: LoopFusionUtils.h:35
bool getFusionComputeCost(AffineForOp srcForOp, LoopNestStats &srcStats, AffineForOp dstForOp, LoopNestStats &dstStats, ComputationSliceState *slice, int64_t *computeCost)
Definition: LoopFusionUtils.cpp:415
Definition: LoopFusionUtils.h:37
int64_t getComputeCost(AffineForOp forOp, LoopNestStats &stats)
Definition: LoopFusionUtils.cpp:404