LLVM 19.0.0git
|
#include "CoroInternal.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/PostOrderIterator.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Analysis/CFG.h"
#include "llvm/Analysis/PtrUseVisitor.h"
#include "llvm/Analysis/StackLifetime.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/OptimizedStructLayout.h"
#include "llvm/Support/circular_raw_ostream.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/PromoteMemToReg.h"
#include <algorithm>
#include <deque>
#include <optional>
Go to the source code of this file.
Classes | |
struct | llvm::GraphTraits< RematGraph * > |
Namespaces | |
namespace | llvm |
This is an optimization pass for GlobalISel generic memory operations. | |
Macros | |
#define | DEBUG_TYPE "coro-suspend-crossing" |
#define | DEBUG_TYPE "coro-frame" |
Typedefs | |
typedef SmallPtrSet< BasicBlock *, 8 > | VisitedBlocksSet |
Enumerations | |
enum | { SmallVectorThreshold = 32 } |
Functions | |
static void | dumpSpills (StringRef Title, const SpillInfo &Spills) |
static void | dumpRemats (StringRef Title, const SmallMapVector< Instruction *, std::unique_ptr< RematGraph >, 8 > &RM) |
static void | dumpAllocas (const SmallVectorImpl< AllocaInfo > &Allocas) |
static void | cacheDIVar (FrameDataInfo &FrameData, DenseMap< Value *, DILocalVariable * > &DIVarCache) |
static StringRef | solveTypeName (Type *Ty) |
Create name for Type. | |
static DIType * | solveDIType (DIBuilder &Builder, Type *Ty, const DataLayout &Layout, DIScope *Scope, unsigned LineNum, DenseMap< Type *, DIType * > &DITypeCache) |
static void | buildFrameDebugInfo (Function &F, coro::Shape &Shape, FrameDataInfo &FrameData) |
Build artificial debug info for C++ coroutine frames to allow users to inspect the contents of the frame directly. | |
static StructType * | buildFrameType (Function &F, coro::Shape &Shape, FrameDataInfo &FrameData) |
static Instruction * | splitBeforeCatchSwitch (CatchSwitchInst *CatchSwitch) |
static void | insertSpills (const FrameDataInfo &FrameData, coro::Shape &Shape) |
static void | movePHIValuesToInsertedBlock (BasicBlock *SuccBB, BasicBlock *InsertedBB, BasicBlock *PredBB, PHINode *UntilPHI=nullptr) |
static void | rewritePHIsForCleanupPad (BasicBlock *CleanupPadBB, CleanupPadInst *CleanupPad) |
static void | cleanupSinglePredPHIs (Function &F) |
static void | rewritePHIs (BasicBlock &BB) |
static void | rewritePHIs (Function &F) |
static bool | isCoroutineStructureIntrinsic (Instruction &I) |
static void | rewriteMaterializableInstructions (const SmallMapVector< Instruction *, std::unique_ptr< RematGraph >, 8 > &AllRemats) |
static BasicBlock * | splitBlockIfNotFirst (Instruction *I, const Twine &Name) |
static void | splitAround (Instruction *I, const Twine &Name) |
static bool | isSuspendBlock (BasicBlock *BB) |
static bool | isSuspendReachableFrom (BasicBlock *From, VisitedBlocksSet &VisitedOrFreeBBs) |
Does control flow starting at the given block ever reach a suspend instruction before reaching a block in VisitedOrFreeBBs? | |
static bool | isLocalAlloca (CoroAllocaAllocInst *AI) |
Is the given alloca "local", i.e. | |
static bool | willLeaveFunctionImmediatelyAfter (BasicBlock *BB, unsigned depth=3) |
After we split the coroutine, will the given basic block be along an obvious exit path for the resumption function? | |
static bool | localAllocaNeedsStackSave (CoroAllocaAllocInst *AI) |
static void | lowerLocalAllocas (ArrayRef< CoroAllocaAllocInst * > LocalAllocas, SmallVectorImpl< Instruction * > &DeadInsts) |
Turn each of the given local allocas into a normal (dynamic) alloca instruction. | |
static Instruction * | lowerNonLocalAlloca (CoroAllocaAllocInst *AI, coro::Shape &Shape, SmallVectorImpl< Instruction * > &DeadInsts) |
Turn the given coro.alloca.alloc call into a dynamic allocation. | |
static Value * | emitGetSwiftErrorValue (IRBuilder<> &Builder, Type *ValueTy, coro::Shape &Shape) |
Get the current swifterror value. | |
static Value * | emitSetSwiftErrorValue (IRBuilder<> &Builder, Value *V, coro::Shape &Shape) |
Set the given value as the current swifterror value. | |
static Value * | emitSetAndGetSwiftErrorValueAround (Instruction *Call, AllocaInst *Alloca, coro::Shape &Shape) |
Set the swifterror value from the given alloca before a call, then put in back in the alloca afterwards. | |
static void | eliminateSwiftErrorAlloca (Function &F, AllocaInst *Alloca, coro::Shape &Shape) |
Eliminate a formerly-swifterror alloca by inserting the get/set intrinsics and attempting to MemToReg the alloca away. | |
static void | eliminateSwiftErrorArgument (Function &F, Argument &Arg, coro::Shape &Shape, SmallVectorImpl< AllocaInst * > &AllocasToPromote) |
"Eliminate" a swifterror argument by reducing it to the alloca case and then loading and storing in the prologue and epilog. | |
static void | eliminateSwiftError (Function &F, coro::Shape &Shape) |
Eliminate all problematic uses of swifterror arguments and allocas from the function. | |
static void | sinkSpillUsesAfterCoroBegin (Function &F, const FrameDataInfo &FrameData, CoroBeginInst *CoroBegin) |
retcon and retcon.once conventions assume that all spill uses can be sunk after the coro.begin intrinsic. | |
static void | sinkLifetimeStartMarkers (Function &F, coro::Shape &Shape, SuspendCrossingInfo &Checker) |
For each local variable that all of its user are only used inside one of suspended region, we sink their lifetime.start markers to the place where after the suspend block. | |
static void | collectFrameAlloca (AllocaInst *AI, coro::Shape &Shape, const SuspendCrossingInfo &Checker, SmallVectorImpl< AllocaInfo > &Allocas, const DominatorTree &DT) |
static std::optional< std::pair< Value &, DIExpression & > > | salvageDebugInfoImpl (SmallDenseMap< Argument *, AllocaInst *, 4 > &ArgToAllocaMap, bool OptimizeFrame, bool UseEntryValue, Function *F, Value *Storage, DIExpression *Expr, bool SkipOutermostLoad) |
static void | doRematerializations (Function &F, SuspendCrossingInfo &Checker, const std::function< bool(Instruction &)> &MaterializableCallback) |
#define DEBUG_TYPE "coro-suspend-crossing" |
Definition at line 450 of file CoroFrame.cpp.
#define DEBUG_TYPE "coro-frame" |
Definition at line 450 of file CoroFrame.cpp.
typedef SmallPtrSet<BasicBlock*, 8> VisitedBlocksSet |
Definition at line 2409 of file CoroFrame.cpp.
anonymous enum |
Enumerator | |
---|---|
SmallVectorThreshold |
Definition at line 51 of file CoroFrame.cpp.
|
static |
Build artificial debug info for C++ coroutine frames to allow users to inspect the contents of the frame directly.
Create Debug information for coroutine frame with debug name "__coro_frame". The debug information for the fields of coroutine frame is constructed from the following way:
FIXME: If we fill the field SizeInBits
with the actual size of __coro_index in bits, then __coro_index wouldn't show in the debugger.
Definition at line 1106 of file CoroFrame.cpp.
References llvm::coro::Shape::ABI, assert(), cacheDIVar(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::contains(), llvm::DIBuilder::createAutoVariable(), llvm::DIBuilder::createBasicType(), llvm::DIBuilder::createExpression(), llvm::DIBuilder::createMemberType(), llvm::DIBuilder::createPointerType(), llvm::DIBuilder::createStructType(), llvm::coro::Shape::SwitchFieldIndex::Destroy, llvm::TinyPtrVector< EltTy >::empty(), F, llvm::findDbgDeclares(), llvm::findDVRDeclares(), llvm::coro::Shape::FrameAlign, llvm::coro::Shape::FramePtr, llvm::coro::Shape::FrameSize, llvm::coro::Shape::FrameTy, llvm::TinyPtrVector< EltTy >::front(), llvm::DebugLoc::get(), llvm::MDTuple::get(), llvm::ValueAsMetadata::get(), llvm::DbgRecord::getDebugLoc(), llvm::Instruction::getDebugLoc(), llvm::StructType::getElementType(), llvm::DIScope::getFile(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::getFixedValue(), llvm::coro::Shape::getInsertPtAfterFramePtr(), llvm::DIVariable::getLine(), llvm::DIType::getName(), llvm::StructType::getNumElements(), llvm::DIBuilder::getOrCreateArray(), llvm::coro::Shape::getPromiseAlloca(), llvm::DILocalVariable::getScope(), llvm::DataLayout::getTypeSizeInBits(), llvm::DbgVariableRecord::getVariable(), llvm::DbgVariableIntrinsic::getVariable(), llvm::coro::Shape::SwitchLoweringStorage::IndexAlign, llvm::coro::Shape::SwitchLoweringStorage::IndexField, llvm::coro::Shape::SwitchLoweringStorage::IndexOffset, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::dwarf::isCPlusPlus(), llvm::Type::isSized(), Name, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::DIBuilder::replaceArrays(), llvm::coro::Shape::SwitchFieldIndex::Resume, solveDIType(), llvm::StringRef::str(), llvm::Twine::str(), llvm::coro::Shape::SwitchLowering, UseNewDbgInfoFormat, llvm::Align::value(), and value.
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 1298 of file CoroFrame.cpp.
References A, llvm::coro::Shape::ABI, llvm::alignTo(), assert(), llvm::coro::Shape::AsyncLowering, B, llvm::CallingConv::C, llvm::coro::Shape::AsyncLoweringStorage::ContextHeaderSize, llvm::coro::Shape::AsyncLoweringStorage::ContextSize, llvm::coro::Shape::CoroSuspends, llvm::StructType::create(), DL, F, llvm::coro::Shape::FrameAlign, llvm::coro::Shape::AsyncLoweringStorage::FrameOffset, llvm::coro::Shape::FrameSize, llvm::coro::Shape::AsyncLoweringStorage::getContextAlignment(), llvm::Type::getIntNTy(), llvm::coro::Shape::getPromiseAlloca(), llvm::coro::Shape::getRetconCoroId(), llvm::coro::Shape::SwitchLoweringStorage::IndexAlign, llvm::coro::Shape::SwitchLoweringStorage::IndexField, llvm::coro::Shape::SwitchLoweringStorage::IndexOffset, llvm::coro::Shape::RetconLoweringStorage::IsFrameInlineInStorage, llvm::Log2_64_Ceil(), Name, llvm::report_fatal_error(), llvm::coro::Shape::RetconLowering, and llvm::coro::Shape::SwitchLowering.
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 961 of file CoroFrame.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::contains(), llvm::find_if(), llvm::findDbgDeclares(), llvm::findDVRDeclares(), I, and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert().
Referenced by buildFrameDebugInfo().
|
static |
Definition at line 2191 of file CoroFrame.cpp.
References llvm::SmallVectorBase< Size_T >::empty(), F, llvm::BasicBlock::phis(), llvm::SmallVectorImpl< T >::pop_back_val(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 2837 of file CoroFrame.cpp.
References llvm::coro::Shape::ABI, llvm::coro::Shape::CoroSuspends, llvm::SmallVectorImpl< T >::emplace_back(), llvm::Module::getDataLayout(), llvm::Instruction::getModule(), llvm::Instruction::hasMetadata(), llvm::coro::Shape::SwitchLoweringStorage::PromiseAlloca, and llvm::coro::Shape::SwitchLowering.
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 3031 of file CoroFrame.cpp.
References llvm::MapVector< KeyT, ValueT, MapType, VectorType >::count(), llvm::dbgs(), dumpRemats(), F, I, instructions, LLVM_DEBUG, and rewriteMaterializableInstructions().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 570 of file CoroFrame.cpp.
References A, and llvm::dbgs().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 560 of file CoroFrame.cpp.
References llvm::dbgs().
Referenced by doRematerializations().
Definition at line 551 of file CoroFrame.cpp.
References llvm::dbgs(), and I.
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Eliminate all problematic uses of swifterror arguments and allocas from the function.
We'll fix them up later when splitting the function.
Definition at line 2678 of file CoroFrame.cpp.
References eliminateSwiftErrorAlloca(), eliminateSwiftErrorArgument(), llvm::SmallVectorBase< Size_T >::empty(), F, llvm::AllocaInst::isSwiftError(), llvm::PromoteMemToReg(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::AllocaInst::setSwiftError().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Eliminate a formerly-swifterror alloca by inserting the get/set intrinsics and attempting to MemToReg the alloca away.
Definition at line 2615 of file CoroFrame.cpp.
References Addr, assert(), emitSetAndGetSwiftErrorValueAround(), llvm::Use::getUser(), llvm::isAllocaPromotable(), llvm::make_early_inc_range(), llvm::Use::set(), and llvm::Value::uses().
Referenced by eliminateSwiftError(), and eliminateSwiftErrorArgument().
|
static |
"Eliminate" a swifterror argument by reducing it to the alloca case and then loading and storing in the prologue and epilog.
The argument keeps the swifterror flag.
Definition at line 2641 of file CoroFrame.cpp.
References llvm::coro::Shape::CoroEnds, llvm::coro::Shape::CoroSuspends, llvm::IRBuilderBase::CreateAlloca(), llvm::IRBuilderBase::CreateLoad(), llvm::IRBuilderBase::CreateStore(), eliminateSwiftErrorAlloca(), emitSetAndGetSwiftErrorValueAround(), emitSetSwiftErrorValue(), End, F, llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Value::replaceAllUsesWith(), and llvm::IRBuilderBase::SetInsertPoint().
Referenced by eliminateSwiftError().
|
static |
Get the current swifterror value.
Definition at line 2552 of file CoroFrame.cpp.
References llvm::IRBuilderBase::CreateCall(), llvm::ConstantPointerNull::get(), llvm::IRBuilderBase::getPtrTy(), and llvm::coro::Shape::SwiftErrorOps.
Referenced by emitSetAndGetSwiftErrorValueAround().
|
static |
Set the swifterror value from the given alloca before a call, then put in back in the alloca afterwards.
Returns an address that will stand in for the swifterror slot until splitting.
Definition at line 2585 of file CoroFrame.cpp.
References Addr, llvm::IRBuilderBase::CreateLoad(), llvm::IRBuilderBase::CreateStore(), emitGetSwiftErrorValue(), emitSetSwiftErrorValue(), llvm::AllocaInst::getAllocatedType(), and llvm::IRBuilderBase::SetInsertPoint().
Referenced by eliminateSwiftErrorAlloca(), and eliminateSwiftErrorArgument().
|
static |
Set the given value as the current swifterror value.
Returns a slot that can be used as a swifterror slot.
Definition at line 2567 of file CoroFrame.cpp.
References llvm::IRBuilderBase::CreateCall(), llvm::ConstantPointerNull::get(), llvm::IRBuilderBase::getPtrTy(), and llvm::coro::Shape::SwiftErrorOps.
Referenced by eliminateSwiftErrorArgument(), and emitSetAndGetSwiftErrorValueAround().
|
static |
Definition at line 1752 of file CoroFrame.cpp.
References A, llvm::coro::Shape::ABI, llvm::coro::Shape::AllocaSpillBlock, llvm::any_of(), assert(), llvm::BasicBlock::begin(), llvm::CallingConv::C, llvm::SmallVectorImpl< T >::clear(), llvm::coro::Shape::CoroBegin, llvm::IRBuilderBase::CreateAdd(), llvm::IRBuilderBase::CreateAddrSpaceCast(), llvm::IRBuilderBase::CreateAlignedLoad(), llvm::IRBuilderBase::CreateAlignedStore(), llvm::IRBuilderBase::CreateAnd(), llvm::IRBuilderBase::CreateConstInBoundsGEP2_32(), llvm::IRBuilderBase::CreateInBoundsGEP(), llvm::IRBuilderBase::CreateIntToPtr(), llvm::IRBuilderBase::CreateLoad(), llvm::IRBuilderBase::CreateNot(), llvm::IRBuilderBase::CreatePtrAdd(), llvm::IRBuilderBase::CreatePtrToInt(), llvm::IRBuilderBase::CreateStore(), llvm::DominatorTree::dominates(), llvm::SmallVectorBase< Size_T >::empty(), llvm::TinyPtrVector< EltTy >::empty(), llvm::Instruction::eraseFromParent(), F, llvm::filterDbgVars(), llvm::findDbgDeclares(), llvm::findDbgUsers(), llvm::findDVRDeclares(), llvm::for_each(), FramePtr, llvm::coro::Shape::FramePtr, llvm::coro::Shape::FrameTy, G, GEP, llvm::IntegerType::get(), llvm::ValueAsMetadata::get(), llvm::AllocaInst::getAlign(), llvm::AllocaInst::getAllocatedType(), llvm::AllocaInst::getArraySize(), llvm::Value::getContext(), llvm::StructType::getElementType(), llvm::BasicBlock::getFirstInsertionPt(), llvm::Instruction::getFunction(), llvm::IRBuilderBase::GetInsertPoint(), llvm::coro::Shape::getInsertPtAfterFramePtr(), llvm::Type::getInt32Ty(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::Instruction::getModule(), llvm::Value::getName(), llvm::GlobalValue::getParent(), llvm::BasicBlock::getParent(), llvm::Instruction::getParent(), llvm::BasicBlock::getTerminator(), llvm::AllocaInst::getType(), I, llvm::AllocaInst::isArrayAllocation(), llvm::coro::Shape::OptimizeFrame, P, llvm::coro::Shape::SwitchLoweringStorage::PromiseAlloca, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Value::replaceAllUsesWith(), llvm::Value::replaceUsesWithIf(), llvm::report_fatal_error(), llvm::coro::salvageDebugInfo(), llvm::IRBuilderBase::SetInsertPoint(), llvm::BasicBlock::splitBasicBlock(), splitBeforeCatchSwitch(), llvm::SplitEdge(), llvm::coro::Shape::SwitchLowering, UseNewDbgInfoFormat, llvm::Value::users(), llvm::Value::uses(), and llvm::Align::value().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 2301 of file CoroFrame.cpp.
References I.
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Is the given alloca "local", i.e.
bounded in lifetime to not cross a suspend point?
Definition at line 2436 of file CoroFrame.cpp.
References llvm::Instruction::getParent(), llvm::SmallPtrSetImpl< PtrType >::insert(), isSuspendReachableFrom(), and llvm::Value::users().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 2405 of file CoroFrame.cpp.
References llvm::BasicBlock::front().
Referenced by isSuspendReachableFrom(), sinkLifetimeStartMarkers(), and willLeaveFunctionImmediatelyAfter().
|
static |
Does control flow starting at the given block ever reach a suspend instruction before reaching a block in VisitedOrFreeBBs?
Definition at line 2413 of file CoroFrame.cpp.
References From, llvm::SmallPtrSetImpl< PtrType >::insert(), isSuspendBlock(), isSuspendReachableFrom(), and llvm::successors().
Referenced by isLocalAlloca(), and isSuspendReachableFrom().
|
static |
Definition at line 2469 of file CoroFrame.cpp.
References llvm::Value::users(), and willLeaveFunctionImmediatelyAfter().
Referenced by lowerLocalAllocas().
|
static |
Turn each of the given local allocas into a normal (dynamic) alloca instruction.
Definition at line 2487 of file CoroFrame.cpp.
References llvm::IRBuilderBase::CreateAlloca(), llvm::IRBuilderBase::CreateStackRestore(), llvm::IRBuilderBase::CreateStackSave(), llvm::IRBuilderBase::getInt8Ty(), localAllocaNeedsStackSave(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::AllocaInst::setAlignment(), llvm::IRBuilderBase::SetInsertPoint(), and llvm::Value::users().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Turn the given coro.alloca.alloc call into a dynamic allocation.
This happens during the all-instructions iteration, so it must not delete the call.
Definition at line 2527 of file CoroFrame.cpp.
References llvm::coro::Shape::emitAlloc(), llvm::coro::Shape::emitDealloc(), llvm::CoroAllocaAllocInst::getSize(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::IRBuilderBase::SetInsertPoint(), and llvm::Value::users().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 2098 of file CoroFrame.cpp.
References llvm::PHINode::addIncoming(), llvm::BasicBlock::begin(), llvm::PHINode::Create(), llvm::BasicBlock::front(), llvm::Value::getName(), and llvm::Instruction::insertBefore().
Referenced by rewritePHIs(), and rewritePHIsForCleanupPad().
|
static |
Definition at line 2309 of file CoroFrame.cpp.
References assert(), llvm::ReversePostOrderTraversal< GraphT, GT >::begin(), D, llvm::ReversePostOrderTraversal< GraphT, GT >::end(), llvm::BasicBlock::getTerminator(), I, llvm::Instruction::insertBefore(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::Value::setName().
Referenced by doRematerializations().
|
static |
Definition at line 2208 of file CoroFrame.cpp.
References assert(), llvm::PHINode::Create(), llvm::ehAwareSplitEdge(), llvm::Instruction::eraseFromParent(), llvm::BasicBlock::getFirstNonPHI(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::Value::getName(), llvm::Value::getType(), llvm::Instruction::insertBefore(), movePHIValuesToInsertedBlock(), llvm::predecessors(), llvm::Value::replaceAllUsesWith(), rewritePHIsForCleanupPad(), and llvm::Value::takeName().
Referenced by llvm::coro::buildCoroutineFrame(), and rewritePHIs().
|
static |
Definition at line 2279 of file CoroFrame.cpp.
References F, llvm::BasicBlock::front(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and rewritePHIs().
|
static |
Definition at line 2116 of file CoroFrame.cpp.
References llvm::BasicBlock::Create(), llvm::IRBuilderBase::CreateBr(), llvm::IRBuilderBase::CreatePHI(), llvm::IRBuilderBase::CreateSwitch(), llvm::IRBuilderBase::CreateUnreachable(), llvm::BasicBlock::getContext(), llvm::IRBuilderBase::getInt8Ty(), llvm::Value::getName(), llvm::BasicBlock::getParent(), llvm::Instruction::insertAfter(), movePHIValuesToInsertedBlock(), llvm::pred_size(), llvm::predecessors(), llvm::Instruction::removeFromParent(), llvm::IRBuilderBase::SetInsertPoint(), llvm::setUnwindEdgeTo(), and llvm::updatePhiNodes().
Referenced by rewritePHIs().
|
static |
Definition at line 2870 of file CoroFrame.cpp.
References llvm::DIExpression::appendOpsToArg(), llvm::IRBuilderBase::CreateAlloca(), llvm::IRBuilderBase::CreateStore(), llvm::DIExpression::DerefBefore, llvm::SmallVectorBase< Size_T >::empty(), llvm::DIExpression::EntryValue, F, llvm::Value::getName(), llvm::DIExpression::getNumLocationOperands(), llvm::Value::getType(), llvm::DIExpression::isEntryValue(), llvm::DIExpression::isSingleLocationExpression(), llvm::DIExpression::prepend(), llvm::salvageDebugInfoImpl(), and llvm::IRBuilderBase::SetInsertPoint().
Referenced by llvm::coro::salvageDebugInfo().
|
static |
For each local variable that all of its user are only used inside one of suspended region, we sink their lifetime.start markers to the place where after the suspend block.
Doing so minimizes the lifetime of each variable, hence minimizing the amount of data we end up putting on the frame.
Definition at line 2758 of file CoroFrame.cpp.
References assert(), llvm::coro::Shape::CoroSuspends, llvm::DominatorTree::dominates(), F, llvm::IntrinsicInst::getIntrinsicID(), llvm::BasicBlock::getParent(), llvm::Instruction::getParent(), llvm::BasicBlock::getSingleSuccessor(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), instructions, isLifetimeStart(), isSuspendBlock(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorBase< Size_T >::size(), and llvm::Value::users().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
retcon and retcon.once conventions assume that all spill uses can be sunk after the coro.begin intrinsic.
Definition at line 2711 of file CoroFrame.cpp.
References A, B, llvm::SetVector< T, Vector, Set, N >::begin(), llvm::DominatorTree::dominates(), llvm::SmallVectorBase< Size_T >::empty(), llvm::SetVector< T, Vector, Set, N >::end(), F, llvm::ilist_node_with_parent< NodeTy, ParentTy, Options >::getNextNode(), llvm::Instruction::getParent(), llvm::SetVector< T, Vector, Set, N >::insert(), llvm::Instruction::moveBefore(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::sort().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 1019 of file CoroFrame.cpp.
References assert(), llvm::BitWidth, llvm::DIBuilder::createArrayType(), llvm::DIBuilder::createBasicType(), llvm::DIBuilder::createMemberType(), llvm::DIBuilder::createPointerType(), llvm::DIBuilder::createStructType(), llvm::dbgs(), llvm::DataLayout::getABITypeAlign(), llvm::DIType::getAlignInBits(), llvm::StructLayout::getElementOffsetInBits(), llvm::TypeSize::getFixed(), llvm::DIType::getName(), llvm::DIBuilder::getOrCreateArray(), llvm::DIBuilder::getOrCreateSubrange(), llvm::DataLayout::getPrefTypeAlign(), llvm::DIType::getSizeInBits(), llvm::DataLayout::getStructLayout(), llvm::DataLayout::getTypeSizeInBits(), I, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::Type::isFloatingPointTy(), llvm::Type::isIntegerTy(), llvm::Type::isPointerTy(), llvm::Type::isStructTy(), LLVM_DEBUG, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::lookup(), Name, llvm::DIBuilder::replaceArrays(), Size, solveDIType(), solveTypeName(), and llvm::Align::value().
Referenced by buildFrameDebugInfo(), and solveDIType().
Create name for Type.
It uses MDString to store new created string to avoid memory leak.
Definition at line 981 of file CoroFrame.cpp.
References llvm::MDString::get(), llvm::Type::getContext(), llvm::Type::getStructName(), llvm::Type::isDoubleTy(), llvm::Type::isFloatingPointTy(), llvm::Type::isFloatTy(), llvm::Type::isIntegerTy(), llvm::Type::isPointerTy(), llvm::Type::isStructTy(), Name, OS, and llvm::SmallString< InternalLen >::str().
Referenced by solveDIType().
|
static |
Definition at line 2400 of file CoroFrame.cpp.
References I, Name, and splitBlockIfNotFirst().
Referenced by llvm::coro::buildCoroutineFrame().
|
static |
Definition at line 1719 of file CoroFrame.cpp.
References llvm::CleanupReturnInst::Create(), llvm::CleanupPadInst::Create(), llvm::Instruction::eraseFromParent(), llvm::Instruction::getParent(), llvm::CatchSwitchInst::getParentPad(), llvm::BasicBlock::getTerminator(), and llvm::BasicBlock::splitBasicBlock().
Referenced by insertSpills().
|
static |
Definition at line 2387 of file CoroFrame.cpp.
References llvm::BasicBlock::front(), llvm::BasicBlock::getSinglePredecessor(), I, Name, llvm::Value::setName(), and llvm::BasicBlock::splitBasicBlock().
Referenced by splitAround().
|
static |
After we split the coroutine, will the given basic block be along an obvious exit path for the resumption function?
Definition at line 2450 of file CoroFrame.cpp.
References isSuspendBlock(), llvm::successors(), and willLeaveFunctionImmediatelyAfter().
Referenced by localAllocaNeedsStackSave(), and willLeaveFunctionImmediatelyAfter().