LLVM  6.0.0svn
Classes | Namespaces | Macros | Typedefs | Functions | Variables
RewriteStatepointsForGC.cpp File Reference
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constant.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/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/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Statepoint.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/PromoteMemToReg.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <iterator>
#include <set>
#include <string>
#include <utility>
#include <vector>

Go to the source code of this file.

Classes

struct  false::GCPtrLivenessData
 
struct  false::PartiallyConstructedSafepointRecord
 

Namespaces

 false
 

Macros

#define DEBUG_TYPE   "rewrite-statepoints-for-gc"
 

Typedefs

using false::DefiningValueMapTy = MapVector< Value *, Value * >
 
using false::StatepointLiveSetTy = SetVector< Value * >
 
using false::RematerializedValueMapTy = MapVector< AssertingVH< Instruction >, AssertingVH< Value > >
 

Functions

 INITIALIZE_PASS_BEGIN (RewriteStatepointsForGC, "rewrite-statepoints-for-gc", "Make relocations explicit at statepoints", false, false) INITIALIZE_PASS_END(RewriteStatepointsForGC
 
static ArrayRef< UseGetDeoptBundleOperands (ImmutableCallSite CS)
 
static void computeLiveInValues (DominatorTree &DT, Function &F, GCPtrLivenessData &Data)
 Compute the live-in set for every basic block in the function. More...
 
static void findLiveSetAtInst (Instruction *inst, GCPtrLivenessData &Data, StatepointLiveSetTy &out)
 Given results from the dataflow liveness computation, find the set of live Values at a particular instruction. More...
 
static bool isGCPointerType (Type *T)
 
static bool isHandledGCPointerType (Type *T)
 
static bool containsGCPtrType (Type *Ty)
 Returns true if this type contains a gc pointer whether we know how to handle that type or not. More...
 
static bool isUnhandledGCPointerType (Type *Ty)
 
static std::string suffixed_name_or (Value *V, StringRef Suffix, StringRef DefaultName)
 
static void analyzeParsePointLiveness (DominatorTree &DT, GCPtrLivenessData &OriginalLivenessData, CallSite CS, PartiallyConstructedSafepointRecord &Result)
 
static bool isKnownBaseResult (Value *V)
 Given the result of a call to findBaseDefiningValue, or findBaseOrBDV, is it known to be a base pointer? Or do we need to continue searching. More...
 
static BaseDefiningValueResult findBaseDefiningValue (Value *I)
 Helper function for findBasePointer - Will return a value which either a) defines the base pointer for the input, b) blocks the simple search (i.e. More...
 
static BaseDefiningValueResult findBaseDefiningValueOfVector (Value *I)
 Return a base defining value for the 'Index' element of the given vector instruction 'I'. More...
 
static ValuefindBaseDefiningValueCached (Value *I, DefiningValueMapTy &Cache)
 Returns the base defining value for this value. More...
 
static ValuefindBaseOrBDV (Value *I, DefiningValueMapTy &Cache)
 Return a base pointer for this value if known. More...
 
static raw_ostreamoperator<< (raw_ostream &OS, const BDVState &State)
 
static BDVState meetBDVStateImpl (const BDVState &LHS, const BDVState &RHS)
 
static BDVState meetBDVState (const BDVState &LHS, const BDVState &RHS)
 
static ValuefindBasePointer (Value *I, DefiningValueMapTy &Cache)
 For a given value or instruction, figure out what base ptr its derived from. More...
 
static void findBasePointers (const StatepointLiveSetTy &live, MapVector< Value *, Value *> &PointerToBase, DominatorTree *DT, DefiningValueMapTy &DVCache)
 
static void findBasePointers (DominatorTree &DT, DefiningValueMapTy &DVCache, CallSite CS, PartiallyConstructedSafepointRecord &result)
 Find the required based pointers (and adjust the live set) for the given parse point. More...
 
static void recomputeLiveInValues (GCPtrLivenessData &RevisedLivenessData, CallSite CS, PartiallyConstructedSafepointRecord &result)
 Given an updated version of the dataflow liveness results, update the liveset and base pointer maps for the call site CS. More...
 
static void recomputeLiveInValues (Function &F, DominatorTree &DT, ArrayRef< CallSite > toUpdate, MutableArrayRef< struct PartiallyConstructedSafepointRecord > records)
 
static BasicBlocknormalizeForInvokeSafepoint (BasicBlock *BB, BasicBlock *InvokeParent, DominatorTree &DT)
 
static AttributeList legalizeCallAttributes (AttributeList AL)
 
static void CreateGCRelocates (ArrayRef< Value *> LiveVariables, const int LiveStart, ArrayRef< Value *> BasePtrs, Instruction *StatepointToken, IRBuilder<> Builder)
 Helper function to place all gc relocates necessary for the given statepoint. More...
 
static StringRef getDeoptLowering (CallSite CS)
 
static void makeStatepointExplicitImpl (const CallSite CS, const SmallVectorImpl< Value *> &BasePtrs, const SmallVectorImpl< Value *> &LiveVariables, PartiallyConstructedSafepointRecord &Result, std::vector< DeferredReplacement > &Replacements)
 
static void makeStatepointExplicit (DominatorTree &DT, CallSite CS, PartiallyConstructedSafepointRecord &Result, std::vector< DeferredReplacement > &Replacements)
 
static void insertRelocationStores (iterator_range< Value::user_iterator > GCRelocs, DenseMap< Value *, Value *> &AllocaMap, DenseSet< Value *> &VisitedLiveValues)
 
static void insertRematerializationStores (const RematerializedValueMapTy &RematerializedValues, DenseMap< Value *, Value *> &AllocaMap, DenseSet< Value *> &VisitedLiveValues)
 
static void relocationViaAlloca (Function &F, DominatorTree &DT, ArrayRef< Value *> Live, ArrayRef< PartiallyConstructedSafepointRecord > Records)
 Do all the relocation update via allocas and mem2reg. More...
 
template<typename T >
static void unique_unsorted (SmallVectorImpl< T > &Vec)
 Implement a unique function which doesn't require we sort the input vector. More...
 
static void insertUseHolderAfter (CallSite &CS, const ArrayRef< Value *> Values, SmallVectorImpl< CallInst *> &Holders)
 Insert holders so that each Value is obviously live through the entire lifetime of the call. More...
 
static void findLiveReferences (Function &F, DominatorTree &DT, ArrayRef< CallSite > toUpdate, MutableArrayRef< struct PartiallyConstructedSafepointRecord > records)
 
static ValuefindRematerializableChainToBasePointer (SmallVectorImpl< Instruction *> &ChainToBase, Value *CurrentValue)
 
static unsigned chainToBasePointerCost (SmallVectorImpl< Instruction *> &Chain, TargetTransformInfo &TTI)
 
static bool AreEquivalentPhiNodes (PHINode &OrigRootPhi, PHINode &AlternateRootPhi)
 
static void rematerializeLiveValues (CallSite CS, PartiallyConstructedSafepointRecord &Info, TargetTransformInfo &TTI)
 
static bool insertParsePoints (Function &F, DominatorTree &DT, TargetTransformInfo &TTI, SmallVectorImpl< CallSite > &ToUpdate)
 
template<typename AttrHolder >
static void RemoveNonValidAttrAtIndex (LLVMContext &Ctx, AttrHolder &AH, unsigned Index)
 
static bool shouldRewriteStatepointsIn (Function &F)
 Returns true if this function should be rewritten by this pass. More...
 
static void computeLiveInValues (BasicBlock::reverse_iterator Begin, BasicBlock::reverse_iterator End, SetVector< Value *> &LiveTmp)
 Compute the live-in set for the location rbegin starting from the live-out set of the basic block. More...
 
static void computeLiveOutSeed (BasicBlock *BB, SetVector< Value *> &LiveTmp)
 
static SetVector< Value * > computeKillSet (BasicBlock *BB)
 
static void checkBasicSSA (DominatorTree &DT, SetVector< Value *> &Live, TerminatorInst *TI, bool TermOkay=false)
 Check that the items in 'Live' dominate 'TI'. More...
 
static void checkBasicSSA (DominatorTree &DT, GCPtrLivenessData &Data, BasicBlock &BB)
 Check that all the liveness sets used during the computation of liveness obey basic SSA properties. More...
 

Variables

static cl::opt< boolPrintLiveSet ("spp-print-liveset", cl::Hidden, cl::init(false))
 
static cl::opt< boolPrintLiveSetSize ("spp-print-liveset-size", cl::Hidden, cl::init(false))
 
static cl::opt< boolPrintBasePointers ("spp-print-base-pointers", cl::Hidden, cl::init(false))
 
static cl::opt< unsignedRematerializationThreshold ("spp-rematerialization-threshold", cl::Hidden, cl::init(6))
 
static bool ClobberNonLive = false
 
static cl::opt< bool, trueClobberNonLiveOverride ("rs4gc-clobber-non-live", cl::location(ClobberNonLive), cl::Hidden)
 
static cl::opt< boolAllowStatepointWithNoDeoptInfo ("rs4gc-allow-statepoint-with-no-deopt-info", cl::Hidden, cl::init(true))
 
rewrite statepoints for gc
 
rewrite statepoints for Make relocations at statepoints
 
rewrite statepoints for Make relocations at false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "rewrite-statepoints-for-gc"

Definition at line 77 of file RewriteStatepointsForGC.cpp.

Function Documentation

◆ analyzeParsePointLiveness()

static void analyzeParsePointLiveness ( DominatorTree DT,
GCPtrLivenessData &  OriginalLivenessData,
CallSite  CS,
PartiallyConstructedSafepointRecord &  Result 
)
static

◆ AreEquivalentPhiNodes()

static bool AreEquivalentPhiNodes ( PHINode OrigRootPhi,
PHINode AlternateRootPhi 
)
static

◆ chainToBasePointerCost()

static unsigned chainToBasePointerCost ( SmallVectorImpl< Instruction *> &  Chain,
TargetTransformInfo TTI 
)
static

◆ checkBasicSSA() [1/2]

static void checkBasicSSA ( DominatorTree DT,
SetVector< Value *> &  Live,
TerminatorInst TI,
bool  TermOkay = false 
)
static

Check that the items in 'Live' dominate 'TI'.

This is used as a basic sanity check for the liveness computation.

Definition at line 2616 of file RewriteStatepointsForGC.cpp.

References assert(), and llvm::DominatorTree::dominates().

Referenced by checkBasicSSA(), and computeLiveInValues().

◆ checkBasicSSA() [2/2]

static void checkBasicSSA ( DominatorTree DT,
GCPtrLivenessData &  Data,
BasicBlock BB 
)
static

Check that all the liveness sets used during the computation of liveness obey basic SSA properties.

This is useful for finding cases where we miss a def.

Definition at line 2634 of file RewriteStatepointsForGC.cpp.

References checkBasicSSA(), and llvm::BasicBlock::getTerminator().

◆ computeKillSet()

static SetVector<Value *> computeKillSet ( BasicBlock BB)
static

◆ computeLiveInValues() [1/2]

static void computeLiveInValues ( DominatorTree DT,
Function F,
GCPtrLivenessData &  Data 
)
static

◆ computeLiveInValues() [2/2]

static void computeLiveInValues ( BasicBlock::reverse_iterator  Begin,
BasicBlock::reverse_iterator  End,
SetVector< Value *> &  LiveTmp 
)
static

Compute the live-in set for the location rbegin starting from the live-out set of the basic block.

Definition at line 2556 of file RewriteStatepointsForGC.cpp.

References assert(), llvm::Value::getType(), llvm::SetVector< T, Vector, Set >::insert(), isHandledGCPointerType(), isUnhandledGCPointerType(), llvm::make_range(), llvm::User::operands(), and llvm::SetVector< T, Vector, Set >::remove().

◆ computeLiveOutSeed()

static void computeLiveOutSeed ( BasicBlock BB,
SetVector< Value *> &  LiveTmp 
)
static

◆ containsGCPtrType()

static bool containsGCPtrType ( Type Ty)
static

Returns true if this type contains a gc pointer whether we know how to handle that type or not.

Definition at line 291 of file RewriteStatepointsForGC.cpp.

References llvm::any_of(), isGCPointerType(), and llvm::ARM_MB::ST.

Referenced by isUnhandledGCPointerType().

◆ CreateGCRelocates()

static void CreateGCRelocates ( ArrayRef< Value *>  LiveVariables,
const int  LiveStart,
ArrayRef< Value *>  BasePtrs,
Instruction StatepointToken,
IRBuilder<>  Builder 
)
static

◆ findBaseDefiningValue()

static BaseDefiningValueResult findBaseDefiningValue ( Value I)
static

Helper function for findBasePointer - Will return a value which either a) defines the base pointer for the input, b) blocks the simple search (i.e.

a PHI or Select of two derived pointers), or c) involves a change from pointer to vector type or back.

