mirror of
https://github.com/intel/llvm.git
synced 2026-01-28 19:43:38 +08:00
This revision adds support for generating utilities for passes such as options/statistics/etc. that can be inferred from the tablegen definition. This removes additional boilerplate from the pass, and also makes it easier to remove the reliance on the pass registry to provide certain things(e.g. the pass argument). Differential Revision: https://reviews.llvm.org/D76659
53 lines
1.8 KiB
C++
53 lines
1.8 KiB
C++
//===- ParallelLoopCollapsing.cpp - Pass collapsing parallel loop indices -===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Dialect/LoopOps/LoopOps.h"
|
|
#include "mlir/Dialect/StandardOps/IR/Ops.h"
|
|
#include "mlir/Pass/Pass.h"
|
|
#include "mlir/Transforms/LoopUtils.h"
|
|
#include "mlir/Transforms/Passes.h"
|
|
#include "mlir/Transforms/RegionUtils.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/Support/Debug.h"
|
|
|
|
#define DEBUG_TYPE "parallel-loop-collapsing"
|
|
|
|
using namespace mlir;
|
|
|
|
namespace {
|
|
struct ParallelLoopCollapsing : public OperationPass<ParallelLoopCollapsing> {
|
|
/// Include the generated pass utilities.
|
|
#define GEN_PASS_ParallelLoopCollapsing
|
|
#include "mlir/Transforms/Passes.h.inc"
|
|
|
|
ParallelLoopCollapsing() = default;
|
|
ParallelLoopCollapsing(const ParallelLoopCollapsing &) {}
|
|
void runOnOperation() override {
|
|
Operation *module = getOperation();
|
|
|
|
module->walk([&](loop::ParallelOp op) {
|
|
// The common case for GPU dialect will be simplifying the ParallelOp to 3
|
|
// arguments, so we do that here to simplify things.
|
|
llvm::SmallVector<std::vector<unsigned>, 3> combinedLoops;
|
|
if (clCollapsedIndices0.size())
|
|
combinedLoops.push_back(clCollapsedIndices0);
|
|
if (clCollapsedIndices1.size())
|
|
combinedLoops.push_back(clCollapsedIndices1);
|
|
if (clCollapsedIndices2.size())
|
|
combinedLoops.push_back(clCollapsedIndices2);
|
|
collapseParallelLoops(op, combinedLoops);
|
|
});
|
|
}
|
|
};
|
|
|
|
} // namespace
|
|
|
|
std::unique_ptr<Pass> mlir::createParallelLoopCollapsingPass() {
|
|
return std::make_unique<ParallelLoopCollapsing>();
|
|
}
|