Skip to content

Commit

Permalink
[Coroutine] Record the elided coroutines
Browse files Browse the repository at this point in the history
Reviewed By: lxfind

Differential Revision: https://reviews.llvm.org/D105606
  • Loading branch information
ChuanqiXu9 committed Jul 27, 2021
1 parent dbefcde commit 0237dbf
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
28 changes: 28 additions & 0 deletions llvm/lib/Transforms/Coroutines/CoroElide.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,20 @@
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FileSystem.h"

using namespace llvm;

#define DEBUG_TYPE "coro-elide"

STATISTIC(NumOfCoroElided, "The # of coroutine get elided.");

#ifndef NDEBUG
static cl::opt<std::string> CoroElideInfoOutputFilename(
"coro-elide-info-output-file", cl::value_desc("filename"),
cl::desc("File to record the coroutines got elided"), cl::Hidden);
#endif

namespace {
// Created on demand if the coro-elide pass has work to do.
struct Lowerer : coro::LowererBase {
Expand Down Expand Up @@ -121,6 +128,21 @@ static Instruction *getFirstNonAllocaInTheEntryBlock(Function *F) {
llvm_unreachable("no terminator in the entry block");
}

#ifndef NDEBUG
static std::unique_ptr<raw_fd_ostream> getOrCreateLogFile() {
assert(!CoroElideInfoOutputFilename.empty() &&
"coro-elide-info-output-file shouldn't be empty");
std::error_code EC;
auto Result = std::make_unique<raw_fd_ostream>(CoroElideInfoOutputFilename,
EC, sys::fs::OF_Append);
if (!EC)
return Result;
llvm::errs() << "Error opening coro-elide-info-output-file '"
<< CoroElideInfoOutputFilename << " for appending!\n";
return std::make_unique<raw_fd_ostream>(2, false); // stderr.
}
#endif

// To elide heap allocations we need to suppress code blocks guarded by
// llvm.coro.alloc and llvm.coro.free instructions.
void Lowerer::elideHeapAllocations(Function *F, uint64_t FrameSize,
Expand Down Expand Up @@ -344,6 +366,12 @@ bool Lowerer::processCoroId(CoroIdInst *CoroId, AAResults &AA,
FrameSizeAndAlign.second, AA);
coro::replaceCoroFree(CoroId, /*Elide=*/true);
NumOfCoroElided++;
#ifndef NDEBUG
if (!CoroElideInfoOutputFilename.empty())
*getOrCreateLogFile()
<< "Elide " << CoroId->getCoroutine()->getName() << " in "
<< CoroId->getFunction()->getName() << "\n";
#endif
}

return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,15 @@
; RUN: opt < %s -S \
; RUN: -passes='cgscc(repeat<2>(inline,function(coro-elide,dce)))' -stats 2>&1 \
; RUN: | FileCheck %s
; RUN: opt < %s --disable-output \
; RUN: -passes='cgscc(repeat<2>(inline,function(coro-elide,dce)))' \
; RUN: -coro-elide-info-output-file=%t && \
; RUN: cat %t \
; RUN: | FileCheck %s --check-prefix=FILE

; CHECK: 2 coro-elide - The # of coroutine get elided.
; FILE: Elide f in callResume
; FILE: Elide f in callResumeMultiRetDommmed

declare void @print(i32) nounwind

Expand Down

0 comments on commit 0237dbf

Please sign in to comment.