Files
clang-p2996/mlir/test/lib/Transforms/TestDominance.cpp
Stephen Neuendorffer 57818885be [MLIR] Move Verifier and Dominance Analysis from /Analysis to /IR
These libraries are distinct from other things in Analysis in that they
operate only on core IR concepts.  This also simplifies dependencies
so that Dialect -> Analysis -> Parser -> IR.  Previously, the parser depended
on portions of the the Analysis directory as well, which sometimes
caused issues with the way the cmake makefile generator discovers
dependencies on generated files during compilation.

Differential Revision: https://reviews.llvm.org/D79240
2020-05-01 20:01:46 -07:00

91 lines
2.7 KiB
C++

//===- TestDominance.cpp - Test dominance construction and information
//-------===//
//
// 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 contains test passes for constructing and resolving dominance
// information.
//
//===----------------------------------------------------------------------===//
#include "mlir/IR/Dominance.h"
#include "mlir/Pass/Pass.h"
using namespace mlir;
namespace {
/// Helper class to print dominance information.
class DominanceTest {
public:
/// Constructs a new test instance using the given operation.
DominanceTest(Operation *operation) : operation(operation) {
// Create unique ids for each block.
operation->walk([&](Operation *nested) {
if (blockIds.count(nested->getBlock()) > 0)
return;
blockIds.insert({nested->getBlock(), blockIds.size()});
});
}
/// Prints dominance information of all blocks.
template <typename DominanceT>
void printDominance(DominanceT &dominanceInfo) {
DenseSet<Block *> parentVisited;
operation->walk([&](Operation *op) {
Block *block = op->getBlock();
if (!parentVisited.insert(block).second)
return;
DenseSet<Block *> visited;
operation->walk([&](Operation *nested) {
Block *nestedBlock = nested->getBlock();
if (!visited.insert(nestedBlock).second)
return;
llvm::errs() << "Nearest(" << blockIds[block] << ", "
<< blockIds[nestedBlock] << ") = ";
Block *dom =
dominanceInfo.findNearestCommonDominator(block, nestedBlock);
if (dom)
llvm::errs() << blockIds[dom];
else
llvm::errs() << "<no dom>";
llvm::errs() << "\n";
});
});
}
private:
Operation *operation;
DenseMap<Block *, size_t> blockIds;
};
struct TestDominancePass : public PassWrapper<TestDominancePass, FunctionPass> {
void runOnFunction() override {
llvm::errs() << "Testing : " << getFunction().getName() << "\n";
DominanceTest dominanceTest(getFunction());
// Print dominance information.
llvm::errs() << "--- DominanceInfo ---\n";
dominanceTest.printDominance(getAnalysis<DominanceInfo>());
llvm::errs() << "--- PostDominanceInfo ---\n";
dominanceTest.printDominance(getAnalysis<PostDominanceInfo>());
}
};
} // end anonymous namespace
namespace mlir {
void registerTestDominancePass() {
PassRegistration<TestDominancePass>(
"test-print-dominance",
"Print the dominance information for multiple regions.");
}
} // namespace mlir