Definition at line 440 of file RewriteStatepointsForGC.cpp.

References assert(), llvm::tgtok::Def, findBaseDefiningValueOfVector(), GEP, llvm::ConstantPointerNull::get(), llvm::Value::getType(), llvm::Type::isPtrOrPtrVectorTy(), llvm::Type::isVectorTy(), and llvm_unreachable.

Referenced by analyzeParsePointLiveness(), findBaseDefiningValueCached(), and findBaseDefiningValueOfVector().

◆ findBaseDefiningValueCached()

static Value* findBaseDefiningValueCached ( Value I,
DefiningValueMapTy &  Cache 
)
static

Returns the base defining value for this value.

Definition at line 559 of file RewriteStatepointsForGC.cpp.

References assert(), llvm::dbgs(), DEBUG, findBaseDefiningValue(), llvm::Value::getName(), and I.

Referenced by findBaseOrBDV().

◆ findBaseDefiningValueOfVector()

static BaseDefiningValueResult findBaseDefiningValueOfVector ( Value I)
static

Return a base defining value for the 'Index' element of the given vector instruction 'I'.

If Index is null, returns a BDV for the entire vector 'I'. As an optimization, this method will try to determine when the element is known to already be a base pointer. If this can be established, the second value in the returned pair will be true. Note that either a vector or a pointer typed value can be returned. For the former, the vector returned is a BDV (and possibly a base) of the entire vector 'I'. If the later, the return pointer is a BDV (or possibly a base) for the particular element in 'I'.

