<div dir="ltr"><div>I've managed somehow to pass the fp_manager.run using:</div><div><br></div><div>auto loop_manager = llvm::LoopAnalysisManager{};<br>auto cgscc_manager = llvm::CGSCCAnalysisManager{};<br>auto mod_manager = llvm::ModuleAnalysisManager{};</div><div><br></div><div>pass_builder.registerModuleAnalyses(mod_manager);<br>pass_builder.registerCGSCCAnalyses(cgscc_manager);<br>pass_builder.registerFunctionAnalyses(fa_manager);<br>pass_builder.registerLoopAnalyses(loop_manager);<br>pass_builder.crossRegisterProxies(loop_manager, fa_manager, cgscc_manager, mod_manager);</div><div><br></div><div>auto fp_manager = pass_builder.buildFunctionSimplificationPipeline(llvm::PassBuilder::OptimizationLevel::O2, llvm::PassBuilder::ThinLTOPhase::None, true);</div><div><br></div><div>fp_manager.run(*lift_func, fa_manager);</div><div><br></div><div>...print module...</div><div><br></div><div>but the program still crashes when the object `fa_manager` (of class FunctionAnalysisManager) is destroyed!!!<br></div></div><br><div class="gmail_quote"><div dir="ltr">Le mar. 21 août 2018 à 14:32, Ta Thanh Dinh <<a href="mailto:tathanhdinh@gmail.com">tathanhdinh@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi Philip, <br></div><div><br></div><div>Thanks for the response. Under llvm-5.0.2 and llvm-6.0.1 in Debug mode, the crash hit at the same assertion:</div><div><br></div><div>/usr/local/include/llvm/IR/PassManager.h:689: typename PassT::Result& llvm::AnalysisManager<IRUnitT, ExtraArgTs>::getResult(IRUnitT&, ExtraArgTs ...) [with PassT = llvm::InnerAnalysisManagerProxy<llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::Function>; IRUnitT = llvm::Function; ExtraArgTs = {}; typename PassT::Result = llvm::InnerAnalysisManagerProxy<llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::Function>::Result]: Assertion `AnalysisPasses.count(PassT::ID()) && "This analysis pass was not registered prior to being queried"' failed.</div><div><br></div><div>I'm new to llvm optimization and I still don't know which analysis managers should be created and populated in this case. Many thanks for any help.<br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">Le mar. 21 août 2018 à 14:00, Philip Pfaffe <<a href="mailto:philip.pfaffe@gmail.com" target="_blank">philip.pfaffe@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Can you tell us more about the crash? I.e., do you have a stack dump? Does it hit an assertion (if your LLVM is built in Debug mode/has assertions enabled)?</div><div><br></div>Generally, PassBuilder and passes likely assume a full stack of analysis managers. You should thus create and populate all of them, not just FunctionAM, and cross-register their proxies.<div><br></div><div>Cheers,</div><div>Philip</div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Aug 20, 2018 at 7:29 PM Ta Thanh Dinh via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  

    
  
  <div text="#000000" bgcolor="#FFFFFF">
    <p>This question has been submitted to stackoverflow
(<a class="m_-7694396252024853010m_5821906556133116441m_4744201818067410844moz-txt-link-freetext" href="https://stackoverflow.com/questions/51934964/function-optimization-pass" target="_blank">https://stackoverflow.com/questions/51934964/function-optimization-pass</a>)
      but someone suggested me that it should be submitted to llvm-dev
      mailing list instead. I'm sorry for the duplication.</p>
    <p>I am trying to use PassBulider and FunctionPassManager <code></code>
      to optimize a function in a module, what I have done is:</p>
    <p><br>
    </p>
    <p>mod = ...load module from LLVM IR bitcode file go_back.bc...<br>
      <br>
      auto lift_func = mod->getFunction("go_back");<br>
      if (not lift_func) {<br>
          llvm::errs() << "Error: cannot get function\n";<br>
          return 0;<br>
      }<br>
      <br>
      auto pass_builder = llvm::PassBuilder{};<br>
      auto fa_manager = llvm::FunctionAnalysisManager{};<br>
      <br>
      pass_builder.registerFunctionAnalyses(fa_manager);<br>
      auto fp_manager =
pass_builder.buildFunctionSimplificationPipeline(llvm::PassBuilder::OptimizationLevel::O2);<br>
      <br>
      fp_manager.run(*lift_func, fa_manager);</p>
    <p>...print mod...</p>
    <p><br>
    </p>
    <p>but the program crashes always at fp_manager.run. Strange enough,
      LLVM's opt tool (which uses legacy optimization API) works without
      any problem, i.e if I run</p>
    <p>opt -O2 go_back.bc -o go_back_o2.bc</p>
    <p>then I get a new module where the (single) function go_back is
      optimized.</p>
    <p>Many thanks for any response.</p>
    <p>NB. The disassembled LLVM bitcode is at
      <a class="m_-7694396252024853010m_5821906556133116441m_4744201818067410844moz-txt-link-freetext" href="https://gist.github.com/tathanhdinh/23470452910da9f73b857b2e6a12f144" target="_blank">https://gist.github.com/tathanhdinh/23470452910da9f73b857b2e6a12f144</a>
      if anyone wants to take a look.<br>
    </p>
  </div>

_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>
</blockquote></div>
</blockquote></div>