Files
clang-p2996/mlir/test/lib/Analysis/TestSlice.cpp
Christian Ulmann b00e0c1671 [MLIR][Analysis] Consolidate topological sort utilities (#92563)
This PR attempts to consolidate the different topological sort utilities
into one place. It adds them to the analysis folder because the
`SliceAnalysis` uses some of these.

There are now two different sorting strategies: 
1. Sort only according to SSA use-def chains
2. Sort while taking regions into account. This requires a much more
elaborate traversal and cannot be applied on graph regions that easily.

This additionally reimplements the region aware topological sorting
because the previous implementation had an exponential space complexity.

I'm open to suggestions on how to combine this further or how to fuse
the test passes.
2024-05-22 08:48:10 +02:00

54 lines
1.7 KiB
C++

//===- TestSlice.cpp - Test slice related analisis ------------------------===//
//
// 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/Analysis/TopologicalSortUtils.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/SymbolTable.h"
#include "mlir/Pass/Pass.h"
using namespace mlir;
static const StringLiteral kToSortMark = "test_to_sort";
static const StringLiteral kOrderIndex = "test_sort_index";
namespace {
struct TestTopologicalSortPass
: public PassWrapper<TestTopologicalSortPass,
InterfacePass<SymbolOpInterface>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestTopologicalSortPass)
StringRef getArgument() const final { return "test-print-topological-sort"; }
StringRef getDescription() const final {
return "Sorts operations topologically and attaches attributes with their "
"corresponding index in the ordering to them";
}
void runOnOperation() override {
SetVector<Operation *> toSort;
getOperation().walk([&](Operation *op) {
if (op->hasAttrOfType<UnitAttr>(kToSortMark))
toSort.insert(op);
});
auto i32Type = IntegerType::get(&getContext(), 32);
SetVector<Operation *> sortedOps = topologicalSort(toSort);
for (auto [index, op] : llvm::enumerate(sortedOps))
op->setAttr(kOrderIndex, IntegerAttr::get(i32Type, index));
}
};
} // namespace
namespace mlir {
namespace test {
void registerTestSliceAnalysisPass() {
PassRegistration<TestTopologicalSortPass>();
}
} // namespace test
} // namespace mlir