forked from OSchip/llvm-project
[Pipelines] Introduce DAE after ArgumentPromotion
The ArgumentPromotion pass uses Mem2Reg promotion at the end to cutting down generated `alloca` instructions as well as meaningless `store`s and this behavior can leave unused (dead) arguments. To eliminate the dead arguments and therefore let the DeadCodeElimination remove becoming dead inserted `GEP`s as well as `load`s and `cast`s in the callers, the DeadArgumentElimination pass should be run after the ArgumentPromotion one. Differential Revision: https://reviews.llvm.org/D128830
This commit is contained in:
parent
991cfd1379
commit
3f20dcbf70
|
@ -34,7 +34,6 @@
|
|||
; CHECK-O: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O: Running pass: GlobalOptPass
|
||||
; CHECK-O: Running pass: PromotePass
|
||||
; CHECK-O: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O: Running pass: InstCombinePass on main
|
||||
; CHECK-O: Running pass: SimplifyCFGPass on main
|
||||
; CHECK-O: Running pass: InlinerPass on (main)
|
||||
|
@ -74,6 +73,7 @@
|
|||
; CHECK-O: Running pass: LCSSAPass on main
|
||||
; CHECK-O: Running pass: SimplifyCFGPass on main
|
||||
; CHECK-O: Running pass: InstCombinePass on main
|
||||
; CHECK-O: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O: Running pass: GlobalOptPass
|
||||
; CHECK-O: Running pass: GlobalDCEPass
|
||||
; CHECK-O: Running pass: EliminateAvailableExternallyPass
|
||||
|
|
|
@ -639,7 +639,7 @@ void PassBuilder::addPGOInstrPasses(ModulePassManager &MPM,
|
|||
|
||||
FunctionPassManager FPM;
|
||||
FPM.addPass(SROAPass());
|
||||
FPM.addPass(EarlyCSEPass()); // Catch trivial redundancies.
|
||||
FPM.addPass(EarlyCSEPass()); // Catch trivial redundancies.
|
||||
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
|
||||
true))); // Merge & remove basic blocks.
|
||||
FPM.addPass(InstCombinePass()); // Combine silly sequences.
|
||||
|
@ -734,10 +734,9 @@ PassBuilder::buildInlinerPipeline(OptimizationLevel Level,
|
|||
if (PGOOpt)
|
||||
IP.EnableDeferral = EnablePGOInlineDeferral;
|
||||
|
||||
ModuleInlinerWrapperPass MIWP(
|
||||
IP, PerformMandatoryInliningsFirst,
|
||||
InlineContext{Phase, InlinePass::CGSCCInliner},
|
||||
UseInlineAdvisor, MaxDevirtIterations);
|
||||
ModuleInlinerWrapperPass MIWP(IP, PerformMandatoryInliningsFirst,
|
||||
InlineContext{Phase, InlinePass::CGSCCInliner},
|
||||
UseInlineAdvisor, MaxDevirtIterations);
|
||||
|
||||
// Require the GlobalsAA analysis for the module so we can query it within
|
||||
// the CGSCC pipeline.
|
||||
|
@ -961,10 +960,6 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
|
|||
// constants.
|
||||
MPM.addPass(createModuleToFunctionPassAdaptor(PromotePass()));
|
||||
|
||||
// Remove any dead arguments exposed by cleanups and constant folding
|
||||
// globals.
|
||||
MPM.addPass(DeadArgumentEliminationPass());
|
||||
|
||||
// Create a small function pass pipeline to cleanup after all the global
|
||||
// optimizations.
|
||||
FunctionPassManager GlobalCleanupPM;
|
||||
|
@ -999,6 +994,10 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
|
|||
else
|
||||
MPM.addPass(buildInlinerPipeline(Level, Phase));
|
||||
|
||||
// Remove any dead arguments exposed by cleanups, constant folding globals,
|
||||
// and argument promotion.
|
||||
MPM.addPass(DeadArgumentEliminationPass());
|
||||
|
||||
MPM.addPass(CoroCleanupPass());
|
||||
|
||||
if (EnableMemProfiler && Phase != ThinOrFullLTOPhase::ThinLTOPreLink) {
|
||||
|
@ -1596,9 +1595,6 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
|
|||
// keep one copy of each constant.
|
||||
MPM.addPass(ConstantMergePass());
|
||||
|
||||
// Remove unused arguments from functions.
|
||||
MPM.addPass(DeadArgumentEliminationPass());
|
||||
|
||||
// Reduce the code after globalopt and ipsccp. Both can open up significant
|
||||
// simplification opportunities, and both can propagate functions through
|
||||
// function pointers. When this happens, we often have to resolve varargs
|
||||
|
@ -1621,7 +1617,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
|
|||
getInlineParamsFromOptLevel(Level),
|
||||
/* MandatoryFirst */ true,
|
||||
InlineContext{ThinOrFullLTOPhase::FullLTOPostLink,
|
||||
InlinePass::CGSCCInliner}));
|
||||
InlinePass::CGSCCInliner}));
|
||||
|
||||
// Optimize globals again after we ran the inliner.
|
||||
MPM.addPass(GlobalOptPass());
|
||||
|
@ -1633,6 +1629,9 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
|
|||
// transform it to pass arguments by value instead of by reference.
|
||||
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(ArgumentPromotionPass()));
|
||||
|
||||
// Remove unused arguments from functions.
|
||||
MPM.addPass(DeadArgumentEliminationPass());
|
||||
|
||||
FunctionPassManager FPM;
|
||||
// The IPO Passes may leave cruft around. Clean up after them.
|
||||
FPM.addPass(InstCombinePass());
|
||||
|
@ -1695,7 +1694,6 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
|
|||
MainFPM.addPass(DSEPass());
|
||||
MainFPM.addPass(MergedLoadStoreMotionPass());
|
||||
|
||||
|
||||
if (EnableConstraintElimination)
|
||||
MainFPM.addPass(ConstraintEliminationPass());
|
||||
|
||||
|
@ -1720,8 +1718,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
|
|||
addVectorPasses(Level, MainFPM, /* IsFullLTO */ true);
|
||||
|
||||
// Run the OpenMPOpt CGSCC pass again late.
|
||||
MPM.addPass(
|
||||
createModuleToPostOrderCGSCCPassAdaptor(OpenMPOptCGSCCPass()));
|
||||
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(OpenMPOptCGSCCPass()));
|
||||
|
||||
invokePeepholeEPCallbacks(MainFPM, Level);
|
||||
MainFPM.addPass(JumpThreadingPass());
|
||||
|
|
|
@ -112,7 +112,6 @@
|
|||
; CHECK-O-NEXT: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: PromotePass
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: InstCombinePass
|
||||
; CHECK-O-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
|
||||
; CHECK-O-NEXT: Running analysis: AAManager
|
||||
|
@ -219,6 +218,7 @@
|
|||
; CHECK-O-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: InlineAdvisorAnalysis
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: CoroCleanupPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalDCEPass
|
||||
|
|
|
@ -75,7 +75,6 @@
|
|||
; CHECK-O23SZ-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O23SZ-NEXT: Running pass: PromotePass
|
||||
; CHECK-O23SZ-NEXT: Running pass: ConstantMergePass
|
||||
; CHECK-O23SZ-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O23SZ-NEXT: Running pass: InstCombinePass
|
||||
; CHECK-O3-NEXT: Running pass: AggressiveInstCombinePass
|
||||
; CHECK-EP-Peephole-NEXT: Running pass: NoOpFunctionPass
|
||||
|
@ -87,6 +86,7 @@
|
|||
; CHECK-O23SZ-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O23SZ-NEXT: Running pass: GlobalDCEPass
|
||||
; CHECK-O23SZ-NEXT: Running pass: ArgumentPromotionPass
|
||||
; CHECK-O23SZ-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O23SZ-NEXT: Running pass: InstCombinePass
|
||||
; CHECK-EP-Peephole-NEXT: Running pass: NoOpFunctionPass
|
||||
; CHECK-O23SZ-NEXT: Running pass: JumpThreadingPass
|
||||
|
|
|
@ -78,7 +78,6 @@
|
|||
; CHECK-O-NEXT: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: PromotePass
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: InstCombinePass
|
||||
; CHECK-PRELINK-O-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
|
||||
; CHECK-O-NEXT: Running analysis: AAManager
|
||||
|
@ -188,6 +187,7 @@
|
|||
; CHECK-O-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: InlineAdvisorAnalysis
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: CoroCleanupPass
|
||||
; CHECK-PRELINK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-POSTLINK-O-NEXT: Running pass: GlobalOptPass
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
; CHECK-O-NEXT: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: PromotePass
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: InstCombinePass
|
||||
; CHECK-O-NEXT: Running analysis: AAManager
|
||||
; CHECK-O-NEXT: Running analysis: BasicAA
|
||||
|
@ -160,6 +159,7 @@
|
|||
; CHECK-O-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: InlineAdvisorAnalysis
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: CoroCleanupPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalDCEPass
|
||||
|
|
|
@ -62,7 +62,6 @@
|
|||
; CHECK-O-NEXT: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: PromotePass
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: InstCombinePass
|
||||
; CHECK-O-NEXT: Running analysis: BlockFrequencyAnalysis on foo
|
||||
; These next two can appear in any order since they are accessed as parameters
|
||||
|
@ -172,6 +171,7 @@
|
|||
; CHECK-O-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: InlineAdvisorAnalysis
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: CoroCleanupPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalDCEPass
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
; CHECK-O-NEXT: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: PromotePass
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: InstCombinePass
|
||||
; CHECK-O-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
|
||||
; CHECK-O-NEXT: Running analysis: AAManager
|
||||
|
@ -201,6 +200,7 @@
|
|||
; CHECK-O-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: InlineAdvisorAnalysis
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: CoroCleanupPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis on bar
|
||||
|
|
|
@ -58,7 +58,6 @@
|
|||
; CHECK-O-NEXT: Running pass: CalledValuePropagationPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: PromotePass
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: InstCombinePass
|
||||
; CHECK-O-NEXT: Running analysis: BlockFrequencyAnalysis on foo
|
||||
; These next two can appear in any order since they are accessed as parameters
|
||||
|
@ -166,6 +165,7 @@
|
|||
; CHECK-O-NEXT: Running pass: InvalidateAnalysisPass<{{.*}}ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: ShouldNotRunFunctionPassesAnalysis
|
||||
; CHECK-O-NEXT: Invalidating analysis: InlineAdvisorAnalysis
|
||||
; CHECK-O-NEXT: Running pass: DeadArgumentEliminationPass
|
||||
; CHECK-O-NEXT: Running pass: CoroCleanupPass
|
||||
; CHECK-O-NEXT: Running pass: GlobalOptPass
|
||||
; CHECK-O-NEXT: Running pass: AnnotationRemarksPass on foo
|
||||
|
|
|
@ -9,7 +9,7 @@ target triple = "x86_64-unknown-linux-gnu"
|
|||
|
||||
define i32 @main(i32 %argc, i8** %argv) #0 {
|
||||
; CHECK-LABEL: define {{[^@]+}}@main
|
||||
; CHECK-SAME: (i32 [[ARGC:%.*]], i8** nocapture readnone [[ARGV:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
|
||||
; CHECK-SAME: (i32 [[ARGC:%.*]], i8** nocapture readonly [[ARGV:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i32 [[ARGC]], 2
|
||||
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP0]], i32 0, i32 [[ARGC]]
|
||||
|
@ -37,7 +37,8 @@ done:
|
|||
|
||||
define i32 @compute(i8* noundef nonnull %ptr, i32 %x) #1 {
|
||||
; CHECK-LABEL: define {{[^@]+}}@compute
|
||||
; CHECK-SAME: (i8* nocapture nonnull readnone [[PTR:%.*]], i32 returned [[X:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] {
|
||||
; CHECK-SAME: (i8* nocapture noundef nonnull readnone [[PTR:%.*]], i32 returned [[X:%.*]])
|
||||
; CHECK-SAME: local_unnamed_addr #[[ATTR1:[0-9]+]] {
|
||||
; CHECK-NEXT: ret i32 [[X]]
|
||||
;
|
||||
ret i32 %x
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
define internal void @f(%struct.ss* byval(%struct.ss) align 8 %b, i32* byval(i32) align 4 %X) noinline nounwind {
|
||||
; CHECK-LABEL: define {{[^@]+}}@f
|
||||
; CHECK-SAME: (i32 [[B_0:%.*]], i32 [[X:%.*]]){{[^#]*}} #[[ATTR0:[0-9]+]] {
|
||||
; CHECK-SAME: (i32 [[B_0:%.*]]){{[^#]*}} #[[ATTR0:[0-9]+]] {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TEMP:%.*]] = add i32 [[B_0]], 1
|
||||
; CHECK-NEXT: store i32 [[TEMP]], i32* [[DUMMY]], align 4
|
||||
|
@ -28,8 +28,7 @@ define i32 @test(i32* %X) {
|
|||
; CHECK-LABEL: define {{[^@]+}}@test
|
||||
; CHECK-SAME: (i32* {{[^%]*}} [[X:%.*]]){{[^#]*}} #[[ATTR1:[0-9]+]] {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[X_VAL:%.*]] = load i32, i32* [[X]], align 4
|
||||
; CHECK-NEXT: tail call {{.*}}void @f(i32 1, i32 [[X_VAL]])
|
||||
; CHECK-NEXT: tail call {{.*}}void @f(i32 1)
|
||||
; CHECK-NEXT: ret i32 0
|
||||
;
|
||||
entry:
|
||||
|
|
Loading…
Reference in New Issue