LLVM 18.0.0git
Macros | Functions
CoroSplit.cpp File Reference
#include "llvm/Transforms/Coroutines/CoroSplit.h"
#include "CoroInstr.h"
#include "CoroInternal.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/PriorityWorklist.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/CFG.h"
#include "llvm/Analysis/CallGraph.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/LazyCallGraph.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/CallGraphUpdater.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <initializer_list>
#include <iterator>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "coro-split"
 

Functions

static void maybeFreeRetconStorage (IRBuilder<> &Builder, const coro::Shape &Shape, Value *FramePtr, CallGraph *CG)
 
static bool replaceCoroEndAsync (AnyCoroEndInst *End)
 Replace an llvm.coro.end.async.
 
static void replaceFallthroughCoroEnd (AnyCoroEndInst *End, const coro::Shape &Shape, Value *FramePtr, bool InResume, CallGraph *CG)
 Replace a non-unwind call to llvm.coro.end.
 
static void markCoroutineAsDone (IRBuilder<> &Builder, const coro::Shape &Shape, Value *FramePtr)
 
static void replaceUnwindCoroEnd (AnyCoroEndInst *End, const coro::Shape &Shape, Value *FramePtr, bool InResume, CallGraph *CG)
 Replace an unwind call to llvm.coro.end.
 
static void replaceCoroEnd (AnyCoroEndInst *End, const coro::Shape &Shape, Value *FramePtr, bool InResume, CallGraph *CG)
 
static void createResumeEntryBlock (Function &F, coro::Shape &Shape)
 
static FunctionTypegetFunctionTypeFromAsyncSuspend (AnyCoroSuspendInst *Suspend)
 
static FunctioncreateCloneDeclaration (Function &OrigF, coro::Shape &Shape, const Twine &Suffix, Module::iterator InsertBefore, AnyCoroSuspendInst *ActiveSuspend)
 
static void replaceSwiftErrorOps (Function &F, coro::Shape &Shape, ValueToValueMapTy *VMap)
 
static SmallVector< DbgVariableIntrinsic *, 8 > collectDbgVariableIntrinsics (Function &F)
 Returns all DbgVariableIntrinsic in F.
 
static void addFramePointerAttrs (AttributeList &Attrs, LLVMContext &Context, unsigned ParamIndex, uint64_t Size, Align Alignment, bool NoAlias)
 
static void addAsyncContextAttrs (AttributeList &Attrs, LLVMContext &Context, unsigned ParamIndex)
 
static void addSwiftSelfAttrs (AttributeList &Attrs, LLVMContext &Context, unsigned ParamIndex)
 
static FunctioncreateClone (Function &F, const Twine &Suffix, coro::Shape &Shape, CoroCloner::Kind FKind)
 
static void updateAsyncFuncPointerContextSize (coro::Shape &Shape)
 
static void replaceFrameSizeAndAlignment (coro::Shape &Shape)
 
static void setCoroInfo (Function &F, coro::Shape &Shape, ArrayRef< Function * > Fns)
 
static void updateCoroFrame (coro::Shape &Shape, Function *ResumeFn, Function *DestroyFn, Function *CleanupFn)
 
static void postSplitCleanup (Function &F)
 
static void scanPHIsAndUpdateValueMap (Instruction *Prev, BasicBlock *NewBlock, DenseMap< Value *, Value * > &ResolvedValues)
 
static bool simplifyTerminatorLeadingToRet (Instruction *InitialInst)
 
static bool shouldBeMustTail (const CallInst &CI, const Function &F)
 
static void addMustTailToCoroResumes (Function &F, TargetTransformInfo &TTI)
 
static void handleNoSuspendCoroutine (coro::Shape &Shape)
 
static bool hasCallsInBlockBetween (Instruction *From, Instruction *To)
 
static bool hasCallsInBlocksBetween (BasicBlock *SaveBB, BasicBlock *ResDesBB)
 
static bool hasCallsBetween (Instruction *Save, Instruction *ResumeOrDestroy)
 
static bool simplifySuspendPoint (CoroSuspendInst *Suspend, CoroBeginInst *CoroBegin)
 
static void simplifySuspendPoints (coro::Shape &Shape)
 
static void splitSwitchCoroutine (Function &F, coro::Shape &Shape, SmallVectorImpl< Function * > &Clones, TargetTransformInfo &TTI)
 
static void replaceAsyncResumeFunction (CoroSuspendAsyncInst *Suspend, Value *Continuation)
 
Coerce the arguments in p FnArgs according to p FnTy in p static CallArgs void coerceArguments (IRBuilder<> &Builder, FunctionType *FnTy, ArrayRef< Value * > FnArgs, SmallVectorImpl< Value * > &CallArgs)
 
static void splitAsyncCoroutine (Function &F, coro::Shape &Shape, SmallVectorImpl< Function * > &Clones)
 
