60
60
#include " llvm/Support/Casting.h"
61
61
#include " llvm/Support/Debug.h"
62
62
#include " llvm/Support/PrettyStackTrace.h"
63
+ #include " llvm/Support/TimeProfiler.h"
63
64
#include " llvm/Support/raw_ostream.h"
64
65
#include " llvm/Transforms/Coroutines/ABI.h"
65
66
#include " llvm/Transforms/Coroutines/CoroInstr.h"
@@ -118,7 +119,6 @@ class CoroCloner {
118
119
119
120
TargetTransformInfo &TTI;
120
121
121
- public:
122
122
// / Create a cloner for a switch lowering.
123
123
CoroCloner (Function &OrigF, const Twine &Suffix, coro::Shape &Shape,
124
124
Kind FKind, TargetTransformInfo &TTI)
@@ -140,6 +140,30 @@ class CoroCloner {
140
140
assert (ActiveSuspend && " need active suspend point for continuation" );
141
141
}
142
142
143
+ public:
144
+ // / Create a clone for a switch lowering.
145
+ static Function *createClone (Function &OrigF, const Twine &Suffix,
146
+ coro::Shape &Shape, Kind FKind,
147
+ TargetTransformInfo &TTI) {
148
+ TimeTraceScope FunctionScope (" CoroCloner" );
149
+
150
+ CoroCloner Cloner (OrigF, Suffix, Shape, FKind, TTI);
151
+ Cloner.create ();
152
+ return Cloner.getFunction ();
153
+ }
154
+
155
+ // / Create a clone for a continuation lowering.
156
+ static Function *createClone (Function &OrigF, const Twine &Suffix,
157
+ coro::Shape &Shape, Function *NewF,
158
+ AnyCoroSuspendInst *ActiveSuspend,
159
+ TargetTransformInfo &TTI) {
160
+ TimeTraceScope FunctionScope (" CoroCloner" );
161
+
162
+ CoroCloner Cloner (OrigF, Suffix, Shape, NewF, ActiveSuspend, TTI);
163
+ Cloner.create ();
164
+ return Cloner.getFunction ();
165
+ }
166
+
143
167
Function *getFunction () const {
144
168
assert (NewF != nullptr && " declaration not yet set" );
145
169
return NewF;
@@ -1466,13 +1490,16 @@ struct SwitchCoroutineSplitter {
1466
1490
TargetTransformInfo &TTI) {
1467
1491
assert (Shape.ABI == coro::ABI::Switch);
1468
1492
1493
+ // Create a resume clone by cloning the body of the original function,
1494
+ // setting new entry block and replacing coro.suspend an appropriate value
1495
+ // to force resume or cleanup pass for every suspend point.
1469
1496
createResumeEntryBlock (F, Shape);
1470
- auto *ResumeClone =
1471
- createClone ( F, " .resume" , Shape, CoroCloner::Kind::SwitchResume, TTI);
1472
- auto *DestroyClone =
1473
- createClone ( F, " .destroy" , Shape, CoroCloner::Kind::SwitchUnwind, TTI);
1474
- auto *CleanupClone =
1475
- createClone ( F, " .cleanup" , Shape, CoroCloner::Kind::SwitchCleanup, TTI);
1497
+ auto *ResumeClone = CoroCloner::createClone (
1498
+ F, " .resume" , Shape, CoroCloner::Kind::SwitchResume, TTI);
1499
+ auto *DestroyClone = CoroCloner::createClone (
1500
+ F, " .destroy" , Shape, CoroCloner::Kind::SwitchUnwind, TTI);
1501
+ auto *CleanupClone = CoroCloner::createClone (
1502
+ F, " .cleanup" , Shape, CoroCloner::Kind::SwitchCleanup, TTI);
1476
1503
1477
1504
postSplitCleanup (*ResumeClone);
1478
1505
postSplitCleanup (*DestroyClone);
@@ -1562,17 +1589,6 @@ struct SwitchCoroutineSplitter {
1562
1589
}
1563
1590
1564
1591
private:
1565
- // Create a resume clone by cloning the body of the original function, setting
1566
- // new entry block and replacing coro.suspend an appropriate value to force
1567
- // resume or cleanup pass for every suspend point.
1568
- static Function *createClone (Function &F, const Twine &Suffix,
1569
- coro::Shape &Shape, CoroCloner::Kind FKind,
1570
- TargetTransformInfo &TTI) {
1571
- CoroCloner Cloner (F, Suffix, Shape, FKind, TTI);
1572
- Cloner.create ();
1573
- return Cloner.getFunction ();
1574
- }
1575
-
1576
1592
// Create an entry block for a resume function with a switch that will jump to
1577
1593
// suspend points.
1578
1594
static void createResumeEntryBlock (Function &F, coro::Shape &Shape) {
@@ -1872,7 +1888,8 @@ void coro::AsyncABI::splitCoroutine(Function &F, coro::Shape &Shape,
1872
1888
auto *Suspend = Shape.CoroSuspends [Idx];
1873
1889
auto *Clone = Clones[Idx];
1874
1890
1875
- CoroCloner (F, " resume." + Twine (Idx), Shape, Clone, Suspend, TTI).create ();
1891
+ CoroCloner::createClone (F, " resume." + Twine (Idx), Shape, Clone, Suspend,
1892
+ TTI);
1876
1893
}
1877
1894
}
1878
1895
@@ -2001,7 +2018,8 @@ void coro::AnyRetconABI::splitCoroutine(Function &F, coro::Shape &Shape,
2001
2018
auto Suspend = Shape.CoroSuspends [i];
2002
2019
auto Clone = Clones[i];
2003
2020
2004
- CoroCloner (F, " resume." + Twine (i), Shape, Clone, Suspend, TTI).create ();
2021
+ CoroCloner::createClone (F, " resume." + Twine (i), Shape, Clone, Suspend,
2022
+ TTI);
2005
2023
}
2006
2024
}
2007
2025
0 commit comments