LLVM  14.0.0git
Macros | Typedefs | Functions | Variables
CodeExtractor.cpp File Reference
#include "llvm/Transforms/Utils/CodeExtractor.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/BlockFrequencyInfoImpl.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalValue.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/Module.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Pass.h"
#include "llvm/Support/BlockFrequency.h"
#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Local.h"
#include <cassert>
#include <cstdint>
#include <iterator>
#include <map>
#include <set>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "code-extractor"
 

Typedefs

using ProfileCount = Function::ProfileCount
 

Functions

static bool isBlockValidForExtraction (const BasicBlock &BB, const SetVector< BasicBlock * > &Result, bool AllowVarArgs, bool AllowAlloca)
 Test whether a block is valid for extraction. More...
 
static SetVector< BasicBlock * > buildExtractionBlockSet (ArrayRef< BasicBlock * > BBs, DominatorTree *DT, bool AllowVarArgs, bool AllowAlloca)
 Build a set of blocks to extract if the input blocks are viable. More...
 
static bool definedInRegion (const SetVector< BasicBlock * > &Blocks, Value *V)
 definedInRegion - Return true if the specified value is defined in the extracted region. More...
 
static bool definedInCaller (const SetVector< BasicBlock * > &Blocks, Value *V)
 definedInCaller - Return true if the specified value is defined in the function being code extracted, but not in the region being extracted. More...
 
static BasicBlockgetCommonExitBlock (const SetVector< BasicBlock * > &Blocks)
 
static void eraseLifetimeMarkersOnInputs (const SetVector< BasicBlock * > &Blocks, const SetVector< Value * > &SunkAllocas, SetVector< Value * > &LifetimesStart)
 Erase lifetime.start markers which reference inputs to the extraction region, and insert the referenced memory into LifetimesStart. More...
 
static void insertLifetimeMarkersSurroundingCall (Module *M, ArrayRef< Value * > LifetimesStart, ArrayRef< Value * > LifetimesEnd, CallInst *TheCall)
 Insert lifetime start/end markers surrounding the call to the new function for objects defined in the caller. More...
 
static void eraseDebugIntrinsicsWithNonLocalRefs (Function &F)
 Erase debug info intrinsics which refer to values in F but aren't in F. More...
 
static void fixupDebugInfoPostExtraction (Function &OldFunc, Function &NewFunc, CallInst &TheCall)
 Fix up the debug info in the old and new functions by pointing line locations and debug intrinsics to the new subprogram scope, and by deleting intrinsics which point to values outside of the new function. More...
 

Variables

static cl::opt< bool > AggregateArgsOpt ("aggregate-extracted-args", cl::Hidden, cl::desc("Aggregate arguments to code-extracted functions"))
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "code-extractor"

Definition at line 77 of file CodeExtractor.cpp.

Typedef Documentation

◆ ProfileCount

Definition at line 75 of file CodeExtractor.cpp.

Function Documentation

◆ buildExtractionBlockSet()

static SetVector<BasicBlock *> buildExtractionBlockSet ( ArrayRef< BasicBlock * >  BBs,
DominatorTree DT,
bool  AllowVarArgs,
bool  AllowAlloca 
)
static

Build a set of blocks to extract if the input blocks are viable.

Definition at line 199 of file CodeExtractor.cpp.

References assert(), BB, llvm::dbgs(), llvm::ArrayRef< T >::empty(), isBlockValidForExtraction(), llvm::DominatorTree::isReachableFromEntry(), LLVM_DEBUG, llvm_unreachable, and llvm::predecessors().

◆ definedInCaller()

static bool definedInCaller ( const SetVector< BasicBlock * > &  Blocks,
Value V 
)
static

definedInCaller - Return true if the specified value is defined in the function being code extracted, but not in the region being extracted.

These values must be passed in as live-ins to the function.

Definition at line 280 of file CodeExtractor.cpp.

References llvm::SetVector< T, Vector, Set >::count(), and I.

Referenced by llvm::CodeExtractor::findInputsOutputs().

◆ definedInRegion()

static bool definedInRegion ( const SetVector< BasicBlock * > &  Blocks,
Value V 
)
static

definedInRegion - Return true if the specified value is defined in the extracted region.

Definition at line 270 of file CodeExtractor.cpp.

References llvm::SetVector< T, Vector, Set >::count(), and I.

Referenced by llvm::CodeExtractor::findAllocas(), and llvm::CodeExtractor::findInputsOutputs().

◆ eraseDebugIntrinsicsWithNonLocalRefs()

static void eraseDebugIntrinsicsWithNonLocalRefs ( Function F)
static

Erase debug info intrinsics which refer to values in F but aren't in F.

Definition at line 1453 of file CodeExtractor.cpp.

References F, llvm::findDbgUsers(), I, and llvm::instructions().

Referenced by fixupDebugInfoPostExtraction().

◆ eraseLifetimeMarkersOnInputs()

static void eraseLifetimeMarkersOnInputs ( const SetVector< BasicBlock * > &  Blocks,
const SetVector< Value * > &  SunkAllocas,
SetVector< Value * > &  LifetimesStart 
)
static

Erase lifetime.start markers which reference inputs to the extraction region, and insert the referenced memory into LifetimesStart.

The extraction region is defined by a set of blocks (Blocks), and a set of allocas which will be moved from the caller function into the extracted function (SunkAllocas).

Definition at line 1043 of file CodeExtractor.cpp.

References BB.

◆ fixupDebugInfoPostExtraction()

static void fixupDebugInfoPostExtraction ( Function OldFunc,
Function NewFunc,
CallInst TheCall 
)
static

◆ getCommonExitBlock()

static BasicBlock* getCommonExitBlock ( const SetVector< BasicBlock * > &  Blocks)
static

◆ insertLifetimeMarkersSurroundingCall()

static void insertLifetimeMarkersSurroundingCall ( Module M,
ArrayRef< Value * >  LifetimesStart,
ArrayRef< Value * >  LifetimesEnd,
CallInst TheCall 
)
static

◆ isBlockValidForExtraction()

static bool isBlockValidForExtraction ( const BasicBlock BB,
const SetVector< BasicBlock * > &  Result,
bool  AllowVarArgs,
bool  AllowAlloca 
)
static

Test whether a block is valid for extraction.

Definition at line 88 of file CodeExtractor.cpp.

References BB, E, F, getParent(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::User::operands(), and llvm::SmallVectorImpl< T >::pop_back_val().

Referenced by buildExtractionBlockSet().

Variable Documentation

◆ AggregateArgsOpt

cl::opt<bool> AggregateArgsOpt("aggregate-extracted-args", cl::Hidden, cl::desc("Aggregate arguments to code-extracted functions"))
static