Definition at line 388 of file RewriteStatepointsForGC.cpp.

References assert(), findBaseDefiningValue(), GEP, llvm::ConstantAggregateZero::get(), and llvm::Value::getType().

Referenced by findBaseDefiningValue().

◆ findBaseOrBDV()

static Value* findBaseOrBDV ( Value I,
DefiningValueMapTy &  Cache 
)
static

Return a base pointer for this value if known.

Otherwise, return it's base defining value.

Definition at line 572 of file RewriteStatepointsForGC.cpp.

References llvm::tgtok::Def, and findBaseDefiningValueCached().

Referenced by findBasePointer().

◆ findBasePointer()

static Value* findBasePointer ( Value I,
DefiningValueMapTy &  Cache 
)
static

◆ findBasePointers() [1/2]

static void findBasePointers ( const StatepointLiveSetTy &  live,
MapVector< Value *, Value *> &  PointerToBase,
DominatorTree DT,
DefiningValueMapTy &  DVCache 
)
static

◆ findBasePointers() [2/2]

static void findBasePointers ( DominatorTree DT,
DefiningValueMapTy &  DVCache,
CallSite  CS,
PartiallyConstructedSafepointRecord &  result 
)
static

Find the required based pointers (and adjust the live set) for the given parse point.

Definition at line 1122 of file RewriteStatepointsForGC.cpp.

