How inline helps devirtualization in ModuleInlinerWrapperPass?

Hello all:
I’m interested in inline and devirtualization implementation in llvm. Then I read code below:
https://github.com/llvm/llvm-project/blob/main/llvm/lib/Transforms/IPO/Inliner.cpp#:~:text=PreservedAnalyses%20ModuleInlinerWrapperPass%3A%3Arun,ModuleAnalysisManager%20%26MAM)
I found code below:

if (MaxDevirtIterations == 0)
    MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(PM)));
  else
    MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(
        createDevirtSCCRepeatedPass(std::move(PM), MaxDevirtIterations)));

In ModuleInlinerWrapperPass constructor, I found PM only add InlinerPass. So in DevirtSCCRepeatedPass::run function,during each interation, we first run inline pass, then do devirtualization? The code location is below:

Do we need some alias analysis or other pass between inline and devirtualization which can help us do devirtualization better?
Thank you very much!
ZXL

Take a look at PassBuilder::buildInlinerPipeline and how it sets up the module inliner (L707 onward)