summaryrefslogtreecommitdiffstats
path: root/mlir/lib/Analysis
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/lib/Analysis')
-rw-r--r--mlir/lib/Analysis/MemRefBoundCheck.cpp8
-rw-r--r--mlir/lib/Analysis/MemRefDependenceCheck.cpp7
-rw-r--r--mlir/lib/Analysis/Pass.cpp37
3 files changed, 52 insertions, 0 deletions
diff --git a/mlir/lib/Analysis/MemRefBoundCheck.cpp b/mlir/lib/Analysis/MemRefBoundCheck.cpp
index 0725cea7086..a7f0ebf4936 100644
--- a/mlir/lib/Analysis/MemRefBoundCheck.cpp
+++ b/mlir/lib/Analysis/MemRefBoundCheck.cpp
@@ -45,10 +45,14 @@ struct MemRefBoundCheck : public FunctionPass, StmtWalker<MemRefBoundCheck> {
PassResult runOnCFGFunction(CFGFunction *f) override { return success(); }
void visitOperationStmt(OperationStmt *opStmt);
+
+ static char passID;
};
} // end anonymous namespace
+char MemRefBoundCheck::passID = 0;
+
FunctionPass *mlir::createMemRefBoundCheckPass() {
return new MemRefBoundCheck();
}
@@ -164,3 +168,7 @@ void MemRefBoundCheck::visitOperationStmt(OperationStmt *opStmt) {
PassResult MemRefBoundCheck::runOnMLFunction(MLFunction *f) {
return walk(f), success();
}
+
+static PassRegistration<MemRefBoundCheck>
+ memRefBoundCheck("memref-bound-check",
+ "Check memref accesses in an MLFunction");
diff --git a/mlir/lib/Analysis/MemRefDependenceCheck.cpp b/mlir/lib/Analysis/MemRefDependenceCheck.cpp
index 3ca669c5c85..7a620c1a3a8 100644
--- a/mlir/lib/Analysis/MemRefDependenceCheck.cpp
+++ b/mlir/lib/Analysis/MemRefDependenceCheck.cpp
@@ -51,10 +51,13 @@ struct MemRefDependenceCheck : public FunctionPass,
loadsAndStores.push_back(opStmt);
}
}
+ static char passID;
};
} // end anonymous namespace
+char MemRefDependenceCheck::passID = 0;
+
FunctionPass *mlir::createMemRefDependenceCheckPass() {
return new MemRefDependenceCheck();
}
@@ -132,3 +135,7 @@ PassResult MemRefDependenceCheck::runOnMLFunction(MLFunction *f) {
checkDependences(loadsAndStores);
return success();
}
+
+static PassRegistration<MemRefDependenceCheck>
+ pass("memref-dependence-check",
+ "Checks dependences between all pairs of memref accesses.");
diff --git a/mlir/lib/Analysis/Pass.cpp b/mlir/lib/Analysis/Pass.cpp
index 1249c18c07e..ea9da5b0e80 100644
--- a/mlir/lib/Analysis/Pass.cpp
+++ b/mlir/lib/Analysis/Pass.cpp
@@ -23,6 +23,9 @@
#include "mlir/IR/CFGFunction.h"
#include "mlir/IR/MLFunction.h"
#include "mlir/IR/Module.h"
+#include "mlir/Support/PassNameParser.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/Support/ManagedStatic.h"
using namespace mlir;
/// Out of line virtual method to ensure vtables and metadata are emitted to a
@@ -51,3 +54,37 @@ PassResult FunctionPass::runOnFunction(Function *fn) {
return success();
}
+
+// TODO: The pass registry and pass name parsing should be moved out.
+static llvm::ManagedStatic<llvm::DenseMap<const void *, PassInfo>> passRegistry;
+
+void mlir::registerPass(StringRef arg, StringRef description,
+ const void *passID,
+ const PassAllocatorFunction &function) {
+ bool inserted = passRegistry
+ ->insert(std::make_pair(
+ passID, PassInfo(arg, description, passID, function)))
+ .second;
+ assert(inserted && "Pass registered multiple times");
+ (void)inserted;
+}
+
+PassNameParser::PassNameParser(llvm::cl::Option &opt)
+ : llvm::cl::parser<const PassInfo *>(opt) {
+ for (const auto &kv : *passRegistry) {
+ addLiteralOption(kv.second.getPassArgument(), &kv.second,
+ kv.second.getPassDescription());
+ }
+}
+
+void PassNameParser::printOptionInfo(const llvm::cl::Option &O,
+ size_t GlobalWidth) const {
+ PassNameParser *TP = const_cast<PassNameParser *>(this);
+ llvm::array_pod_sort(TP->Values.begin(), TP->Values.end(),
+ [](const PassNameParser::OptionInfo *VT1,
+ const PassNameParser::OptionInfo *VT2) {
+ return VT1->Name.compare(VT2->Name);
+ });
+ using llvm::cl::parser;
+ parser<const PassInfo *>::printOptionInfo(O, GlobalWidth);
+}
OpenPOWER on IntegriCloud