References llvm::errs(), findBasePointers(), PrintBasePointers, and recomputeLiveInValues().

◆ findLiveReferences()

static void findLiveReferences ( Function F,
DominatorTree DT,
ArrayRef< CallSite toUpdate,
MutableArrayRef< struct PartiallyConstructedSafepointRecord >  records 
)
static

◆ findLiveSetAtInst()

static void findLiveSetAtInst ( Instruction inst,
GCPtrLivenessData &  Data,
StatepointLiveSetTy &  out 
)
static

◆ findRematerializableChainToBasePointer()

static Value* findRematerializableChainToBasePointer ( SmallVectorImpl< Instruction *> &  ChainToBase,
Value CurrentValue 
)
static

◆ GetDeoptBundleOperands()

static ArrayRef<Use> GetDeoptBundleOperands ( ImmutableCallSite  CS)
static

◆ getDeoptLowering()

static StringRef getDeoptLowering ( CallSite  CS)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( RewriteStatepointsForGC  ,
"rewrite-statepoints-for-gc ,
"Make relocations explicit at statepoints ,
false  ,
false   
)

◆ insertParsePoints()

static bool insertParsePoints ( Function F,
DominatorTree DT,
TargetTransformInfo TTI,
SmallVectorImpl< CallSite > &  ToUpdate 
)
static

◆ insertRelocationStores()

static void insertRelocationStores ( iterator_range< Value::user_iterator GCRelocs,
DenseMap< Value *, Value *> &  AllocaMap,
DenseSet< Value *> &  VisitedLiveValues 
)
static

◆ insertRematerializationStores()

static void insertRematerializationStores ( const RematerializedValueMapTy &  RematerializedValues,
DenseMap< Value *, Value *> &  AllocaMap,
DenseSet< Value *> &  VisitedLiveValues 
)
static

◆ insertUseHolderAfter()

static void insertUseHolderAfter ( CallSite CS,
const ArrayRef< Value *>  Values,
SmallVectorImpl< CallInst *> &  Holders 
)
static

