LLVM  15.0.0git
Macros | Functions | Variables
GlobalOpt.cpp File Reference
#include "llvm/Transforms/IPO/GlobalOpt.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/Twine.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.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/GlobalAlias.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/AtomicOrdering.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/IPO.h"
#include "llvm/Transforms/Utils/CtorUtils.h"
#include "llvm/Transforms/Utils/Evaluator.h"
#include "llvm/Transforms/Utils/GlobalStatus.h"
#include "llvm/Transforms/Utils/Local.h"
#include <cassert>
#include <cstdint>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "globalopt"
 

Functions

 STATISTIC (NumMarked, "Number of globals marked constant")
 
 STATISTIC (NumUnnamed, "Number of globals marked unnamed_addr")
 
 STATISTIC (NumSRA, "Number of aggregate globals broken into scalars")
 
 STATISTIC (NumSubstitute,"Number of globals with initializers stored into them")
 
 STATISTIC (NumDeleted, "Number of globals deleted")
 
 STATISTIC (NumGlobUses, "Number of global uses devirtualized")
 
 STATISTIC (NumLocalized, "Number of globals localized")
 
 STATISTIC (NumShrunkToBool, "Number of global vars shrunk to booleans")
 
 STATISTIC (NumFastCallFns, "Number of functions converted to fastcc")
 
 STATISTIC (NumCtorsEvaluated, "Number of static ctors evaluated")
 
 STATISTIC (NumNestRemoved, "Number of nest attributes removed")
 
 STATISTIC (NumAliasesResolved, "Number of global aliases resolved")
 
 STATISTIC (NumAliasesRemoved, "Number of global aliases eliminated")
 
 STATISTIC (NumCXXDtorsRemoved, "Number of global C++ destructors removed")
 
 STATISTIC (NumInternalFunc, "Number of internal functions")
 
 STATISTIC (NumColdCC, "Number of functions marked coldcc")
 
static bool isLeakCheckerRoot (GlobalVariable *GV)
 Is this global variable possibly used by a leak checker as a root? If so, we might not really want to eliminate the stores to it. More...
 
