I have two passes. The first pass will change the number of funcOp input, and the second pass will use the original input number as a guidance. I create an Analysis
to record the original input number:
#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/Operation.h"
#include "mlir/Support/LLVM.h"
#include "llvm/ADT/StringMap.h"
struct IOMappingAnalysis{
llvm::StringMap<int> FuncNameToInNum;
IOMappingAnalysis(mlir::Operation* op){
auto module = mlir::dyn_cast<mlir::ModuleOp>(op);
for(auto func:module.getOps<mlir::func::FuncOp>()){
FuncNameToInNum[func->getName().getStringRef()] = func.getNumArguments();
// debug info
llvm::outs() << "func name: " << func.getName() << " in num: " << func.getNumArguments() << "\n";
}
}
};
And use them in pass1 and pass2:
# pass1
void Pass1::runOnOperation() {
auto module = getOperation();
auto a = getAnalysis<IOMappingAnalysis>();
markAnalysesPreserved<IOMappingAnalysis>();
...# do sth
}
# pass2
void Pass2::runOnOperation(){
auto module = getOperation();
IOMappingAnalysis &IOMappingAns = getAnalysis<IOMappingAnalysis>();
for(auto funcOp:module.getOps<mlir::func::FuncOp>()){
funcOp.walk([&](mlir::func::FuncOp op){
llvm::outs() << "func name: " << op.getName() << " in num: " << IOMappingAns.FuncNameToInNum[op.getName().str()] << "\n";
});
}
}
After running it, I got:
func name: __inference_pruned_20 in num: 1
func name: __inference_pruned_20 in num: 0
The result of previous analysis is not preserved. Is it a right choice to use Analysis for information perserving?