◆ isGCPointerType()

static bool isGCPointerType ( Type T)
static

Definition at line 263 of file RewriteStatepointsForGC.cpp.

Referenced by containsGCPtrType(), and isHandledGCPointerType().

◆ isHandledGCPointerType()

static bool isHandledGCPointerType ( Type T)
static

◆ isKnownBaseResult()

static bool isKnownBaseResult ( Value V)
static

Given the result of a call to findBaseDefiningValue, or findBaseOrBDV, is it known to be a base pointer? Or do we need to continue searching.

Definition at line 585 of file RewriteStatepointsForGC.cpp.

References assert(), llvm::dbgs(), llvm::dump(), LLVM_DUMP_METHOD, llvm::operator!=(), llvm::operator==(), Other, and llvm::Unknown.

Referenced by analyzeParsePointLiveness(), and findBasePointer().

◆ isUnhandledGCPointerType()

static bool isUnhandledGCPointerType ( Type Ty)
static

◆ legalizeCallAttributes()

static AttributeList legalizeCallAttributes ( AttributeList  AL)
static

◆ makeStatepointExplicit()

static void makeStatepointExplicit ( DominatorTree DT,
CallSite  CS,
PartiallyConstructedSafepointRecord &  Result,
std::vector< DeferredReplacement > &  Replacements 
)
static

◆ makeStatepointExplicitImpl()

static void makeStatepointExplicitImpl ( const CallSite  CS,
const SmallVectorImpl< Value *> &  BasePtrs,
const SmallVectorImpl< Value *> &  LiveVariables,
PartiallyConstructedSafepointRecord &  Result,
std::vector< DeferredReplacement > &  Replacements 
)
static

Definition at line 1361 of file RewriteStatepointsForGC.cpp.

