diff --git a/llvm/lib/Transforms/Coroutines/CoroElide.cpp b/llvm/lib/Transforms/Coroutines/CoroElide.cpp --- a/llvm/lib/Transforms/Coroutines/CoroElide.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroElide.cpp @@ -9,6 +9,7 @@ #include "llvm/Transforms/Coroutines/CoroElide.h" #include "CoroInternal.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/Statistic.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/InstructionSimplify.h" #include "llvm/IR/Dominators.h" @@ -21,6 +22,8 @@ #define DEBUG_TYPE "coro-elide" +STATISTIC(NumOfCoroElided, "The # of coroutine get elided."); + namespace { // Created on demand if the coro-elide pass has work to do. struct Lowerer : coro::LowererBase { @@ -344,6 +347,7 @@ elideHeapAllocations(CoroId->getFunction(), FrameSizeAndAlign.first, FrameSizeAndAlign.second, AA); coro::replaceCoroFree(CoroId, /*Elide=*/true); + NumOfCoroElided++; } return true; diff --git a/llvm/test/Transforms/Coroutines/coro-elide.ll b/llvm/test/Transforms/Coroutines/coro-elide.ll --- a/llvm/test/Transforms/Coroutines/coro-elide.ll +++ b/llvm/test/Transforms/Coroutines/coro-elide.ll @@ -1,8 +1,8 @@ ; Tests that the coro.destroy and coro.resume are devirtualized where possible, ; SCC pipeline restarts and inlines the direct calls. ; RUN: opt < %s -S \ -; RUN: -passes='cgscc(repeat<2>(inline,function(coro-elide,dce)))' \ -; RUN: | FileCheck %s +; RUN: -passes='cgscc(repeat<2>(inline,function(coro-elide,dce)))' -stats \ +; RUN: 2>&1 | FileCheck %s --check-prefixes=CHECK,STATS declare void @print(i32) nounwind @@ -165,3 +165,4 @@ declare i8* @llvm.coro.frame() declare i8* @llvm.coro.subfn.addr(i8*, i8) declare i1 @llvm.coro.alloc(token) +; STATS: 2 coro-elide - The # of coroutine get elided. \ No newline at end of file