Skip to content

Commit e94b2b9

Browse files
committed
Reland "[LTO] Run Argument Promotion before IPSCCP" (#111839)
Run ArgumentPromotion before IPSCCP in the LTO pipeline, to expose more constants to be propagated. We also run PostOrderFunctionAttrs to improve the information available to ArgumentPromotion's alias analysis, and SROA to clean up allocas.
1 parent f9abf53 commit e94b2b9

File tree

3 files changed

+20
-8
lines changed

3 files changed

+20
-8
lines changed

llvm/lib/Passes/PassBuilderPipelines.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1828,6 +1828,15 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
18281828
MPM.addPass(PGOIndirectCallPromotion(
18291829
true /* InLTO */, PGOOpt && PGOOpt->Action == PGOOptions::SampleUse));
18301830

1831+
// Promoting by-reference arguments to by-value exposes more constants to
1832+
// IPSCCP.
1833+
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(
1834+
PostOrderFunctionAttrsPass(/*SkipNonRecursive*/ true)));
1835+
MPM.addPass(
1836+
createModuleToPostOrderCGSCCPassAdaptor(ArgumentPromotionPass()));
1837+
MPM.addPass(
1838+
createModuleToFunctionPassAdaptor(SROAPass(SROAOptions::ModifyCFG)));
1839+
18311840
// Propagate constants at call sites into the functions they call. This
18321841
// opens opportunities for globalopt (and inlining) by substituting function
18331842
// pointers passed as arguments to direct uses of functions.

llvm/test/Other/new-pm-lto-defaults.ll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,17 @@
4141
; CHECK-O23SZ-NEXT: PGOIndirectCallPromotion
4242
; CHECK-O23SZ-NEXT: Running analysis: ProfileSummaryAnalysis
4343
; CHECK-O23SZ-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
44-
; CHECK-O23SZ-NEXT: Running pass: IPSCCPPass
45-
; CHECK-O23SZ-NEXT: Running analysis: AssumptionAnalysis on foo
46-
; CHECK-O23SZ-NEXT: Running pass: CalledValuePropagationPass
4744
; CHECK-O-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}SCC
4845
; CHECK-O-NEXT: Running analysis: LazyCallGraphAnalysis
4946
; CHECK-O1-NEXT: Running analysis: TargetLibraryAnalysis
5047
; CHECK-O-NEXT: Running analysis: FunctionAnalysisManagerCGSCCProxy
5148
; CHECK-O-NEXT: Running analysis: OuterAnalysisManagerProxy<{{.*}}LazyCallGraph{{.*}}>
49+
; CHECK-O23SZ-NEXT: Running pass: PostOrderFunctionAttrsPass
50+
; CHECK-O23SZ-NEXT: Running pass: ArgumentPromotionPass
51+
; CHECK-O23SZ-NEXT: Running pass: SROAPass
52+
; CHECK-O23SZ-NEXT: Running analysis: AssumptionAnalysis on foo
53+
; CHECK-O23SZ-NEXT: Running pass: IPSCCPPass
54+
; CHECK-O23SZ-NEXT: Running pass: CalledValuePropagationPass
5255
; CHECK-O-NEXT: Running pass: PostOrderFunctionAttrsPass
5356
; CHECK-O-NEXT: Running analysis: AAManager
5457
; CHECK-O-NEXT: Running analysis: BasicAA

llvm/test/Transforms/PhaseOrdering/lto-argpromotion-ipsccp.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt -passes='lto<O3>' -S < %s | FileCheck %s
33

4-
; FIXME: We should be able to propagate the constants from @parent to @child.
4+
; We should be able to propagate the constants from @parent to @child.
55

66
define void @parent(ptr %p) {
77
; CHECK-LABEL: define void @parent(
88
; CHECK-SAME: ptr nocapture [[P:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
9-
; CHECK-NEXT: tail call fastcc void @child(ptr [[P]], i32 1024, i32 5)
9+
; CHECK-NEXT: tail call fastcc void @child(ptr [[P]])
1010
; CHECK-NEXT: ret void
1111
;
1212
%c = alloca i32
@@ -19,18 +19,18 @@ define void @parent(ptr %p) {
1919

2020
define internal void @child(ptr %p, ptr %n, ptr %c) noinline {
2121
; CHECK-LABEL: define internal fastcc void @child(
22-
; CHECK-SAME: ptr nocapture [[P:%.*]], i32 [[N_0_VAL:%.*]], i32 [[C_0_VAL:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] {
22+
; CHECK-SAME: ptr nocapture [[P:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] {
2323
; CHECK-NEXT: [[ENTRY:.*]]:
2424
; CHECK-NEXT: br label %[[FOR_COND:.*]]
2525
; CHECK: [[FOR_COND]]:
2626
; CHECK-NEXT: [[I_0:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[INC:%.*]], %[[FOR_INC:.*]] ]
27-
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[I_0]], [[N_0_VAL]]
27+
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[I_0]], 1024
2828
; CHECK-NEXT: br i1 [[CMP_NOT]], label %[[FOR_END:.*]], label %[[FOR_INC]]
2929
; CHECK: [[FOR_INC]]:
3030
; CHECK-NEXT: [[IDXPROM:%.*]] = zext nneg i32 [[I_0]] to i64
3131
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 [[IDXPROM]]
3232
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
33-
; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[TMP0]], [[C_0_VAL]]
33+
; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[TMP0]], 5
3434
; CHECK-NEXT: store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
3535
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_0]], 1
3636
; CHECK-NEXT: br label %[[FOR_COND]]

0 commit comments

Comments
 (0)