static void splitRetconCoroutine (Function &F, coro::Shape &Shape, SmallVectorImpl< Function * > &Clones)
 
static coro::Shape splitCoroutine (Function &F, SmallVectorImpl< Function * > &Clones, TargetTransformInfo &TTI, bool OptimizeFrame, std::function< bool(Instruction &)> MaterializableCallback)
 
Remove calls to llvm coro end in the original static function void removeCoroEnds (const coro::Shape &Shape)
 
static void updateCallGraphAfterCoroutineSplit (LazyCallGraph::Node &N, const coro::Shape &Shape, const SmallVectorImpl< Function * > &Clones, LazyCallGraph::SCC &C, LazyCallGraph &CG, CGSCCAnalysisManager &AM, CGSCCUpdateResult &UR, FunctionAnalysisManager &FAM)
 
Replace a call to llvm coro prepare static retcon void replacePrepare (CallInst *Prepare, LazyCallGraph &CG, LazyCallGraph::SCC &C)
 
static bool replaceAllPrepares (Function *PrepareFn, LazyCallGraph &CG, LazyCallGraph::SCC &C)
 
static void addPrepareFunction (const Module &M, SmallVectorImpl< Function * > &Fns, StringRef Name)
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "coro-split"

Definition at line 78 of file CoroSplit.cpp.

Function Documentation

◆ addAsyncContextAttrs()

static void addAsyncContextAttrs ( AttributeList Attrs,
LLVMContext Context,
unsigned  ParamIndex 
)
static

Definition at line 913 of file CoroSplit.cpp.

References llvm::AttrBuilder::addAttribute(), and Context.

◆ addFramePointerAttrs()

static void addFramePointerAttrs ( AttributeList Attrs,
LLVMContext Context,
unsigned  ParamIndex,
uint64_t  Size,
Align  Alignment,
bool  NoAlias 
)
static

◆ addMustTailToCoroResumes()

static void addMustTailToCoroResumes ( Function F,
TargetTransformInfo TTI 
)
static

◆ addPrepareFunction()

static void addPrepareFunction ( const Module M,
SmallVectorImpl< Function * > &  Fns,
StringRef  Name 
)
static

◆ addSwiftSelfAttrs()

static void addSwiftSelfAttrs ( AttributeList Attrs,
LLVMContext Context,
unsigned  ParamIndex 
)
static

Definition at line 920 of file CoroSplit.cpp.

References llvm::AttrBuilder::addAttribute(), and Context.

◆ coerceArguments()

Coerce the arguments in p FnArgs according to p FnTy in p static CallArgs void coerceArguments ( IRBuilder<> &  Builder,
FunctionType FnTy,
ArrayRef< Value * >  FnArgs,
SmallVectorImpl< Value * > &  CallArgs 
)
static

◆ collectDbgVariableIntrinsics()

static SmallVector< DbgVariableIntrinsic *, 8 > collectDbgVariableIntrinsics ( Function F)
static

Returns all DbgVariableIntrinsic in F.

Definition at line 729 of file CoroSplit.cpp.

References F, I, instructions, and llvm::SmallVectorTemplateBase< T, bool >::push_back().

Referenced by splitCoroutine().

◆ createClone()

static Function * createClone ( Function F,
const Twine Suffix,
coro::Shape Shape,
CoroCloner::Kind  FKind 
)
static

Definition at line 1159 of file CoroSplit.cpp.

References F.

Referenced by splitSwitchCoroutine().

◆ createCloneDeclaration()

static Function * createCloneDeclaration ( Function OrigF,
coro::Shape Shape,
const Twine Suffix,
Module::iterator  InsertBefore,
AnyCoroSuspendInst ActiveSuspend 
)
static

◆ createResumeEntryBlock()

static void createResumeEntryBlock ( Function F,
coro::Shape Shape 
)
static

◆ getFunctionTypeFromAsyncSuspend()

static FunctionType * getFunctionTypeFromAsyncSuspend ( AnyCoroSuspendInst Suspend)
static

◆ handleNoSuspendCoroutine()

static void handleNoSuspendCoroutine ( coro::Shape Shape)
static

◆ hasCallsBetween()

static bool hasCallsBetween ( Instruction Save,
Instruction ResumeOrDestroy 
)
static

◆ hasCallsInBlockBetween()

static bool hasCallsInBlockBetween ( Instruction From,
Instruction To 
)
static

Definition at line 1506 of file CoroSplit.cpp.

References From, and I.

Referenced by hasCallsBetween(), and hasCallsInBlocksBetween().

◆ hasCallsInBlocksBetween()

static bool hasCallsInBlocksBetween ( BasicBlock SaveBB,
BasicBlock ResDesBB 
)
static

◆ markCoroutineAsDone()

static void markCoroutineAsDone ( IRBuilder<> &  Builder,
const coro::Shape Shape,
Value FramePtr 
)
static

◆ maybeFreeRetconStorage()