References Arg, llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::arg_begin(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::arg_end(), assert(), llvm::BasicBlock::begin(), CreateGCRelocates(), llvm::IRBuilderBase::CreateGCResult(), llvm::IRBuilderBase::CreateGCStatepointCall(), llvm::IRBuilderBase::CreateGCStatepointInvoke(), llvm::StatepointDirectives::DefaultStatepointID, llvm::DeoptLiveIn, llvm::StringRef::equals(), llvm::StatepointBase< FunTy, InstructionTy, ValueTy, CallSiteTy >::gcArgsStartIdx(), llvm::GCTransition, llvm::FunctionType::get(), llvm::AttributeList::get(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getAttributes(), llvm::CallInst::getAttributes(), llvm::InvokeInst::getAttributes(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledValue(), llvm::CallInst::getCallingConv(), llvm::InvokeInst::getCallingConv(), llvm::Function::getContext(), llvm::Value::getContext(), llvm::Instruction::getDebugLoc(), GetDeoptBundleOperands(), getDeoptLowering(), llvm::BasicBlock::getFirstInsertionPt(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getInstruction(), llvm::Function::getIntrinsicID(), llvm::BasicBlock::getLandingPadInst(), llvm::Value::getName(), llvm::ilist_node_with_parent< NodeTy, ParentTy, Options >::getNextNode(), llvm::InvokeInst::getNormalDest(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getOperandBundle(), llvm::Module::getOrInsertFunction(), llvm::GlobalValue::getParent(), llvm::AttributeList::getRetAttributes(), llvm::CallInst::getTailCallKind(), llvm::Value::getType(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getType(), llvm::BasicBlock::getUniquePredecessor(), llvm::InvokeInst::getUnwindDest(), llvm::Type::getVoidTy(), llvm::Value::hasName(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::isCall(), llvm::Type::isVoidTy(), legalizeCallAttributes(), llvm::None, llvm::StatepointDirectives::NumPatchBytes, llvm::LLVMContext::OB_gc_transition, llvm::parseStatepointDirectivesFromAttrs(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::AttributeList::ReturnIndex, llvm::CallInst::setAttributes(), llvm::InvokeInst::setCallingConv(), llvm::IRBuilderBase::SetCurrentDebugLocation(), llvm::IRBuilderBase::SetInsertPoint(), llvm::Value::setName(), llvm::CallInst::setTailCallKind(), llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::StatepointDirectives::StatepointID, and llvm::Value::use_empty().

Referenced by makeStatepointExplicit().

◆ meetBDVState()

static BDVState meetBDVState ( const BDVState &  LHS,
const BDVState &  RHS 
)
static

Definition at line 698 of file RewriteStatepointsForGC.cpp.

References assert(), and meetBDVStateImpl().

Referenced by findBasePointer().

◆ meetBDVStateImpl()

static BDVState meetBDVStateImpl ( const BDVState &  LHS,
const BDVState &  RHS 
)
static

Definition at line 670 of file RewriteStatepointsForGC.cpp.

References assert(), llvm_unreachable, and llvm::Unknown.

Referenced by meetBDVState().

◆ normalizeForInvokeSafepoint()

static BasicBlock* normalizeForInvokeSafepoint ( BasicBlock BB,
BasicBlock InvokeParent,
DominatorTree DT 
)
static

◆ operator<<()

static raw_ostream& operator<< ( raw_ostream OS,
const BDVState &  State 
)
static

Definition at line 664 of file RewriteStatepointsForGC.cpp.

◆ recomputeLiveInValues() [1/2]

static void recomputeLiveInValues ( GCPtrLivenessData &  RevisedLivenessData,
CallSite  CS,
PartiallyConstructedSafepointRecord &  result 
)
static

◆ recomputeLiveInValues() [2/2]

static void recomputeLiveInValues ( Function F,
DominatorTree DT,
ArrayRef< CallSite toUpdate,
MutableArrayRef< struct PartiallyConstructedSafepointRecord >  records 
)
static

◆ relocationViaAlloca()

static void relocationViaAlloca ( Function F,
DominatorTree DT,
ArrayRef< Value *>  Live,
ArrayRef< PartiallyConstructedSafepointRecord >  Records 
)
static

◆ rematerializeLiveValues()

static void rematerializeLiveValues ( CallSite  CS,
PartiallyConstructedSafepointRecord &  Info,
TargetTransformInfo TTI 
)
static

◆ RemoveNonValidAttrAtIndex()

template<typename AttrHolder >
static void RemoveNonValidAttrAtIndex ( LLVMContext Ctx,
AttrHolder &  AH,
unsigned  Index 
)
static

◆ shouldRewriteStatepointsIn()

static bool shouldRewriteStatepointsIn ( Function F)
static

◆ suffixed_name_or()

static std::string suffixed_name_or ( Value V,
StringRef  Suffix,
StringRef  DefaultName 
)
static

◆ unique_unsorted()

template<typename T >
static void unique_unsorted ( SmallVectorImpl< T > &  Vec)
static

Implement a unique function which doesn't require we sort the input vector.

Doing so has the effect of changing the output of a couple of tests in ways which make them less useful in testing fused safepoints.

Definition at line 1830 of file RewriteStatepointsForGC.cpp.

References llvm::SmallVectorTemplateCommon< T >::end(), llvm::SmallVectorImpl< T >::erase(), llvm::SmallSet< T, N, C >::insert(), and llvm::remove_if().

Referenced by insertParsePoints().

Variable Documentation

◆ AllowStatepointWithNoDeoptInfo

cl::opt<bool> AllowStatepointWithNoDeoptInfo("rs4gc-allow-statepoint-with-no-deopt-info", cl::Hidden, cl::init(true))
static

Referenced by GetDeoptBundleOperands().

◆ ClobberNonLive

bool ClobberNonLive = false
static

Definition at line 100 of file RewriteStatepointsForGC.cpp.

◆ ClobberNonLiveOverride

cl::opt<bool, true> ClobberNonLiveOverride("rs4gc-clobber-non-live", cl::location(ClobberNonLive), cl::Hidden)
static

◆ false

rewrite statepoints for Make relocations at false
explicit

Definition at line 178 of file RewriteStatepointsForGC.cpp.

◆ gc

rewrite statepoints for gc

Definition at line 178 of file RewriteStatepointsForGC.cpp.

Referenced by llvm::LLLexer::LLLexer().

◆ PrintBasePointers

cl::opt<bool> PrintBasePointers("spp-print-base-pointers", cl::Hidden, cl::init(false))
static

◆ PrintLiveSet

cl::opt<bool> PrintLiveSet("spp-print-liveset", cl::Hidden, cl::init(false))
static

◆ PrintLiveSetSize

cl::opt<bool> PrintLiveSetSize("spp-print-liveset-size", cl::Hidden, cl::init(false))
static

◆ RematerializationThreshold

cl::opt<unsigned> RematerializationThreshold("spp-rematerialization-threshold", cl::Hidden, cl::init(6))
static

Referenced by rematerializeLiveValues().

◆ statepoints

rewrite statepoints for Make relocations at statepoints
explicit

Definition at line 178 of file RewriteStatepointsForGC.cpp.