Index: lib/Transforms/IPO/PassManagerBuilder.cpp =================================================================== --- lib/Transforms/IPO/PassManagerBuilder.cpp +++ lib/Transforms/IPO/PassManagerBuilder.cpp @@ -404,6 +404,19 @@ // we must insert a no-op module pass to reset the pass manager. MPM.add(createBarrierNoopPass()); + if (!DisableUnitAtATime && OptLevel > 1 && !PrepareForLTO && + !PrepareForThinLTO) + // Remove avail extern fns and globals definitions if we aren't + // compiling an object file for later LTO. For LTO we want to preserve + // these so they are eligible for inlining at link-time. Note if they + // are unreferenced they will be removed by GlobalDCE later, so + // this only impacts referenced available externally globals. + // Eventually they will be suppressed during codegen, but eliminating + // here enables more opportunity for GlobalDCE as it may make + // globals referenced by available external functions dead + // and saves running remaining passes on the eliminated functions. + MPM.add(createEliminateAvailableExternallyPass()); + if (!DisableUnitAtATime) MPM.add(createReversePostOrderFunctionAttrsPass()); @@ -428,18 +441,6 @@ MPM.add(createLICMPass()); // Hoist loop invariants } - if (!DisableUnitAtATime && OptLevel > 1 && !PrepareForLTO) - // Remove avail extern fns and globals definitions if we aren't - // compiling an object file for later LTO. For LTO we want to preserve - // these so they are eligible for inlining at link-time. Note if they - // are unreferenced they will be removed by GlobalDCE later, so - // this only impacts referenced available externally globals. - // Eventually they will be suppressed during codegen, but eliminating - // here enables more opportunity for GlobalDCE as it may make - // globals referenced by available external functions dead - // and saves running remaining passes on the eliminated functions. - MPM.add(createEliminateAvailableExternallyPass()); - if (PerformThinLTO) { // Remove dead fns and globals. Removing unreferenced functions could lead // to more opportunities for globalopt. Index: test/Other/pass-pipelines.ll =================================================================== --- test/Other/pass-pipelines.ll +++ test/Other/pass-pipelines.ll @@ -55,7 +55,10 @@ ; Next we break out of the main Function passes inside the CGSCC pipeline with ; a barrier pass. ; CHECK-O2: A No-Op Barrier Pass -; Inferring function attribute should be immediately after the CGSCC pipeline. +; Reduce the size of the IR ASAP after the inliner. +; CHECK-O2-NEXT: Eliminate Available Externally +; Inferring function attribute should be right after the CGSCC pipeline, before +; any other optimizations/analyses. ; CHECK-O2-NEXT: CallGraph ; CHECK-O2-NEXT: Deduce function attributes in RPO ; CHECK-O2-NOT: Manager