diff --git a/llvm/lib/CodeGen/DwarfEHPrepare.cpp b/llvm/lib/CodeGen/DwarfEHPrepare.cpp index 99d2522548c3c6..5ca1e91cc5f412 100644 --- a/llvm/lib/CodeGen/DwarfEHPrepare.cpp +++ b/llvm/lib/CodeGen/DwarfEHPrepare.cpp @@ -42,6 +42,12 @@ using namespace llvm; #define DEBUG_TYPE "dwarfehprepare" STATISTIC(NumResumesLowered, "Number of resume calls lowered"); +STATISTIC(NumCleanupLandingPadsUnreachable, + "Number of cleanup landing pads found unreachable"); +STATISTIC(NumCleanupLandingPadsRemaining, + "Number of cleanup landing pads remaining"); +STATISTIC(NumNoUnwind, "Number of functions with nounwind"); +STATISTIC(NumUnwind, "Number of functions with unwind"); namespace { @@ -163,6 +169,10 @@ size_t DwarfEHPrepare::pruneUnreachableResumes( bool DwarfEHPrepare::InsertUnwindResumeCalls() { SmallVector Resumes; SmallVector CleanupLPads; + if (F.doesNotThrow()) + NumNoUnwind++; + else + NumUnwind++; for (BasicBlock &BB : F) { if (auto *RI = dyn_cast(BB.getTerminator())) Resumes.push_back(RI); @@ -171,6 +181,8 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls() { CleanupLPads.push_back(LP); } + NumCleanupLandingPadsRemaining += CleanupLPads.size(); + if (Resumes.empty()) return false; @@ -182,8 +194,19 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls() { LLVMContext &Ctx = F.getContext(); size_t ResumesLeft = Resumes.size(); - if (OptLevel != CodeGenOpt::None) + if (OptLevel != CodeGenOpt::None) { ResumesLeft = pruneUnreachableResumes(Resumes, CleanupLPads); +#if LLVM_ENABLE_STATS + unsigned NumRemainingLPs = 0; + for (BasicBlock &BB : F) { + if (auto *LP = BB.getLandingPadInst()) + if (LP->isCleanup()) + NumRemainingLPs++; + } + NumCleanupLandingPadsUnreachable += CleanupLPads.size() - NumRemainingLPs; + NumCleanupLandingPadsRemaining -= CleanupLPads.size() - NumRemainingLPs; +#endif + } if (ResumesLeft == 0) return true; // We pruned them all.