Skip to content

Commit 1032df6

Browse files
authored
[LTO][Pipelines][Coro] Handle coroutines in LTO pipeline (#126168)
ThinLTO delays handling of coroutines to ThinLTO backend. However it's usually possible to use ThinLTO prelink objects for FullLTO. In this case we have left-over coroutines which crash in codegen. Issue #104525.
1 parent 7b473df commit 1032df6

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed

Diff for: llvm/lib/Passes/PassBuilderPipelines.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -1840,6 +1840,8 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
18401840
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr,
18411841
lowertypetests::DropTestKind::Assume));
18421842

1843+
MPM.addPass(buildCoroWrapper(ThinOrFullLTOPhase::FullLTOPostLink));
1844+
18431845
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
18441846

18451847
// Emit annotation remarks.
@@ -1924,6 +1926,8 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
19241926
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr,
19251927
lowertypetests::DropTestKind::Assume));
19261928

1929+
MPM.addPass(buildCoroWrapper(ThinOrFullLTOPhase::FullLTOPostLink));
1930+
19271931
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
19281932

19291933
// Emit annotation remarks.
@@ -1932,6 +1936,9 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
19321936
return MPM;
19331937
}
19341938

1939+
// TODO: Skip to match buildCoroWrapper.
1940+
MPM.addPass(CoroEarlyPass());
1941+
19351942
// Optimize globals to try and fold them into constants.
19361943
MPM.addPass(GlobalOptPass());
19371944

@@ -1997,7 +2004,11 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
19972004

19982005
// If we didn't decide to inline a function, check to see if we can
19992006
// transform it to pass arguments by value instead of by reference.
2000-
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(ArgumentPromotionPass()));
2007+
CGSCCPassManager CGPM;
2008+
CGPM.addPass(ArgumentPromotionPass());
2009+
CGPM.addPass(CoroSplitPass(Level != OptimizationLevel::O0));
2010+
CGPM.addPass(CoroAnnotationElidePass());
2011+
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));
20012012

20022013
FunctionPassManager FPM;
20032014
// The IPO Passes may leave cruft around. Clean up after them.
@@ -2149,6 +2160,8 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
21492160
if (PTO.CallGraphProfile)
21502161
MPM.addPass(CGProfilePass(/*InLTOPostLink=*/true));
21512162

2163+
MPM.addPass(CoroCleanupPass());
2164+
21522165
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
21532166

21542167
// Emit annotation remarks.

Diff for: llvm/test/LTO/X86/coro.ll

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
; RUN: llvm-as %s -o %t1.bc
2+
; RUN: llvm-lto2 run %t1.bc -o %t2.o -r=%t1.bc,test,plx -r=%t1.bc,extern_func,plx -save-temps
3+
; RUN: llvm-dis %t2.o.0.5.precodegen.bc -o - | FileCheck %s --implicit-check-not="call void @llvm.coro"
4+
5+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
6+
target triple = "x86_64-unknown-fuchsia"
7+
8+
declare void @extern_func()
9+
10+
; CHECK: define {{.*}} void @test(
11+
define void @test(ptr %hdl) {
12+
call void @llvm.coro.resume(ptr %hdl)
13+
call void @llvm.coro.destroy(ptr %hdl)
14+
call i1 @llvm.coro.done(ptr %hdl)
15+
ret void
16+
}
17+
18+
declare void @llvm.coro.resume(ptr)
19+
declare void @llvm.coro.destroy(ptr)
20+
declare i1 @llvm.coro.done(ptr)
21+

Diff for: llvm/test/Other/new-pm-O0-defaults.ll

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
; CHECK-LTO-NEXT: Running analysis: InnerAnalysisManagerProxy
5252
; CHECK-LTO-NEXT: Running pass: LowerTypeTestsPass
5353
; CHECK-LTO-NEXT: Running pass: LowerTypeTestsPass
54+
; CHECK-LTO-NEXT: CoroConditionalWrapper
5455
; CHECK-CORO-NEXT: Running pass: AnnotationRemarksPass
5556
; CHECK-CORO-NEXT: Running analysis: TargetLibraryAnalysis
5657
; CHECK-LTO-NEXT: Running pass: AnnotationRemarksPass

Diff for: llvm/test/Other/new-pm-lto-defaults.ll

+6-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
; CHECK-O1-NEXT: Running analysis: TargetLibraryAnalysis
6868
; CHECK-O-NEXT: Running pass: GlobalSplitPass
6969
; CHECK-O-NEXT: Running pass: WholeProgramDevirtPass
70+
; CHECK-O23SZ-NEXT: Running pass: CoroEarlyPass
7071
; CHECK-O1-NEXT: Running pass: LowerTypeTestsPass
7172
; CHECK-O23SZ-NEXT: Running pass: GlobalOptPass
7273
; CHECK-O23SZ-NEXT: Running pass: PromotePass
@@ -85,7 +86,9 @@
8586
; CHECK-O23SZ-NEXT: Running pass: GlobalOptPass
8687
; CHECK-O23SZ-NEXT: Running pass: OpenMPOptPass
8788
; CHECK-O23SZ-NEXT: Running pass: GlobalDCEPass
88-
; CHECK-O23SZ-NEXT: Running pass: ArgumentPromotionPass
89+
; CHECK-O23SZ-NEXT: Running pass: ArgumentPromotionPass on (foo)
90+
; CHECK-O23SZ-NEXT: CoroSplitPass on (foo)
91+
; CHECK-O23SZ-NEXT: CoroAnnotationElidePass on (foo)
8992
; CHECK-O23SZ-NEXT: Running pass: InstCombinePass
9093
; CHECK-EP-PEEPHOLE-NEXT: Running pass: NoOpFunctionPass
9194
; CHECK-O23SZ-NEXT: Running pass: ConstraintEliminationPass
@@ -156,6 +159,8 @@
156159
; CHECK-O23SZ-NEXT: Running pass: GlobalDCEPass
157160
; CHECK-O23SZ-NEXT: Running pass: RelLookupTableConverterPass
158161
; CHECK-O23SZ-NEXT: Running pass: CGProfilePass
162+
; CHECK-O1-NEXT: Running pass: CoroConditionalWrapper
163+
; CHECK-O23SZ-NEXT: Running pass: CoroCleanupPass
159164
; CHECK-EP-NEXT: Running pass: NoOpModulePass
160165
; CHECK-O-NEXT: Running pass: AnnotationRemarksPass on foo
161166
; CHECK-O-NEXT: Running pass: PrintModulePass

0 commit comments

Comments
 (0)