static bool IsSafeComputationToRemove (Value *V, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
 Given a value that is stored to a global but never read, determine whether it's safe to remove the store and the chain of computation that feeds the store. More...
 
static bool CleanupPointerRootUsers (GlobalVariable *GV, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
 This GV is a pointer root. More...
 
static bool CleanupConstantGlobalUsers (GlobalVariable *GV, const DataLayout &DL)
 We just marked GV constant. More...
 
static bool collectSRATypes (DenseMap< uint64_t, Type * > &Types, GlobalValue *GV, const DataLayout &DL)
 Look at all uses of the global and determine which (offset, type) pairs it can be split into. More...
 
static void transferSRADebugInfo (GlobalVariable *GV, GlobalVariable *NGV, uint64_t FragmentOffsetInBits, uint64_t FragmentSizeInBits, uint64_t VarSize)
 Copy over the debug info for a variable to its SRA replacements. More...
 
static GlobalVariableSRAGlobal (GlobalVariable *GV, const DataLayout &DL)
 Perform scalar replacement of aggregates on the specified global variable. More...
 
static bool AllUsesOfValueWillTrapIfNull (const Value *V, SmallPtrSetImpl< const PHINode * > &PHIs)
 Return true if all users of the specified value will trap if the value is dynamically null. More...
 
static bool allUsesOfLoadedValueWillTrapIfNull (const GlobalVariable *GV)
 Return true if all uses of any loads from GV will trap if the loaded value is null. More...
 
static void allUsesOfLoadAndStores (GlobalVariable *GV, SmallVector< Value *, 4 > &Uses)
 Get all the loads/store uses for global variable GV. More...
 
static bool OptimizeAwayTrappingUsesOfValue (Value *V, Constant *NewV)
 
static bool OptimizeAwayTrappingUsesOfLoads (GlobalVariable *GV, Constant *LV, const DataLayout &DL, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
 The specified global has only one non-null value stored into it. More...
 
static void ConstantPropUsersOf (Value *V, const DataLayout &DL, TargetLibraryInfo *TLI)
 Walk the use list of V, constant folding all of the instructions that are foldable. More...
 
static GlobalVariableOptimizeGlobalAddressOfAllocation (GlobalVariable *GV, CallInst *CI, uint64_t AllocSize, Constant *InitVal, const DataLayout &DL, TargetLibraryInfo *TLI)
 This function takes the specified global variable, and transforms the program as if it always contained the result of the specified malloc. More...
 
static bool valueIsOnlyUsedLocallyOrStoredToOneGlobal (const CallInst *CI, const GlobalVariable *GV)
 Scan the use-list of GV checking to make sure that there are no complex uses of GV. More...
 
static bool tryToOptimizeStoreOfAllocationToGlobal (GlobalVariable *GV, CallInst *CI, AtomicOrdering Ordering, const DataLayout &DL, TargetLibraryInfo *TLI)
 If we have a global that is only initialized with a fixed size allocation try to transform the program to use global memory instead of heap allocated memory. More...
 
static bool optimizeOnceStoredGlobal (GlobalVariable *GV, Value *StoredOnceVal, AtomicOrdering Ordering, const DataLayout &DL, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
 
static bool TryToShrinkGlobalToBoolean (GlobalVariable *GV, Constant *OtherVal)
 At this point, we have learned that the only two values ever stored into GV are its initializer and OtherVal. More...
 
static bool deleteIfDead (GlobalValue &GV, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
 
static bool isPointerValueDeadOnEntryToFunction (const Function *F, GlobalValue *GV, function_ref< DominatorTree &(Function &)> LookupDomTree)
 
static bool allNonInstructionUsersCanBeMadeInstructions (Constant *C)
 C may have non-instruction users. More...
 
static void makeAllConstantUsesInstructions (Constant *C)
 C may have non-instruction users, and allNonInstructionUsersCanBeMadeInstructions has returned true. More...
 
static bool processInternalGlobal (GlobalVariable *GV, const GlobalStatus &GS, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< DominatorTree &(Function &)> LookupDomTree)
 Analyze the specified global variable and optimize it if possible. More...
 
static bool processGlobal (GlobalValue &GV, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< DominatorTree &(Function &)> LookupDomTree)
 Analyze the specified global variable and optimize it if possible. More...
 
static void ChangeCalleesToFastCall (Function *F)
 Walk all of the direct calls of the specified function, changing them to FastCC. More...
 
static AttributeList StripAttr (LLVMContext &C, AttributeList Attrs, Attribute::AttrKind A)
 
static void RemoveAttribute (Function *F, Attribute::AttrKind A)
 
static bool hasChangeableCC (Function *F)
 Return true if this is a calling convention that we'd like to change. More...
 
static bool isColdCallSite (CallBase &CB, BlockFrequencyInfo &CallerBFI)
 Return true if the block containing the call site has a BlockFrequency of less than ColdCCRelFreq% of the entry block. More...
 
static bool isValidCandidateForColdCC (Function &F, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, const std::vector< Function * > &AllCallsCold)
 
static void changeCallSitesToColdCC (Function *F)
 
static bool hasOnlyColdCalls (Function &F, function_ref< BlockFrequencyInfo &(Function &)> GetBFI)
 
static bool hasMustTailCallers (Function *F)
 
static bool hasInvokeCallers (Function *F)
 
static void RemovePreallocated (Function *F)
 
static bool OptimizeFunctions (Module &M, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, function_ref< DominatorTree &(Function &)> LookupDomTree, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
 
static bool OptimizeGlobalVars (Module &M, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< DominatorTree &(Function &)> LookupDomTree, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
 
static bool EvaluateStaticConstructor (Function *F, const DataLayout &DL, TargetLibraryInfo *TLI)
 Evaluate static constructors in the function, if we can. More...
 
static int compareNames (Constant *const *A, Constant *const *B)
 
static void setUsedInitializer (GlobalVariable &V, const SmallPtrSetImpl< GlobalValue * > &Init)
 
static bool hasUseOtherThanLLVMUsed (GlobalAlias &GA, const LLVMUsed &U)
 
static bool hasMoreThanOneUseOtherThanLLVMUsed (GlobalValue &V, const LLVMUsed &U)
 
static bool mayHaveOtherReferences (GlobalAlias &GA, const LLVMUsed &U)
 
static bool hasUsesToReplace (GlobalAlias &GA, const LLVMUsed &U, bool &RenameTarget)
 
static bool OptimizeGlobalAliases (Module &M, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
 
static FunctionFindCXAAtExit (Module &M, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
 
static bool cxxDtorIsEmpty (const Function &Fn)
 Returns whether the given function is an empty C++ destructor and can therefore be eliminated. More...
 
static bool OptimizeEmptyGlobalCXXDtors (Function *CXAAtExitFn)
 
static bool optimizeGlobalsInModule (Module &M, const DataLayout &DL, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, function_ref< DominatorTree &(Function &)> LookupDomTree)
 
 INITIALIZE_PASS_BEGIN (GlobalOptLegacyPass, "globalopt", "Global Variable Optimizer", false, false) INITIALIZE_PASS_END(GlobalOptLegacyPass
 

Variables

static cl::opt< bool > EnableColdCCStressTest ("enable-coldcc-stress-test", cl::desc("Enable stress test of coldcc by adding " "calling conv to all internal functions."), cl::init(false), cl::Hidden)
 
static cl::opt< intColdCCRelFreq ("coldcc-rel-freq", cl::Hidden, cl::init(2), cl::ZeroOrMore, cl::desc("Maximum block frequency, expressed as a percentage of caller's " "entry frequency, for a call site to be considered cold for enabling" "coldcc"))
 
 globalopt
 
Global Variable Optimizer
 
Global Variable false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "globalopt"

Definition at line 76 of file GlobalOpt.cpp.

Function Documentation

◆ allNonInstructionUsersCanBeMadeInstructions()

static bool allNonInstructionUsersCanBeMadeInstructions ( Constant C)
static

C may have non-instruction users.

Can all of those users be turned into instructions?

Definition at line 1392 of file GlobalOpt.cpp.

Referenced by processInternalGlobal().

◆ allUsesOfLoadAndStores()

static void allUsesOfLoadAndStores ( GlobalVariable GV,
SmallVector< Value *, 4 > &  Uses 
)
static

Get all the loads/store uses for global variable GV.

Definition at line 685 of file GlobalOpt.cpp.

References assert(), P, llvm::SmallVectorImpl< T >::pop_back_val(), and Uses.

Referenced by OptimizeGlobalAddressOfAllocation().

◆ allUsesOfLoadedValueWillTrapIfNull()

static bool allUsesOfLoadedValueWillTrapIfNull ( const GlobalVariable GV)
static

Return true if all uses of any loads from GV will trap if the loaded value is null.

Note that this also permits comparisons of the loaded value against null, as a special case.

Definition at line 655 of file GlobalOpt.cpp.

References AllUsesOfValueWillTrapIfNull(), P, llvm::SmallVectorImpl< T >::pop_back_val(), and SI.

Referenced by tryToOptimizeStoreOfAllocationToGlobal().

◆ AllUsesOfValueWillTrapIfNull()

static bool AllUsesOfValueWillTrapIfNull ( const Value V,
SmallPtrSetImpl< const PHINode * > &  PHIs 
)
static

Return true if all users of the specified value will trap if the value is dynamically null.

PHIs keeps track of any phi nodes we've seen to avoid reprocessing them.

Definition at line 598 of file GlobalOpt.cpp.

References assert(), llvm::PPC::getPredicate(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::CmpInst::isSigned(), llvm::NullPointerIsDefined(), SI, and llvm::Value::users().

Referenced by allUsesOfLoadedValueWillTrapIfNull().

◆ ChangeCalleesToFastCall()

static void ChangeCalleesToFastCall ( Function F)
static

Walk all of the direct calls of the specified function, changing them to FastCC.

Definition at line 1663 of file GlobalOpt.cpp.

References F, and llvm::CallingConv::Fast.

Referenced by OptimizeFunctions().

◆ changeCallSitesToColdCC()

static void changeCallSitesToColdCC ( Function F)
static

Definition at line 1760 of file GlobalOpt.cpp.

References llvm::CallingConv::Cold, and F.

Referenced by OptimizeFunctions().

◆ CleanupConstantGlobalUsers()

static bool CleanupConstantGlobalUsers ( GlobalVariable GV,
const DataLayout DL 
)
static

◆ CleanupPointerRootUsers()

static bool CleanupPointerRootUsers ( GlobalVariable GV,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI 
)
static

This GV is a pointer root.

Loop over all users of the global and clean up any that obviously don't assign the global a value that isn't dynamically allocated.

Definition at line 193 of file GlobalOpt.cpp.

References llvm::RegState::Dead, llvm::numbers::e, i, I, llvm::isAllocationFn(), llvm::GlobalVariable::isConstant(), IsSafeComputationToRemove(), llvm::isSafeToDestroyConstant(), llvm::make_early_inc_range(), SI, and llvm::Value::users().

Referenced by OptimizeAwayTrappingUsesOfLoads(), and processInternalGlobal().

◆ collectSRATypes()

static bool collectSRATypes ( DenseMap< uint64_t, Type * > &  Types,
GlobalValue GV,
const DataLayout DL 
)
static

◆ compareNames()

static int compareNames ( Constant *const A,
Constant *const B 
)
static

◆ ConstantPropUsersOf()

static void ConstantPropUsersOf ( Value V,
const DataLayout DL,
TargetLibraryInfo TLI 
)
static

Walk the use list of V, constant folding all of the instructions that are foldable.

Definition at line 839 of file GlobalOpt.cpp.

References llvm::ConstantFoldInstruction(), DL, E, I, llvm::isInstructionTriviallyDead(), llvm::Value::user_begin(), and llvm::Value::user_end().

Referenced by OptimizeGlobalAddressOfAllocation().

◆ cxxDtorIsEmpty()

static bool cxxDtorIsEmpty ( const Function Fn)
static

Returns whether the given function is an empty C++ destructor and can therefore be eliminated.

Note that we assume that other optimization passes have already simplified the code so we simply check for 'ret'.

Definition at line 2358 of file GlobalOpt.cpp.

References llvm::Function::getEntryBlock(), I, and llvm::GlobalValue::isDeclaration().

Referenced by OptimizeEmptyGlobalCXXDtors().

◆ deleteIfDead()

static bool deleteIfDead ( GlobalValue GV,
SmallPtrSetImpl< const Comdat * > &  NotDiscardableComdats 
)
static

◆ EvaluateStaticConstructor()

static bool EvaluateStaticConstructor ( Function F,
const DataLayout DL,
TargetLibraryInfo TLI 
)
static

Evaluate static constructors in the function, if we can.

Return true if we can, false otherwise.

Definition at line 2059 of file GlobalOpt.cpp.

References llvm::dbgs(), DL, llvm::Evaluator::EvaluateFunction(), F, llvm::Evaluator::getInvariants(), llvm::Evaluator::getMutatedInitializers(), and LLVM_DEBUG.

Referenced by optimizeGlobalsInModule().

◆ FindCXAAtExit()

static Function* FindCXAAtExit ( Module M,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI 
)
static

Definition at line 2329 of file GlobalOpt.cpp.

References F, and M.

Referenced by optimizeGlobalsInModule().

◆ hasChangeableCC()

static bool hasChangeableCC ( Function F)
static

Return true if this is a calling convention that we'd like to change.

The idea here is that we don't want to mess with the convention if the user explicitly requested something with performance implications like coldcc, GHC, or anyregcc.

Definition at line 1693 of file GlobalOpt.cpp.

References BB, llvm::CallingConv::C, F, llvm::CallInst::isMustTailCall(), and llvm::CallingConv::X86_ThisCall.

Referenced by hasOnlyColdCalls(), and OptimizeFunctions().

◆ hasInvokeCallers()

static bool hasInvokeCallers ( Function F)
static

Definition at line 1815 of file GlobalOpt.cpp.

References F.

Referenced by OptimizeFunctions().

◆ hasMoreThanOneUseOtherThanLLVMUsed()

static bool hasMoreThanOneUseOtherThanLLVMUsed ( GlobalValue V,
const LLVMUsed &  U 
)
static

Definition at line 2199 of file GlobalOpt.cpp.

References assert(), llvm::Value::hasNUsesOrMore(), and N.

Referenced by hasUsesToReplace().

◆ hasMustTailCallers()

static bool hasMustTailCallers ( Function F)
static

Definition at line 1801 of file GlobalOpt.cpp.

References assert(), F, and llvm::CallBase::isMustTailCall().

Referenced by OptimizeFunctions().

◆ hasOnlyColdCalls()

static bool hasOnlyColdCalls ( Function F,
function_ref< BlockFrequencyInfo &(Function &)>  GetBFI 
)
static

◆ hasUseOtherThanLLVMUsed()

static bool hasUseOtherThanLLVMUsed ( GlobalAlias GA,
const LLVMUsed &  U 
)
static

Definition at line 2183 of file GlobalOpt.cpp.

References assert(), llvm::Value::hasOneUse(), and llvm::Value::use_empty().

Referenced by hasUsesToReplace().

◆ hasUsesToReplace()

static bool hasUsesToReplace ( GlobalAlias GA,
const LLVMUsed &  U,
bool &  RenameTarget 
)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( GlobalOptLegacyPass  ,
"globalopt"  ,
"Global Variable Optimizer ,
false  ,
false   
)

◆ isColdCallSite()

static bool isColdCallSite ( CallBase CB,
BlockFrequencyInfo CallerBFI 
)
static

Return true if the block containing the call site has a BlockFrequency of less than ColdCCRelFreq% of the entry block.

Definition at line 1724 of file GlobalOpt.cpp.

References ColdCCRelFreq, llvm::BlockFrequencyInfo::getBlockFreq(), llvm::CallBase::getCaller(), llvm::Function::getEntryBlock(), and llvm::Instruction::getParent().

Referenced by hasOnlyColdCalls(), and isValidCandidateForColdCC().

◆ isLeakCheckerRoot()

static bool isLeakCheckerRoot ( GlobalVariable GV)
static

◆ isPointerValueDeadOnEntryToFunction()

static bool isPointerValueDeadOnEntryToFunction ( const Function F,
GlobalValue GV,
function_ref< DominatorTree &(Function &)>  LookupDomTree 
)
static

◆ IsSafeComputationToRemove()

static bool IsSafeComputationToRemove ( Value V,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI 
)
static

Given a value that is stored to a global but never read, determine whether it's safe to remove the store and the chain of computation that feeds the store.

Definition at line 162 of file GlobalOpt.cpp.

References GEP, llvm::Value::hasOneUse(), I, and llvm::isAllocationFn().

Referenced by CleanupPointerRootUsers().

◆ isValidCandidateForColdCC()

static bool isValidCandidateForColdCC ( Function F,
function_ref< BlockFrequencyInfo &(Function &)>  GetBFI,
const std::vector< Function * > &  AllCallsCold 
)
static

◆ makeAllConstantUsesInstructions()

static void makeAllConstantUsesInstructions ( Constant C)
static

C may have non-instruction users, and allNonInstructionUsersCanBeMadeInstructions has returned true.

Convert the non-instruction users to instructions.

Definition at line 1418 of file GlobalOpt.cpp.

References llvm::append_range(), assert(), llvm::SmallVectorImpl< T >::clear(), llvm::User::replaceUsesOfWith(), and Users.

Referenced by processInternalGlobal().

◆ mayHaveOtherReferences()

static bool mayHaveOtherReferences ( GlobalAlias GA,
const LLVMUsed &  U 
)
static

Definition at line 2210 of file GlobalOpt.cpp.

References llvm::GlobalValue::hasLocalLinkage().

Referenced by hasUsesToReplace(), and OptimizeGlobalAliases().

◆ OptimizeAwayTrappingUsesOfLoads()

static bool OptimizeAwayTrappingUsesOfLoads ( GlobalVariable GV,
Constant LV,
const DataLayout DL,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI 
)
static

The specified global has only one non-null value stored into it.

If there are uses of the loaded value that would trap if the loaded value is dynamically null, then we know that they cannot be reachable with a null optimize away the load.

Definition at line 775 of file GlobalOpt.cpp.

References assert(), CleanupConstantGlobalUsers(), CleanupPointerRootUsers(), llvm::dbgs(), DL, llvm::GlobalVariable::eraseFromParent(), isLeakCheckerRoot(), LLVM_DEBUG, llvm::make_early_inc_range(), OptimizeAwayTrappingUsesOfValue(), llvm::Value::use_empty(), and llvm::Value::users().

Referenced by optimizeOnceStoredGlobal().

◆ OptimizeAwayTrappingUsesOfValue()

static bool OptimizeAwayTrappingUsesOfValue ( Value V,
Constant NewV 
)
static

◆ OptimizeEmptyGlobalCXXDtors()

static bool OptimizeEmptyGlobalCXXDtors ( Function CXAAtExitFn)
static

Itanium C++ ABI p3.3.5:

After constructing a global (or local static) object, that will require destruction on exit, a termination function is registered as follows:

extern "C" int __cxa_atexit ( void (*f)(void *), void *p, void *d );

This registration, e.g. __cxa_atexit(f,p,d), is intended to cause the call f(p) when DSO d is unloaded, before all such termination calls registered before this one. It returns zero if registration is successful, nonzero on failure.

Definition at line 2374 of file GlobalOpt.cpp.

References cxxDtorIsEmpty(), llvm::Instruction::eraseFromParent(), llvm::CallBase::getArgOperand(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::make_early_inc_range(), llvm::Value::replaceAllUsesWith(), llvm::Value::stripPointerCasts(), and llvm::Value::users().

Referenced by optimizeGlobalsInModule().

◆ OptimizeFunctions()

static bool OptimizeFunctions ( Module M,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI,
function_ref< TargetTransformInfo &(Function &)>  GetTTI,
function_ref< BlockFrequencyInfo &(Function &)>  GetBFI,
function_ref< DominatorTree &(Function &)>  LookupDomTree,
SmallPtrSetImpl< const Comdat * > &  NotDiscardableComdats 
)
static

◆ OptimizeGlobalAddressOfAllocation()

static GlobalVariable* OptimizeGlobalAddressOfAllocation ( GlobalVariable GV,
CallInst CI,
uint64_t  AllocSize,
Constant InitVal,
const DataLayout DL,
TargetLibraryInfo TLI 
)
static

This function takes the specified global variable, and transforms the program as if it always contained the result of the specified malloc.

Because it is always the result of the specified malloc, there is no reason to actually DO the malloc. Instead, turn the malloc into a global, and any loads of GV as uses of the new global.

Definition at line 861 of file GlobalOpt.cpp.

References allUsesOfLoadAndStores(), Builder, ConstantPropUsersOf(), llvm::BinaryOperator::CreateNot(), DL, llvm::Instruction::eraseFromParent(), llvm::GlobalVariable::eraseFromParent(), llvm::errs(), llvm::ArrayType::get(), llvm::UndefValue::get(), llvm::ConstantExpr::getBitCast(), llvm::ConstantInt::getBool(), llvm::Value::getContext(), llvm::ConstantInt::getFalse(), llvm::Module::getGlobalList(), llvm::Type::getInt1Ty(), llvm::Type::getInt8Ty(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::Value::getName(), llvm::ilist_node_with_parent< NodeTy, ParentTy, Options >::getNextNode(), llvm::LoadInst::getOrdering(), llvm::GlobalValue::getParent(), llvm::CmpInst::getPredicate(), llvm::LoadInst::getSyncScopeID(), llvm::GlobalValue::getThreadLocalMode(), llvm::ConstantInt::getTrue(), llvm::Value::getType(), llvm::GlobalValue::getType(), llvm::Use::getUser(), llvm::GlobalValue::getValueType(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::insert(), llvm::GlobalValue::InternalLinkage, LLVM_DEBUG, llvm_unreachable, llvm::None, llvm::Value::replaceAllUsesWith(), llvm::User::replaceUsesOfWith(), llvm::Use::set(), SI, llvm::Value::use_begin(), llvm::Value::use_empty(), llvm::Instruction::user_back(), and llvm::Value::user_back().

Referenced by tryToOptimizeStoreOfAllocationToGlobal().

◆ OptimizeGlobalAliases()

static bool OptimizeGlobalAliases ( Module M,
SmallPtrSetImpl< const Comdat * > &  NotDiscardableComdats 
)
static

◆ optimizeGlobalsInModule()

static bool optimizeGlobalsInModule ( Module M,
const DataLayout DL,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI,
function_ref< TargetTransformInfo &(Function &)>  GetTTI,
function_ref< BlockFrequencyInfo &(Function &)>  GetBFI,
function_ref< DominatorTree &(Function &)>  LookupDomTree 
)
static

◆ OptimizeGlobalVars()

static bool OptimizeGlobalVars ( Module M,
function_ref< TargetTransformInfo &(Function &)>  GetTTI,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI,
function_ref< DominatorTree &(Function &)>  LookupDomTree,
SmallPtrSetImpl< const Comdat * > &  NotDiscardableComdats 
)
static

◆ optimizeOnceStoredGlobal()

static bool optimizeOnceStoredGlobal ( GlobalVariable GV,
Value StoredOnceVal,
AtomicOrdering  Ordering,
const DataLayout DL,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI 
)
static

◆ processGlobal()

static bool processGlobal ( GlobalValue GV,
function_ref< TargetTransformInfo &(Function &)>  GetTTI,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI,
function_ref< DominatorTree &(Function &)>  LookupDomTree 
)
static

◆ processInternalGlobal()

static bool processInternalGlobal ( GlobalVariable GV,
const GlobalStatus GS,
function_ref< TargetTransformInfo &(Function &)>  GetTTI,
function_ref< TargetLibraryInfo &(Function &)>  GetTLI,
function_ref< DominatorTree &(Function &)>  LookupDomTree 
)
static

◆ RemoveAttribute()

static void RemoveAttribute ( Function F,
Attribute::AttrKind  A 
)
static

◆ RemovePreallocated()

static void RemovePreallocated ( Function F)
static

◆ setUsedInitializer()

static void setUsedInitializer ( GlobalVariable V,
const SmallPtrSetImpl< GlobalValue * > &  Init 
)
static

◆ SRAGlobal()

static GlobalVariable* SRAGlobal ( GlobalVariable GV,
const DataLayout DL 
)
static

Perform scalar replacement of aggregates on the specified global variable.

This opens the door for other optimizations by exposing the behavior of the program in a more fine-grained way. We have determined that this transformation is safe already. We return the first global variable we insert so that the caller can reprocess it.

Definition at line 454 of file GlobalOpt.cpp.

References llvm::append_range(), assert(), B, llvm::DenseMapBase< DenseMap< KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::begin(), collectSRATypes(), llvm::commonAlignment(), llvm::ConstantFoldLoadFromConst(), llvm::GlobalVariable::copyAttributesFrom(), llvm::dbgs(), DL, llvm::DenseMapBase< DenseMap< KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::empty(), llvm::GlobalVariable::eraseFromParent(), llvm::GlobalValue::getAddressSpace(), llvm::GlobalObject::getAlign(), llvm::GlobalVariable::getInitializer(), llvm::getLoadStorePointerOperand(), llvm::getLoadStoreType(), llvm::Value::getName(), llvm::getOrEnforceKnownAlignment(), llvm::GlobalValue::getParent(), llvm::GlobalValue::getThreadLocalMode(), llvm::GlobalValue::getValueType(), llvm::GlobalValue::hasLocalLinkage(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::GlobalValue::InternalLinkage, llvm::isSafeToDestroyConstant(), LLVM_DEBUG, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::RecursivelyDeleteTriviallyDeadInstructions(), llvm::Constant::removeDeadConstantUsers(), llvm::GlobalObject::setAlignment(), SI, llvm::DenseMapBase< DenseMap< KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::size(), llvm::sort(), transferSRADebugInfo(), and llvm::Value::users().

Referenced by processInternalGlobal().

◆ STATISTIC() [1/16]

STATISTIC ( NumAliasesRemoved  ,
"Number of global aliases eliminated"   
)

◆ STATISTIC() [2/16]

STATISTIC ( NumAliasesResolved  ,
"Number of global aliases resolved"   
)

◆ STATISTIC() [3/16]

STATISTIC ( NumColdCC  ,
"Number of functions marked coldcc"   
)

◆ STATISTIC() [4/16]

STATISTIC ( NumCtorsEvaluated  ,
"Number of static ctors evaluated"   
)

◆ STATISTIC() [5/16]

STATISTIC ( NumCXXDtorsRemoved  ,
"Number of global C++ destructors removed  
)

◆ STATISTIC() [6/16]

STATISTIC ( NumDeleted  ,
"Number of globals deleted"   
)

◆ STATISTIC() [7/16]

STATISTIC ( NumFastCallFns  ,
"Number of functions converted to fastcc"   
)

◆ STATISTIC() [8/16]

STATISTIC ( NumGlobUses  ,
"Number of global uses devirtualized"   
)

◆ STATISTIC() [9/16]

STATISTIC ( NumInternalFunc  ,
"Number of internal functions  
)

◆ STATISTIC() [10/16]

STATISTIC ( NumLocalized  ,
"Number of globals localized"   
)

◆ STATISTIC() [11/16]

STATISTIC ( NumMarked  ,
"Number of globals marked constant  
)

◆ STATISTIC() [12/16]

STATISTIC ( NumNestRemoved  ,
"Number of nest attributes removed  
)

◆ STATISTIC() [13/16]

STATISTIC ( NumShrunkToBool  ,
"Number of global vars shrunk to booleans"   
)

◆ STATISTIC() [14/16]

STATISTIC ( NumSRA  ,
"Number of aggregate globals broken into scalars  
)

◆ STATISTIC() [15/16]

STATISTIC ( NumSubstitute  ,
"Number of globals with initializers stored into them  
)

◆ STATISTIC() [16/16]

STATISTIC ( NumUnnamed  ,
"Number of globals marked unnamed_addr"   
)

◆ StripAttr()

static AttributeList StripAttr ( LLVMContext C,
AttributeList  Attrs,
Attribute::AttrKind  A 
)
static

Definition at line 1671 of file GlobalOpt.cpp.

References Attrs, and llvm::Function::removeAttributeAtIndex().

Referenced by RemoveAttribute().

◆ transferSRADebugInfo()

static void transferSRADebugInfo ( GlobalVariable GV,
GlobalVariable NGV,
uint64_t  FragmentOffsetInBits,
uint64_t  FragmentSizeInBits,
uint64_t  VarSize 
)
static

◆ tryToOptimizeStoreOfAllocationToGlobal()

static bool tryToOptimizeStoreOfAllocationToGlobal ( GlobalVariable GV,
CallInst CI,
AtomicOrdering  Ordering,
const DataLayout DL,
TargetLibraryInfo TLI 
)
static

If we have a global that is only initialized with a fixed size allocation try to transform the program to use global memory instead of heap allocated memory.

This eliminates dynamic allocation, avoids an indirection accessing the data, and exposes the resultant global to further GlobalOpt.

Definition at line 1043 of file GlobalOpt.cpp.

References allUsesOfLoadedValueWillTrapIfNull(), DL, llvm::Function::getContext(), llvm::Instruction::getFunction(), llvm::getInitialValueOfAllocation(), llvm::Type::getInt8Ty(), llvm::getObjectSize(), llvm::isAllocRemovable(), OptimizeGlobalAddressOfAllocation(), and valueIsOnlyUsedLocallyOrStoredToOneGlobal().

Referenced by optimizeOnceStoredGlobal().

◆ TryToShrinkGlobalToBoolean()

static bool TryToShrinkGlobalToBoolean ( GlobalVariable GV,
Constant OtherVal 
)
static

At this point, we have learned that the only two values ever stored into GV are its initializer and OtherVal.

See if we can shrink the global into a boolean and select between the two values whenever it is used. This exposes the values to other scalar optimizations.

Definition at line 1130 of file GlobalOpt.cpp.

References llvm::GlobalVariable::addDebugInfo(), Align, assert(), llvm::GlobalVariable::copyAttributesFrom(), llvm::SelectInst::Create(), llvm::dbgs(), DL, E, llvm::Instruction::eraseFromParent(), llvm::GlobalVariable::eraseFromParent(), llvm::ConstantInt::get(), llvm::MDNode::get(), llvm::PointerType::getAddressSpace(), llvm::Value::getContext(), llvm::Module::getDataLayout(), llvm::GlobalVariable::getDebugInfo(), llvm::Instruction::getDebugLoc(), llvm::ConstantInt::getFalse(), llvm::Module::getGlobalList(), llvm::GlobalVariable::getInitializer(), llvm::Type::getInt1Ty(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::getLoadStoreType(), llvm::Value::getName(), llvm::User::getOperand(), llvm::LoadInst::getOrdering(), llvm::GlobalValue::getParent(), llvm::LoadInst::getSyncScopeID(), llvm::GlobalValue::getThreadLocalMode(), llvm::Value::getType(), llvm::GlobalValue::getType(), llvm::GlobalValue::getValueType(), llvm::GlobalValue::InternalLinkage, llvm::Type::isFloatingPointTy(), llvm::Constant::isNullValue(), llvm::Type::isPointerTy(), llvm::Type::isVectorTy(), LLVM_DEBUG, llvm::DIExpression::prependOpcodes(), llvm::Value::replaceAllUsesWith(), llvm::Instruction::setDebugLoc(), SI, llvm::Value::takeName(), llvm::Value::use_empty(), llvm::Value::user_back(), and llvm::Value::users().

Referenced by processInternalGlobal().

◆ valueIsOnlyUsedLocallyOrStoredToOneGlobal()

static bool valueIsOnlyUsedLocallyOrStoredToOneGlobal ( const CallInst CI,
const GlobalVariable GV 
)
static

Scan the use-list of GV checking to make sure that there are no complex uses of GV.

We permit simple things like dereferencing the pointer, but not storing through the address, unless it is to the specified global.

Definition at line 999 of file GlobalOpt.cpp.

References llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::pop_back_val(), SI, and llvm::Value::uses().

Referenced by tryToOptimizeStoreOfAllocationToGlobal().

Variable Documentation

◆ ColdCCRelFreq

cl::opt<int> ColdCCRelFreq("coldcc-rel-freq", cl::Hidden, cl::init(2), cl::ZeroOrMore, cl::desc( "Maximum block frequency, expressed as a percentage of caller's " "entry frequency, for a call site to be considered cold for enabling" "coldcc"))
static

Referenced by isColdCallSite().

◆ EnableColdCCStressTest

cl::opt<bool> EnableColdCCStressTest("enable-coldcc-stress-test", cl::desc("Enable stress test of coldcc by adding " "calling conv to all internal functions."), cl::init(false), cl::Hidden)
static

Referenced by OptimizeFunctions().

◆ false

Global Variable false

Definition at line 2556 of file GlobalOpt.cpp.

◆ globalopt

globalopt

Definition at line 2555 of file GlobalOpt.cpp.

◆ Optimizer

Global Variable Optimizer

Definition at line 2556 of file GlobalOpt.cpp.