LLVM 19.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 lowerAwaitSuspend (IRBuilder<> &Builder, CoroAwaitSuspendInst *CB)
 
static void lowerAwaitSuspends (Function &F, coro::Shape &Shape)
 
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 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 std::pair< SmallVector< DbgVariableIntrinsic *, 8 >, SmallVector< DbgVariableRecord * > > 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 void updateAsyncFuncPointerContextSize (coro::Shape &Shape)
 
static void replaceFrameSizeAndAlignment (coro::Shape &Shape)
 
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 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 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, TargetTransformInfo &TTI)
 
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 876 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

◆ 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 883 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 std::pair< SmallVector< DbgVariableIntrinsic *, 8 >, SmallVector< DbgVariableRecord * > > collectDbgVariableIntrinsics ( Function F)
static

Returns all DbgVariableIntrinsic in F.

Definition at line 684 of file CoroSplit.cpp.

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

Referenced by splitCoroutine().

◆ createCloneDeclaration()

static Function * createCloneDeclaration ( Function OrigF,
coro::Shape Shape,
const Twine Suffix,
Module::iterator  InsertBefore,
AnyCoroSuspendInst ActiveSuspend 
)
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 1349 of file CoroSplit.cpp.

References From, and I.

Referenced by hasCallsBetween(), and hasCallsInBlocksBetween().

◆ hasCallsInBlocksBetween()

static bool hasCallsInBlocksBetween ( BasicBlock SaveBB,
BasicBlock ResDesBB 
)
static

◆ lowerAwaitSuspend()

static void lowerAwaitSuspend ( IRBuilder<> &  Builder,
CoroAwaitSuspendInst CB 
)
static

◆ lowerAwaitSuspends()

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

Definition at line 213 of file CoroSplit.cpp.

References llvm::coro::Shape::CoroAwaitSuspends, F, and lowerAwaitSuspend().

Referenced by splitCoroutine().

◆ 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 232 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

◆ 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,
TargetTransformInfo TTI 
)
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

◆ 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