<div dir="rtl"><div dir="ltr">Hi,</div><div dir="ltr"><br></div><div dir="ltr">Turns out that EmitAssemblyHelper adds the <span style="font-family:arial,sans-serif;font-size:12.7272720336914px">TargetPassConfig  passes *on top* of other passes coming from </span><font face="arial, sans-serif">PMBuilder.</font></div><div dir="ltr">That seems to lead to strange results. For instance, TM->addAnalysisPasses(PM) is called twice for the same PassManager, first from EmitAssemblyHelper::AddEmitPasses() then from addPassesToGenerateCode.</div><div dir="ltr"><br></div><div dir="ltr"><div dir="ltr" style="font-family:arial,sans-serif">SROA is done twice, once from PassManagerBuilder::populateModulePassManager() and then from PassManagerBuilder::populateFunctionPassManager().</div></div><div dir="ltr"><font face="arial, sans-serif"><br></font></div><div dir="ltr"><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.7272720336914px">There are other duplications between the three pass collections which may be slowing down optimization.</span></div><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.7272720336914px"><br></span></div><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.7272720336914px">OTOH MCJIT does not use the second set of optimizations coming form </span><span style="font-family:arial,sans-serif">PMBuilder</span><span style="font-family:arial,sans-serif"> and not </span><span style="font-size:12.7272720336914px;font-family:arial,sans-serif">TargetPassConfig.</span></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif"><br></span></div></div><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.7272720336914px">Below is the full structure output from </span><font face="arial, sans-serif">clang++ -mllvm -debug-pass=Structure -O2</font></div><div dir="ltr"><font face="arial, sans-serif">The passes following </font><span style="font-family:arial,sans-serif">###### are coming from </span><span style="font-size:12.7272720336914px;font-family:arial,sans-serif">TargetPassConfig and identical to what you get for MCJIT.</span><br></div><div dir="ltr"><br></div><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.7272720336914px">Does this pass structure makes sense?</span></div><div dir="ltr"><br></div><div dir="ltr"><font face="arial, sans-serif">Yaron</font></div><div dir="ltr"><font face="arial, sans-serif"><br></font></div><div dir="ltr"><font face="arial, sans-serif"><br></font></div><div dir="ltr"><font face="arial, sans-serif"><br></font></div><div dir="ltr"><font face="arial, sans-serif"><div dir="ltr">Pass Arguments:  -datalayout -notti -basictti -x86tti -targetlibinfo -no-aa -tbaa -scoped-noalias -basicaa -verify -add-discriminators -simplifycfg -domtree -sroa -early-cse -lower-expect</div><div dir="ltr">Data Layout</div><div dir="ltr">No target information</div><div dir="ltr">Target independent code generator's TTI</div><div dir="ltr">X86 Target Transform Info</div><div dir="ltr">Target Library Information</div><div dir="ltr">No Alias Analysis (always returns 'may' alias)</div><div dir="ltr">Type-Based Alias Analysis</div><div dir="ltr">Scoped NoAlias Alias Analysis</div><div dir="ltr">Basic Alias Analysis (stateless AA impl)</div><div dir="ltr">  FunctionPass Manager</div><div dir="ltr">    Module Verifier</div><div dir="ltr">    Add DWARF path discriminators</div><div dir="ltr">    Simplify the CFG</div><div dir="ltr">    Dominator Tree Construction</div><div dir="ltr">    SROA</div><div dir="ltr">    Early CSE</div><div dir="ltr">    Lower 'expect' Intrinsics</div><div dir="ltr">Pass Arguments:  -datalayout -notti -basictti -x86tti -targetlibinfo -no-aa -tbaa -scoped-noalias -basicaa -verify-di -ipsccp -globalopt -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -inline-cost -inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -loop-unswitch -instcombine -scalar-evolution -lcssa -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -mldst-motion -domtree -memdep -gvn -memdep -memcpyopt -sccp -instcombine -lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -loops -scalar-evolution -slp-vectorizer -adce -simplifycfg -instcombine -barrier -domtree -loops -loop-simplify -lcssa -branch-prob -block-freq -scalar-evolution -loop-vectorize -instcombine -simplifycfg -domtree -loops -loop-simplify -lcssa -scalar-evolution -loop-unroll -strip-dead-prototypes -globaldce -constmerge</div><div dir="ltr">Data Layout</div><div dir="ltr">No target information</div><div dir="ltr">Target independent code generator's TTI</div><div dir="ltr">X86 Target Transform Info</div><div dir="ltr">Target Library Information</div><div dir="ltr">No Alias Analysis (always returns 'may' alias)</div><div dir="ltr">Type-Based Alias Analysis</div><div dir="ltr">Scoped NoAlias Alias Analysis</div><div dir="ltr">Basic Alias Analysis (stateless AA impl)</div><div dir="ltr">  ModulePass Manager</div><div dir="ltr">    Debug Info Verifier</div><div dir="ltr">    Interprocedural Sparse Conditional Constant Propagation</div><div dir="ltr">    Global Variable Optimizer</div><div dir="ltr">    Dead Argument Elimination</div><div dir="ltr">    FunctionPass Manager</div><div dir="ltr">      Combine redundant instructions</div><div dir="ltr">      Simplify the CFG</div><div dir="ltr">    CallGraph Construction</div><div dir="ltr">    Call Graph SCC Pass Manager</div><div dir="ltr">      Remove unused exception handling info</div><div dir="ltr">      Inline Cost Analysis</div><div dir="ltr">      Function Integration/Inlining</div><div dir="ltr">      Deduce function attributes</div><div dir="ltr">      FunctionPass Manager</div><div dir="ltr">        SROA</div><div dir="ltr">        Dominator Tree Construction</div><div dir="ltr">        Early CSE</div><div dir="ltr">        Lazy Value Information Analysis</div><div dir="ltr">        Jump Threading</div><div dir="ltr">        Value Propagation</div><div dir="ltr">        Simplify the CFG</div><div dir="ltr">        Combine redundant instructions</div><div dir="ltr">        Tail Call Elimination</div><div dir="ltr">        Simplify the CFG</div><div dir="ltr">        Reassociate expressions</div><div dir="ltr">        Dominator Tree Construction</div><div dir="ltr">        Natural Loop Information</div><div dir="ltr">        Canonicalize natural loops</div><div dir="ltr">        Loop-Closed SSA Form Pass</div><div dir="ltr">        Loop Pass Manager</div><div dir="ltr">          Rotate Loops</div><div dir="ltr">          Loop Invariant Code Motion</div><div dir="ltr">          Unswitch loops</div><div dir="ltr">        Combine redundant instructions</div><div dir="ltr">        Scalar Evolution Analysis</div><div dir="ltr">        Loop-Closed SSA Form Pass</div><div dir="ltr">        Loop Pass Manager</div><div dir="ltr">          Induction Variable Simplification</div><div dir="ltr">          Recognize loop idioms</div><div dir="ltr">          Delete dead loops</div><div dir="ltr">          Unroll loops</div><div dir="ltr">        Memory Dependence Analysis</div><div dir="ltr">        MergedLoadStoreMotion</div><div dir="ltr">        Dominator Tree Construction</div><div dir="ltr">        Memory Dependence Analysis</div><div dir="ltr">        Global Value Numbering</div><div dir="ltr">        Memory Dependence Analysis</div><div dir="ltr">        MemCpy Optimization</div><div dir="ltr">        Sparse Conditional Constant Propagation</div><div dir="ltr">        Combine redundant instructions</div><div dir="ltr">        Lazy Value Information Analysis</div><div dir="ltr">        Jump Threading</div><div dir="ltr">        Value Propagation</div><div dir="ltr">        Dominator Tree Construction</div><div dir="ltr">        Memory Dependence Analysis</div><div dir="ltr">        Dead Store Elimination</div><div dir="ltr">        Natural Loop Information</div><div dir="ltr">        Scalar Evolution Analysis</div><div dir="ltr">        SLP Vectorizer</div><div dir="ltr">        Aggressive Dead Code Elimination</div><div dir="ltr">        Simplify the CFG</div><div dir="ltr">        Combine redundant instructions</div><div dir="ltr">    A No-Op Barrier Pass</div><div dir="ltr">    FunctionPass Manager</div><div dir="ltr">      Dominator Tree Construction</div><div dir="ltr">      Natural Loop Information</div><div dir="ltr">      Canonicalize natural loops</div><div dir="ltr">      Loop-Closed SSA Form Pass</div><div dir="ltr">      Branch Probability Analysis</div><div dir="ltr">      Block Frequency Analysis</div><div dir="ltr">      Scalar Evolution Analysis</div><div dir="ltr">      Loop Vectorization</div><div dir="ltr">      Combine redundant instructions</div><div dir="ltr">      Simplify the CFG</div><div dir="ltr">      Dominator Tree Construction</div><div dir="ltr">      Natural Loop Information</div><div dir="ltr">      Canonicalize natural loops</div><div dir="ltr">      Loop-Closed SSA Form Pass</div><div dir="ltr">      Scalar Evolution Analysis</div><div dir="ltr">      Loop Pass Manager</div><div dir="ltr">        Unroll loops</div><div dir="ltr">    Strip Unused Function Prototypes</div><div dir="ltr">    Dead Global Elimination</div><div dir="ltr">    Merge Duplicate Global Constants</div><div dir="ltr">########################<br></div><div dir="ltr">Pass Arguments:  -datalayout -notti -basictti -x86tti -targetlibinfo -jump-instr-table-info -targetpassconfig -no-aa -tbaa -scoped-noalias -basicaa -collector-metadata -machinemoduleinfo -machine-branch-prob -jump-instr-tables -verify -verify-di -domtree -loops -loop-simplify -scalar-evolution -iv-users -loop-reduce -gc-lowering -unreachableblockelim -consthoist -partially-inline-libcalls -codegenprepare -verify-di -stack-protector -verify -domtree -loops -branch-prob -expand-isel-pseudos -tailduplication -opt-phis -machinedomtree -slotindexes -stack-coloring -localstackalloc -dead-mi-elimination -machinedomtree -machine-loops -machine-trace-metrics -early-ifcvt -machinelicm -machine-cse -machine-sink -peephole-opts -processimpdefs -unreachable-mbb-elimination -livevars -phi-node-elimination -twoaddressinstruction -slotindexes -liveintervals -simple-register-coalescing -misched -machine-block-freq -livedebugvars -livestacks -virtregmap -liveregmatrix -edge-bundles -spill-code-placement -virtregrewriter -stack-slot-coloring -machinelicm -edge-bundles -prologepilog -machine-block-freq -branch-folder -tailduplication -machine-cp -postrapseudos -machinedomtree -machine-loops -post-RA-sched -gc-analysis -machine-block-freq -block-placement2 -stackmap-liveness</div><div dir="ltr">Data Layout</div><div dir="ltr">No target information</div><div dir="ltr">Target independent code generator's TTI</div><div dir="ltr">X86 Target Transform Info</div><div dir="ltr">Target Library Information</div><div dir="ltr">Jump-Instruction Table Info</div><div dir="ltr">Target Pass Configuration</div><div dir="ltr">No Alias Analysis (always returns 'may' alias)</div><div dir="ltr">Type-Based Alias Analysis</div><div dir="ltr">Scoped NoAlias Alias Analysis</div><div dir="ltr">Basic Alias Analysis (stateless AA impl)</div><div dir="ltr">Create Garbage Collector Module Metadata</div><div dir="ltr">Machine Module Information</div><div dir="ltr">Machine Branch Probability Analysis</div><div dir="ltr">  ModulePass Manager</div><div dir="ltr">    Jump-Instruction Tables</div><div dir="ltr">    FunctionPass Manager</div><div dir="ltr">      Unnamed pass: implement Pass::getPassName()</div><div dir="ltr">      Module Verifier</div><div dir="ltr">    Debug Info Verifier</div><div dir="ltr">    FunctionPass Manager</div><div dir="ltr">      Dominator Tree Construction</div><div dir="ltr">      Natural Loop Information</div><div dir="ltr">      Canonicalize natural loops</div><div dir="ltr">      Scalar Evolution Analysis</div><div dir="ltr">      Loop Pass Manager</div><div dir="ltr">        Induction Variable Users</div><div dir="ltr">        Loop Strength Reduction</div><div dir="ltr">      Lower Garbage Collection Instructions</div><div dir="ltr">      Remove unreachable blocks from the CFG</div><div dir="ltr">      Constant Hoisting</div><div dir="ltr">      Partially inline calls to library functions</div><div dir="ltr">      CodeGen Prepare</div><div dir="ltr">      Exception handling preparation</div><div dir="ltr">    Debug Info Verifier</div><div dir="ltr">    FunctionPass Manager</div><div dir="ltr">      Insert stack protectors</div><div dir="ltr">      Module Verifier</div><div dir="ltr">      Machine Function Analysis</div><div dir="ltr">      Dominator Tree Construction</div><div dir="ltr">      Natural Loop Information</div><div dir="ltr">      Branch Probability Analysis</div><div dir="ltr">      X86 DAG->DAG Instruction Selection</div><div dir="ltr">      X86 PIC Global Base Reg Initialization</div><div dir="ltr">      Expand ISel Pseudo-instructions</div><div dir="ltr">      Tail Duplication</div><div dir="ltr">      Optimize machine instruction PHIs</div><div dir="ltr">      MachineDominator Tree Construction</div><div dir="ltr">      Slot index numbering</div><div dir="ltr">      Merge disjoint stack slots</div><div dir="ltr">      Local Stack Slot Allocation</div><div dir="ltr">      Remove dead machine instructions</div><div dir="ltr">      MachineDominator Tree Construction</div><div dir="ltr">      Machine Natural Loop Construction</div><div dir="ltr">      Machine Trace Metrics</div><div dir="ltr">      Early If-Conversion</div><div dir="ltr">      Machine Loop Invariant Code Motion</div><div dir="ltr">      Machine Common Subexpression Elimination</div><div dir="ltr">      Machine code sinking</div><div dir="ltr">      Peephole Optimizations</div><div dir="ltr">      Process Implicit Definitions</div><div dir="ltr">      Remove unreachable machine basic blocks</div><div dir="ltr">      Live Variable Analysis</div><div dir="ltr">      Eliminate PHI nodes for register allocation</div><div dir="ltr">      Two-Address instruction pass</div><div dir="ltr">      Slot index numbering</div><div dir="ltr">      Live Interval Analysis</div><div dir="ltr">      Simple Register Coalescing</div><div dir="ltr">      Machine Instruction Scheduler</div><div dir="ltr">      Machine Block Frequency Analysis</div><div dir="ltr">      Debug Variable Analysis</div><div dir="ltr">      Live Stack Slot Analysis</div><div dir="ltr">      Virtual Register Map</div><div dir="ltr">      Live Register Matrix</div><div dir="ltr">      Bundle Machine CFG Edges</div><div dir="ltr">      Spill Code Placement Analysis</div><div dir="ltr">      Greedy Register Allocator</div><div dir="ltr">      Virtual Register Rewriter</div><div dir="ltr">      Stack Slot Coloring</div><div dir="ltr">      Machine Loop Invariant Code Motion</div><div dir="ltr">      Bundle Machine CFG Edges</div><div dir="ltr">      X86 FP Stackifier</div><div dir="ltr">      Prologue/Epilogue Insertion & Frame Finalization</div><div dir="ltr">      Machine Block Frequency Analysis</div><div dir="ltr">      Control Flow Optimizer</div><div dir="ltr">      Tail Duplication</div><div dir="ltr">      Machine Copy Propagation Pass</div><div dir="ltr">      Post-RA pseudo instruction expansion pass</div><div dir="ltr">      MachineDominator Tree Construction</div><div dir="ltr">      Machine Natural Loop Construction</div><div dir="ltr">      Post RA top-down list latency scheduler</div><div dir="ltr">      Analyze Machine Code For Garbage Collection</div><div dir="ltr">      Machine Block Frequency Analysis</div><div dir="ltr">      Branch Probability Basic Block Placement</div><div dir="ltr">      Execution dependency fix</div><div dir="ltr">      X86 vzeroupper inserter</div><div dir="ltr">      X86 Atom pad short functions</div><div dir="ltr">      X86 LEA Fixup</div><div dir="ltr">      StackMap Liveness Analysis</div><div dir="ltr">      X86 Assembly / Object Emitter</div></font></div><div dir="ltr"><font face="arial, sans-serif"><br></font></div><div dir="ltr"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div dir="ltr">2014-09-10 6:07 GMT+03:00 Philip Reames <span dir="ltr"><<a href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span>:</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 09/09/2014 07:14 AM, Yaron Keren wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
clang uses PassManagerBuilder via EmitAssemblyHelper::<u></u>CreatePasses() to create a collection of passes.<br>
<br>
llvm (MCJIT) uses TargetPassConfig via addPassesToGenerateCode for the same purpose.<br>
<br>
There seems to some duplication and many differences between PassManagerBuilder and TargetPassConfig, some aren't clear at all.<br>
<br>
Two small examples:<br>
<br>
1) PassManagerBuilder adds createScalarReplAggregatesPass but TargetPassConfig does not.<br>
<br>
2)  TargetPassConfig adds createLoopStrengthReducePass right after the initial analysis but TargetPassConfig  does not.<br>
<br>
I would expect that the optimization passes would be identical based on optimization level only but they are quite different between PassManagerBuilder and TargetPassConfig.<br>
</blockquote></div></div>
I'm not aware of any reason these two should differ.  I suspect this is simply a case of copied code which has devolved over time.<span class="HOEnZb"><font color="#888888"><br>
<br>
Philip<br>
</font></span></blockquote></div><br></div>