diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 |
commit | 145449b1e420787bb99721a429341fa6be3adfb6 (patch) | |
tree | 1d56ae694a6de602e348dd80165cf881a36600ed /llvm/lib/Transforms/Coroutines/CoroCleanup.cpp | |
parent | ecbca9f5fb7d7613d2b94982c4825eb0d33d6842 (diff) | |
download | src-145449b1e420787bb99721a429341fa6be3adfb6.tar.gz src-145449b1e420787bb99721a429341fa6be3adfb6.zip |
Vendor import of llvm-project main llvmorg-15-init-15358-g53dc0f107877.vendor/llvm-project/llvmorg-15-init-15358-g53dc0f107877
Diffstat (limited to 'llvm/lib/Transforms/Coroutines/CoroCleanup.cpp')
-rw-r--r-- | llvm/lib/Transforms/Coroutines/CoroCleanup.cpp | 81 |
1 files changed, 18 insertions, 63 deletions
diff --git a/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp b/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp index 67f8828e4c75..f7bbdcffd2ec 100644 --- a/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp @@ -10,9 +10,9 @@ #include "CoroInternal.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/InstIterator.h" -#include "llvm/IR/LegacyPassManager.h" -#include "llvm/Pass.h" -#include "llvm/Transforms/Scalar.h" +#include "llvm/IR/PassManager.h" +#include "llvm/IR/Function.h" +#include "llvm/Transforms/Scalar/SimplifyCFG.h" using namespace llvm; @@ -23,19 +23,10 @@ namespace { struct Lowerer : coro::LowererBase { IRBuilder<> Builder; Lowerer(Module &M) : LowererBase(M), Builder(Context) {} - bool lowerRemainingCoroIntrinsics(Function &F); + bool lower(Function &F); }; } -static void simplifyCFG(Function &F) { - llvm::legacy::FunctionPassManager FPM(F.getParent()); - FPM.add(createCFGSimplificationPass()); - - FPM.doInitialization(); - FPM.run(F); - FPM.doFinalization(); -} - static void lowerSubFn(IRBuilder<> &Builder, CoroSubFnInst *SubFn) { Builder.SetInsertPoint(SubFn); Value *FrameRaw = SubFn->getFrame(); @@ -53,12 +44,10 @@ static void lowerSubFn(IRBuilder<> &Builder, CoroSubFnInst *SubFn) { SubFn->replaceAllUsesWith(Load); } -bool Lowerer::lowerRemainingCoroIntrinsics(Function &F) { +bool Lowerer::lower(Function &F) { + bool IsPrivateAndUnprocessed = F.isPresplitCoroutine() && F.hasLocalLinkage(); bool Changed = false; - bool IsPrivateAndUnprocessed = - F.hasFnAttribute(CORO_PRESPLIT_ATTR) && F.hasLocalLinkage(); - for (Instruction &I : llvm::make_early_inc_range(instructions(F))) { if (auto *II = dyn_cast<IntrinsicInst>(&I)) { switch (II->getIntrinsicID()) { @@ -116,11 +105,6 @@ bool Lowerer::lowerRemainingCoroIntrinsics(Function &F) { } } - if (Changed) { - // After replacement were made we can cleanup the function body a little. - simplifyCFG(F); - } - return Changed; } @@ -132,50 +116,21 @@ static bool declaresCoroCleanupIntrinsics(const Module &M) { "llvm.coro.async.resume"}); } -PreservedAnalyses CoroCleanupPass::run(Function &F, - FunctionAnalysisManager &AM) { - auto &M = *F.getParent(); - if (!declaresCoroCleanupIntrinsics(M) || - !Lowerer(M).lowerRemainingCoroIntrinsics(F)) +PreservedAnalyses CoroCleanupPass::run(Module &M, + ModuleAnalysisManager &MAM) { + if (!declaresCoroCleanupIntrinsics(M)) return PreservedAnalyses::all(); - return PreservedAnalyses::none(); -} - -namespace { - -struct CoroCleanupLegacy : FunctionPass { - static char ID; // Pass identification, replacement for typeid + FunctionAnalysisManager &FAM = + MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); - CoroCleanupLegacy() : FunctionPass(ID) { - initializeCoroCleanupLegacyPass(*PassRegistry::getPassRegistry()); - } + FunctionPassManager FPM; + FPM.addPass(SimplifyCFGPass()); - std::unique_ptr<Lowerer> L; + Lowerer L(M); + for (auto &F : M) + if (L.lower(F)) + FPM.run(F, FAM); - // This pass has work to do only if we find intrinsics we are going to lower - // in the module. - bool doInitialization(Module &M) override { - if (declaresCoroCleanupIntrinsics(M)) - L = std::make_unique<Lowerer>(M); - return false; - } - - bool runOnFunction(Function &F) override { - if (L) - return L->lowerRemainingCoroIntrinsics(F); - return false; - } - void getAnalysisUsage(AnalysisUsage &AU) const override { - if (!L) - AU.setPreservesAll(); - } - StringRef getPassName() const override { return "Coroutine Cleanup"; } -}; + return PreservedAnalyses::none(); } - -char CoroCleanupLegacy::ID = 0; -INITIALIZE_PASS(CoroCleanupLegacy, "coro-cleanup", - "Lower all coroutine related intrinsics", false, false) - -Pass *llvm::createCoroCleanupLegacyPass() { return new CoroCleanupLegacy(); } |