How to pass information between different passes?

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?