static void maybeFreeRetconStorage ( IRBuilder<> &  Builder,
const coro::Shape Shape,
Value FramePtr,
CallGraph CG 
)
static

◆ postSplitCleanup()

static void postSplitCleanup ( Function F)
static

◆ removeCoroEnds()

Remove calls to llvm coro end in the original static function void removeCoroEnds ( const coro::Shape Shape)
static

◆ replaceAllPrepares()

static bool replaceAllPrepares ( Function PrepareFn,
LazyCallGraph CG,
LazyCallGraph::SCC C 
)
static

◆ replaceAsyncResumeFunction()

static void replaceAsyncResumeFunction ( CoroSuspendAsyncInst Suspend,
Value Continuation 
)
static

◆ replaceCoroEnd()

static void replaceCoroEnd ( AnyCoroEndInst End,
const coro::Shape Shape,
Value FramePtr,
bool  InResume,
CallGraph CG 
)
static

◆ replaceCoroEndAsync()

static bool replaceCoroEndAsync ( AnyCoroEndInst End)
static

Replace an llvm.coro.end.async.

Will inline the must tail call function call if there is one.

Returns
true if cleanup of the coro.end block is needed, false otherwise.

Definition at line 184 of file CoroSplit.cpp.

References assert(), llvm::IRBuilderBase::CreateRetVoid(), End, llvm::InlineFunction(), and llvm::IRBuilderBase::SetInsertPoint().

Referenced by replaceFallthroughCoroEnd().

◆ replaceFallthroughCoroEnd()

static void replaceFallthroughCoroEnd ( AnyCoroEndInst End,
const coro::Shape Shape,
Value FramePtr,
bool  InResume,
CallGraph CG 
)
static

◆ replaceFrameSizeAndAlignment()

static void replaceFrameSizeAndAlignment ( coro::Shape Shape)
static

◆ replacePrepare()

Replace a call to llvm coro prepare static retcon void replacePrepare ( CallInst Prepare,
LazyCallGraph CG,
LazyCallGraph::SCC C 
)
static

◆ replaceSwiftErrorOps()

static void replaceSwiftErrorOps ( Function F,
coro::Shape Shape,
ValueToValueMapTy VMap 
)
static

◆ replaceUnwindCoroEnd()

static void replaceUnwindCoroEnd ( AnyCoroEndInst End,
const coro::Shape Shape,
Value FramePtr,
bool  InResume,
CallGraph CG 
)
static

◆ scanPHIsAndUpdateValueMap()

static void scanPHIsAndUpdateValueMap ( Instruction Prev,
BasicBlock NewBlock,
DenseMap< Value *, Value * > &  ResolvedValues 
)
static

◆ setCoroInfo()

static void setCoroInfo ( Function F,
coro::Shape Shape,
ArrayRef< Function * >  Fns 
)
static

◆ shouldBeMustTail()

static bool shouldBeMustTail ( const CallInst CI,
const Function F 
)
static

◆ simplifySuspendPoint()

static bool simplifySuspendPoint ( CoroSuspendInst Suspend,
CoroBeginInst CoroBegin 
)
static

◆ simplifySuspendPoints()

static void simplifySuspendPoints ( coro::Shape Shape)
static

◆ simplifyTerminatorLeadingToRet()

static bool simplifyTerminatorLeadingToRet ( Instruction InitialInst)
static

◆ splitAsyncCoroutine()

static void splitAsyncCoroutine ( Function F,
coro::Shape Shape,
SmallVectorImpl< Function * > &  Clones 
)
static

◆ splitCoroutine()

static coro::Shape splitCoroutine ( Function F,
SmallVectorImpl< Function * > &  Clones,
TargetTransformInfo TTI,
bool  OptimizeFrame,
std::function< bool(Instruction &)>  MaterializableCallback 
)
static

◆ splitRetconCoroutine()

static void splitRetconCoroutine ( Function F,
coro::Shape Shape,
SmallVectorImpl< Function * > &  Clones 
)
static

◆ splitSwitchCoroutine()

static void splitSwitchCoroutine ( Function F,
coro::Shape Shape,
SmallVectorImpl< Function * > &  Clones,
TargetTransformInfo TTI 
)
static

◆ updateAsyncFuncPointerContextSize()

static void updateAsyncFuncPointerContextSize ( coro::Shape Shape)
static

◆ updateCallGraphAfterCoroutineSplit()

static void updateCallGraphAfterCoroutineSplit ( LazyCallGraph::Node N,
const coro::Shape Shape,
const SmallVectorImpl< Function * > &  Clones,
LazyCallGraph::SCC C,
LazyCallGraph CG,
CGSCCAnalysisManager AM,
CGSCCUpdateResult UR,
FunctionAnalysisManager FAM 
)
static

◆ updateCoroFrame()

static void updateCoroFrame ( coro::Shape Shape,
Function ResumeFn,
Function DestroyFn,
Function CleanupFn 
)
static