Hello, <div><br></div><div>Please review the following patch that adds extension point "EP_OptimizerLast" to PassManagerBuilder.</div><div><br></div><div>Currently, ThreadSanitizer instrumentation pass (which is a FunctionPass, not a ModulePass) runs as EP_ScalarOptimizerLate.</div>
<div>As the result it instruments functions before inlining, which is wrong. </div><div>Once this patch is in, I'll change ThreadSanitizer to run at EP_OptimizerLast, so that it kicks in after inlining (really last).</div>
<div><br></div><div>An alternative to this change would be to make ThreadSanitizer a ModulePass (kind of sad). </div><div><br></div><div>Thanks, </div><div><br></div><div>--kcc </div><div><br></div><div><div>Index: lib/Transforms/IPO/PassManagerBuilder.cpp</div>
<div>===================================================================</div><div>--- lib/Transforms/IPO/PassManagerBuilder.cpp   (revision 153188)</div><div>+++ lib/Transforms/IPO/PassManagerBuilder.cpp   (working copy)</div>
<div>@@ -202,6 +202,7 @@</div><div>     if (OptLevel > 1)</div><div>       MPM.add(createConstantMergePass());     // Merge dup global constants</div><div>   }</div><div>+  addExtensionsToPM(EP_OptimizerLast, MPM);</div>
<div> }</div><div> </div><div> void PassManagerBuilder::populateLTOPassManager(PassManagerBase &PM,</div><div>Index: include/llvm/Transforms/IPO/PassManagerBuilder.h</div><div>===================================================================</div>
<div>--- include/llvm/Transforms/IPO/PassManagerBuilder.h    (revision 153188)</div><div>+++ include/llvm/Transforms/IPO/PassManagerBuilder.h    (working copy)</div><div>@@ -73,6 +73,10 @@</div><div>     /// cleanup-ish optimizations.</div>
<div>     EP_ScalarOptimizerLate,</div><div> </div><div>+    /// EP_OptimizerLast -- This extension point allows adding passes that</div><div>+    /// run after everything else.</div><div>+    EP_OptimizerLast,</div><div>
+</div><div>     /// EP_EnabledOnOptLevel0 - This extension point allows adding passes that</div><div>     /// should not be disabled by O0 optimization level. The passes will be</div><div>     /// inserted after the inlining pass.</div>
</div><div><br></div><div><br></div>