//===- TestLoopFusion.cpp - Test loop fusion ------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements a pass to test various loop fusion utility functions. // //===----------------------------------------------------------------------===// #include "mlir/Dialect/Affine/Analysis/Utils.h" #include "mlir/Dialect/Affine/IR/AffineOps.h" #include "mlir/Dialect/Affine/LoopFusionUtils.h" #include "mlir/Dialect/Affine/LoopUtils.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Pass/Pass.h" #define DEBUG_TYPE … usingnamespacemlir; usingnamespacemlir::affine; namespace { struct TestLoopFusion : public PassWrapper<TestLoopFusion, OperationPass<func::FuncOp>> { … }; } // namespace // Run fusion dependence check on 'loops[i]' and 'loops[j]' at loop depths // in range ['loopDepth' + 1, 'maxLoopDepth']. // Emits a remark on 'loops[i]' if a fusion-preventing dependence exists. // Returns false as IR is not transformed. static bool testDependenceCheck(AffineForOp srcForOp, AffineForOp dstForOp, unsigned i, unsigned j, unsigned loopDepth, unsigned maxLoopDepth) { … } // Returns the index of 'op' in its block. static unsigned getBlockIndex(Operation &op) { … } // Returns a string representation of 'sliceUnion'. static std::string getSliceStr(const affine::ComputationSliceState &sliceUnion) { … } /// Computes fusion slice union on 'loops[i]' and 'loops[j]' at loop depths /// in range ['loopDepth' + 1, 'maxLoopDepth']. /// Emits a string representation of the slice union as a remark on 'loops[j]' /// and marks this as incorrect slice if the slice is invalid. Returns false as /// IR is not transformed. static bool testSliceComputation(AffineForOp forOpA, AffineForOp forOpB, unsigned i, unsigned j, unsigned loopDepth, unsigned maxLoopDepth) { … } // Attempts to fuse 'forOpA' into 'forOpB' at loop depths in range // ['loopDepth' + 1, 'maxLoopDepth']. // Returns true if loops were successfully fused, false otherwise. static bool testLoopFusionTransformation(AffineForOp forOpA, AffineForOp forOpB, unsigned i, unsigned j, unsigned loopDepth, unsigned maxLoopDepth) { … } LoopFunc; // Run tests on all combinations of src/dst loop nests in 'depthToLoops'. // If 'return_on_change' is true, returns on first invocation of 'fn' which // returns true. static bool iterateLoops(ArrayRef<SmallVector<AffineForOp, 2>> depthToLoops, LoopFunc fn, bool returnOnChange = false) { … } void TestLoopFusion::runOnOperation() { … } namespace mlir { namespace test { void registerTestLoopFusion() { … } } // namespace test } // namespace mlir