[Mlir-commits] [mlir] [MLIR][SCF] Support permutation-based parallel loop fusion (PR #203207)
Ivan Butygin
llvmlistbot at llvm.org
Fri Jun 12 01:45:34 PDT 2026
================
@@ -761,6 +771,147 @@ static std::optional<ParallelOp> interchangeLoops(OpBuilder &builder,
return newOp;
}
+struct LoopIV {
+ Value lBound, uBound, step;
+ bool operator!=(LoopIV const &other) const { return !(*this == other); }
+ bool operator==(LoopIV const &other) const {
+ return lBound == other.lBound && uBound == other.uBound &&
+ step == other.step;
+ }
+};
+
+template <>
+struct llvm::DenseMapInfo<LoopIV> {
+ static inline bool isEqual(const LoopIV &lhs, const LoopIV &rhs) {
+ return (lhs == rhs);
+ }
+
+ static inline unsigned getHashValue(const LoopIV &val) {
+ return llvm::hash_combine(
+ DenseMapInfo<mlir::Value>::getHashValue(val.lBound),
+ DenseMapInfo<mlir::Value>::getHashValue(val.uBound),
+ DenseMapInfo<mlir::Value>::getHashValue(val.step));
+ }
+};
+
+// Returns vector of candidate permutation indices vectors,
+// can be empty
+static SmallVector<SmallVector<int64_t>>
+computeCandidateInterchangePermutations(ParallelOp &firstPloop,
+ ParallelOp &secondPloop) {
+ SmallVector<SmallVector<int64_t>> extraResults;
+
+ // Check preconditions
+ if (firstPloop.getNumLoops() < 2 ||
+ firstPloop.getNumLoops() != secondPloop.getNumLoops())
+ return extraResults;
+
+ SmallVector<LoopIV> firstIVs(firstPloop.getNumLoops());
+ SmallVector<LoopIV> secondIVs(secondPloop.getNumLoops());
+ llvm::SmallSetVector<LoopIV, 6> unique;
+ for (unsigned index = 0; index < firstPloop.getNumLoops(); ++index) {
----------------
Hardcode84 wrote:
nit: `llvm::seq(firstPloop.getNumLoops())`
https://github.com/llvm/llvm-project/pull/203207
More information about the Mlir-commits
mailing list