LLVM 18.0.0git
|
#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/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/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 <optional>
#include <utility>
#include <vector>
Go to the source code of this file.
Classes | |
struct | GlobalPart |
Part of the global at a specific offset, which is only accessed through loads and stores with the given type. More... | |
Macros | |
#define | DEBUG_TYPE "globalopt" |
Typedefs | |
using | ChangeableCCCacheTy = SmallDenseMap< Function *, bool, 8 > |
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. | |
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. | |
static bool | CleanupPointerRootUsers (GlobalVariable *GV, function_ref< TargetLibraryInfo &(Function &)> GetTLI) |
This GV is a pointer root. | |
static bool | CleanupConstantGlobalUsers (GlobalVariable *GV, const DataLayout &DL) |
We just marked GV constant. | |
static bool | collectSRATypes (DenseMap< uint64_t, GlobalPart > &Parts, GlobalVariable *GV, const DataLayout &DL) |
Look at all uses of the global and determine which (offset, type) pairs it can be split into. | |
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. | |
static GlobalVariable * | SRAGlobal (GlobalVariable *GV, const DataLayout &DL) |
Perform scalar replacement of aggregates on the specified global variable. | |
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. | |
static bool | allUsesOfLoadedValueWillTrapIfNull (const GlobalVariable *GV) |
Return true if all uses of any loads from GV will trap if the loaded value is null. | |
static void | allUsesOfLoadAndStores (GlobalVariable *GV, SmallVector< Value *, 4 > &Uses) |
Get all the loads/store uses for global variable GV . | |
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. | |
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. | |
static GlobalVariable * | OptimizeGlobalAddressOfAllocation (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. | |
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. | |
static bool | tryToOptimizeStoreOfAllocationToGlobal (GlobalVariable *GV, CallInst *CI, 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. | |
static bool | optimizeOnceStoredGlobal (GlobalVariable *GV, Value *StoredOnceVal, 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. | |
static bool | deleteIfDead (GlobalValue &GV, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats, function_ref< void(Function &)> DeleteFnCallback=nullptr) |
static bool | isPointerValueDeadOnEntryToFunction (const Function *F, GlobalValue *GV, function_ref< DominatorTree &(Function &)> LookupDomTree) |
static bool | forwardStoredOnceStore (GlobalVariable *GV, const StoreInst *StoredOnceStore, function_ref< DominatorTree &(Function &)> LookupDomTree) |
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. | |
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. | |
static void | ChangeCalleesToFastCall (Function *F) |
Walk all of the direct calls of the specified function, changing them to FastCC. | |
static AttributeList | StripAttr (LLVMContext &C, AttributeList Attrs, Attribute::AttrKind A) |
static void | RemoveAttribute (Function *F, Attribute::AttrKind A) |
static bool | hasChangeableCCImpl (Function *F) |
Return true if this is a calling convention that we'd like to change. | |
static bool | hasChangeableCC (Function *F, ChangeableCCCacheTy &ChangeableCCCache) |
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. | |
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, ChangeableCCCacheTy &ChangeableCCCache) |
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, function_ref< void(Function &F)> ChangedCFGCallback, function_ref< void(Function &F)> DeleteFnCallback) |
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. | |
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 | mayHaveOtherReferences (GlobalValue &GV, const LLVMUsed &U) |
static bool | hasUsesToReplace (GlobalAlias &GA, const LLVMUsed &U, bool &RenameTarget) |
static bool | OptimizeGlobalAliases (Module &M, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats) |
static Function * | FindCXAAtExit (Module &M, function_ref< TargetLibraryInfo &(Function &)> GetTLI) |
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 static ret bool | cxxDtorIsEmpty (const Function &Fn) |
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, function_ref< void(Function &F)> ChangedCFGCallback, function_ref< void(Function &F)> DeleteFnCallback) |
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< int > | ColdCCRelFreq ("coldcc-rel-freq", cl::Hidden, cl::init(2), 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")) |
#define DEBUG_TYPE "globalopt" |
Definition at line 74 of file GlobalOpt.cpp.
using ChangeableCCCacheTy = SmallDenseMap<Function *, bool, 8> |
Definition at line 1714 of file GlobalOpt.cpp.
|
static |
Get all the loads/store uses for global variable GV
.
Definition at line 726 of file GlobalOpt.cpp.
References assert(), llvm::SmallVectorBase< Size_T >::empty(), P, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and Uses.
Referenced by OptimizeGlobalAddressOfAllocation().
|
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 696 of file GlobalOpt.cpp.
References AllUsesOfValueWillTrapIfNull(), llvm::SmallVectorBase< Size_T >::empty(), P, llvm::SmallVectorImpl< T >::pop_back_val(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by tryToOptimizeStoreOfAllocationToGlobal().
|
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 642 of file GlobalOpt.cpp.
References AllUsesOfValueWillTrapIfNull(), assert(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), and llvm::NullPointerIsDefined().
Referenced by allUsesOfLoadedValueWillTrapIfNull(), and AllUsesOfValueWillTrapIfNull().
|
static |
Walk all of the direct calls of the specified function, changing them to FastCC.
Definition at line 1652 of file GlobalOpt.cpp.
References F, and llvm::CallingConv::Fast.
Referenced by OptimizeFunctions().
|
static |
Definition at line 1761 of file GlobalOpt.cpp.
References llvm::CallingConv::Cold, and F.
Referenced by OptimizeFunctions().
|
static |
We just marked GV constant.
Loop over all users of the global, cleaning up the obvious ones. This is largely just a quick scan over the use list to clean up the easy and obvious cruft. This returns true if it made a change.
Definition at line 267 of file GlobalOpt.cpp.
References llvm::append_range(), llvm::ConstantFoldLoadFromConst(), llvm::ConstantFoldLoadFromUniformValue(), DL, llvm::SmallVectorBase< Size_T >::empty(), GEP, llvm::GlobalVariable::getInitializer(), llvm::Value::getType(), llvm::getUnderlyingObject(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), MI, llvm::Offset, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::RecursivelyDeleteTriviallyDeadInstructionsPermissive(), llvm::Constant::removeDeadConstantUsers(), llvm::Value::replaceAllUsesWith(), llvm::Value::stripAndAccumulateConstantOffsets(), and llvm::Value::users().
Referenced by OptimizeAwayTrappingUsesOfLoads(), and processInternalGlobal().
|
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 189 of file GlobalOpt.cpp.
References llvm::append_range(), llvm::SmallVectorBase< Size_T >::empty(), I, llvm::isAllocationFn(), llvm::GlobalVariable::isConstant(), IsSafeComputationToRemove(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::Constant::removeDeadConstantUsers(), and llvm::Value::users().
Referenced by OptimizeAwayTrappingUsesOfLoads(), and processInternalGlobal().
|
static |
Look at all uses of the global and determine which (offset, type) pairs it can be split into.
Definition at line 339 of file GlobalOpt.cpp.
References llvm::CallingConv::C, llvm::ConstantFoldLoadFromConst(), llvm::dbgs(), DL, llvm::SmallVectorBase< Size_T >::empty(), GEP, llvm::GlobalVariable::getInitializer(), llvm::getLoadStorePointerOperand(), llvm::getLoadStoreType(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isSafeToDestroyConstant(), llvm::Type::isScalableTy(), LLVM_DEBUG, llvm::Offset, llvm::SmallVectorImpl< T >::pop_back_val(), Ptr, llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::try_emplace().
Referenced by SRAGlobal().
Definition at line 2088 of file GlobalOpt.cpp.
References llvm::StringRef::compare(), llvm::Value::getName(), and llvm::Value::stripPointerCasts().
Referenced by setUsedInitializer().
|
static |
Walk the use list of V, constant folding all of the instructions that are foldable.
Definition at line 880 of file GlobalOpt.cpp.
References llvm::ConstantFoldInstruction(), DL, E, I, and llvm::isInstructionTriviallyDead().
Referenced by OptimizeGlobalAddressOfAllocation().
|
static |
Definition at line 2349 of file GlobalOpt.cpp.
References llvm::Function::getEntryBlock(), I, and llvm::GlobalValue::isDeclaration().
Referenced by OptimizeEmptyGlobalCXXDtors().
|
static |
Definition at line 1304 of file GlobalOpt.cpp.
References llvm::CallingConv::C, llvm::SmallPtrSetImpl< PtrType >::count(), llvm::dbgs(), llvm::GlobalValue::eraseFromParent(), F, llvm::GlobalValue::getComdat(), llvm::GlobalValue::hasLocalLinkage(), llvm::GlobalValue::isDeclaration(), llvm::GlobalValue::isDiscardableIfUnused(), LLVM_DEBUG, llvm::Constant::removeDeadConstantUsers(), and llvm::Value::use_empty().
Referenced by OptimizeFunctions(), OptimizeGlobalAliases(), and OptimizeGlobalVars().
|
static |
Evaluate static constructors in the function, if we can.
Return true if we can, false otherwise.
Definition at line 2060 of file GlobalOpt.cpp.
References llvm::dbgs(), DL, llvm::Evaluator::EvaluateFunction(), F, llvm::Evaluator::getInvariants(), llvm::Evaluator::getMutatedInitializers(), and LLVM_DEBUG.
Referenced by optimizeGlobalsInModule().
|
static |
Definition at line 2320 of file GlobalOpt.cpp.
References F.
Referenced by optimizeGlobalsInModule().
|
static |
Definition at line 1403 of file GlobalOpt.cpp.
References llvm::SmallVectorBase< Size_T >::empty(), F, llvm::Instruction::getFunction(), llvm::Value::getType(), llvm::StoreInst::getValueOperand(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::Value::users().
Referenced by processInternalGlobal().
|
static |
Definition at line 1715 of file GlobalOpt.cpp.
References F, hasChangeableCCImpl(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::try_emplace().
Referenced by hasOnlyColdCalls(), and OptimizeFunctions().
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 1682 of file GlobalOpt.cpp.
References llvm::CallingConv::C, CC, F, llvm::CallInst::isMustTailCall(), and llvm::CallingConv::X86_ThisCall.
Referenced by hasChangeableCC().
Definition at line 1805 of file GlobalOpt.cpp.
References assert(), F, and llvm::CallBase::isMustTailCall().
Referenced by OptimizeFunctions().
|
static |
Definition at line 1773 of file GlobalOpt.cpp.
References F, llvm::Function::getIntrinsicID(), hasChangeableCC(), llvm::GlobalValue::hasLocalLinkage(), I, isColdCallSite(), and llvm::Intrinsic::not_intrinsic.
Referenced by OptimizeFunctions().
|
static |
Definition at line 2190 of file GlobalOpt.cpp.
References assert(), llvm::Value::hasOneUse(), and llvm::Value::use_empty().
Referenced by hasUsesToReplace().
|
static |
Definition at line 2213 of file GlobalOpt.cpp.
References llvm::GlobalAlias::getAliasee(), hasUseOtherThanLLVMUsed(), mayHaveOtherReferences(), and llvm::Constant::stripPointerCasts().
Referenced by OptimizeGlobalAliases().
|
static |
Return true if the block containing the call site has a BlockFrequency of less than ColdCCRelFreq% of the entry block.
Definition at line 1725 of file GlobalOpt.cpp.
References ColdCCRelFreq, llvm::BlockFrequencyInfo::getBlockFreq(), llvm::CallBase::getCaller(), llvm::Function::getEntryBlock(), and llvm::Instruction::getParent().
Referenced by hasOnlyColdCalls(), and isValidCandidateForColdCC().
|
static |
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.
Definition at line 108 of file GlobalOpt.cpp.
References llvm::Type::ArrayTyID, llvm::StructType::elements(), llvm::Type::FixedVectorTyID, llvm::Type::getTypeID(), llvm::GlobalValue::getValueType(), llvm::GlobalValue::hasPrivateLinkage(), llvm::StructType::isOpaque(), llvm::Type::PointerTyID, llvm::Type::ScalableVectorTyID, and llvm::Type::StructTyID.
Referenced by OptimizeAwayTrappingUsesOfLoads(), and processInternalGlobal().
|
static |
Definition at line 1334 of file GlobalOpt.cpp.
References assert(), DL, F, llvm::Module::getDataLayout(), llvm::GlobalValue::getParent(), getType(), llvm::StoreInst::getValueOperand(), I, llvm::none_of(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorBase< Size_T >::size(), and llvm::Value::users().
Referenced by processInternalGlobal().
|
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 158 of file GlobalOpt.cpp.
References GEP, I, and llvm::isAllocationFn().
Referenced by CleanupPointerRootUsers().
|
static |
Definition at line 1739 of file GlobalOpt.cpp.
References F, llvm::BasicBlock::getParent(), llvm::Instruction::getParent(), llvm::is_contained(), and isColdCallSite().
Referenced by OptimizeFunctions().
|
static |
Definition at line 2206 of file GlobalOpt.cpp.
References llvm::GlobalValue::hasLocalLinkage().
Referenced by hasUsesToReplace(), and OptimizeGlobalAliases().
|
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 815 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().
Definition at line 745 of file GlobalOpt.cpp.
References llvm::CallBase::arg_size(), llvm::CallingConv::C, E, llvm::ConstantExpr::getAddrSpaceCast(), llvm::CallBase::getArgOperand(), llvm::CallBase::getCalledOperand(), llvm::ConstantExpr::getGetElementPtr(), llvm::Value::getType(), I, llvm::NullPointerIsDefined(), OptimizeAwayTrappingUsesOfValue(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorImpl< T >::reserve(), llvm::CallBase::setArgOperand(), llvm::CallBase::setCalledOperand(), and llvm::SmallVectorBase< Size_T >::size().
Referenced by OptimizeAwayTrappingUsesOfLoads(), and OptimizeAwayTrappingUsesOfValue().
Definition at line 2365 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().
|
static |
Definition at line 1908 of file GlobalOpt.cpp.
References ChangeCalleesToFastCall(), changeCallSitesToColdCC(), llvm::CallingConv::Cold, deleteIfDead(), EnableColdCCStressTest, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::erase(), F, llvm::CallingConv::Fast, hasChangeableCC(), hasInvokeCallers(), hasMustTailCallers(), hasOnlyColdCalls(), llvm::GlobalValue::InternalLinkage, isValidCandidateForColdCC(), llvm::make_early_inc_range(), processGlobal(), RemoveAttribute(), RemovePreallocated(), llvm::removeUnreachableBlocks(), and llvm::TargetTransformInfo::useColdCCForColdCall().
Referenced by optimizeGlobalsInModule().
|
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 902 of file GlobalOpt.cpp.
References allUsesOfLoadAndStores(), ConstantPropUsersOf(), llvm::IRBuilderBase::CreateMemSet(), llvm::BinaryOperator::CreateNot(), DL, llvm::GlobalVariable::eraseFromParent(), llvm::Instruction::eraseFromParent(), llvm::errs(), llvm::UndefValue::get(), llvm::ConstantInt::getBool(), llvm::Value::getContext(), llvm::ConstantInt::getFalse(), 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::Use::getUser(), llvm::GlobalValue::getValueType(), llvm::Module::insertGlobalVariable(), llvm::GlobalValue::InternalLinkage, LLVM_DEBUG, llvm_unreachable, llvm::Value::replaceAllUsesWith(), llvm::Use::set(), llvm::Value::use_begin(), llvm::Value::use_empty(), and llvm::Value::user_back().
Referenced by tryToOptimizeStoreOfAllocationToGlobal().
|
static |
Definition at line 2241 of file GlobalOpt.cpp.
References deleteIfDead(), llvm::GlobalValue::getLinkage(), hasUsesToReplace(), llvm::GlobalValue::InternalLinkage, llvm::GlobalValue::isDSOLocal(), llvm::GlobalValue::isImplicitDSOLocal(), llvm::GlobalValue::isInterposableLinkage(), llvm::make_early_inc_range(), mayHaveOtherReferences(), and llvm::Constant::stripPointerCasts().
Referenced by optimizeGlobalsInModule().
|
static |
Definition at line 2408 of file GlobalOpt.cpp.
References llvm::CallingConv::C, llvm::SmallPtrSetImplBase::clear(), DL, EvaluateStaticConstructor(), F, FindCXAAtExit(), llvm::GlobalValue::getComdat(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::GlobalValue::isDiscardableIfUnused(), OptimizeEmptyGlobalCXXDtors(), OptimizeFunctions(), OptimizeGlobalAliases(), llvm::optimizeGlobalCtorsList(), OptimizeGlobalVars(), and llvm::Value::use_empty().
Referenced by llvm::GlobalOptPass::run().
|
static |
Definition at line 2025 of file GlobalOpt.cpp.
References llvm::CallingConv::C, llvm::ConstantFoldConstant(), deleteIfDead(), DL, llvm::GlobalValue::hasLocalLinkage(), llvm::Value::hasName(), llvm::GlobalValue::InternalLinkage, llvm::GlobalValue::isDeclaration(), llvm::make_early_inc_range(), processGlobal(), and llvm::GlobalValue::setLinkage().
Referenced by optimizeGlobalsInModule().
|
static |
Definition at line 1110 of file GlobalOpt.cpp.
References DL, llvm::GlobalVariable::getInitializer(), llvm::Type::getPointerAddressSpace(), llvm::Value::getType(), llvm::isAllocationFn(), llvm::Constant::isNullValue(), llvm::Type::isPointerTy(), llvm::NullPointerIsDefined(), OptimizeAwayTrappingUsesOfLoads(), llvm::Value::stripPointerCasts(), and tryToOptimizeStoreOfAllocationToGlobal().
Referenced by processInternalGlobal().
|
static |
Analyze the specified global variable and optimize it if possible.
If we make a change, return true.
Definition at line 1612 of file GlobalOpt.cpp.
References llvm::GlobalStatus::analyzeGlobal(), llvm::Value::getName(), llvm::GlobalValue::getUnnamedAddr(), llvm::GlobalValue::hasGlobalUnnamedAddr(), llvm::GlobalValue::hasLocalLinkage(), processInternalGlobal(), llvm::GlobalValue::setUnnamedAddr(), and llvm::StringRef::starts_with().
Referenced by OptimizeFunctions(), and OptimizeGlobalVars().
|
static |
Analyze the specified global variable and optimize it if possible.
If we make a change, return true.
Definition at line 1439 of file GlobalOpt.cpp.
References assert(), CleanupConstantGlobalUsers(), CleanupPointerRootUsers(), llvm::dbgs(), DL, llvm::GlobalVariable::eraseFromParent(), forwardStoredOnceStore(), llvm::PointerType::getAddressSpace(), llvm::GlobalValue::getAddressSpace(), llvm::Module::getDataLayout(), llvm::GlobalVariable::getInitializer(), llvm::GlobalValue::getLinkage(), llvm::Value::getName(), llvm::GlobalValue::getParent(), llvm::GlobalValue::getThreadLocalMode(), llvm::GlobalValue::getType(), llvm::Value::getType(), llvm::GlobalValue::getValueType(), llvm::GlobalStatus::InitializerStored, llvm::GlobalVariable::isConstant(), llvm::GlobalVariable::isExternallyInitialized(), isLeakCheckerRoot(), isPointerValueDeadOnEntryToFunction(), llvm::Type::isSingleValueType(), LLVM_DEBUG, optimizeOnceStoredGlobal(), llvm::Value::replaceAllUsesWith(), llvm::GlobalVariable::setConstant(), llvm::GlobalVariable::setInitializer(), SRAGlobal(), llvm::GlobalStatus::StoredOnce, TryToShrinkGlobalToBoolean(), and llvm::Value::use_empty().
Referenced by processGlobal().
|
static |
Definition at line 1668 of file GlobalOpt.cpp.
References A, F, llvm::CallBase::getAttributes(), llvm::CallBase::setAttributes(), and StripAttr().
Referenced by OptimizeFunctions(), and RemovePreallocated().
|
static |
Definition at line 1826 of file GlobalOpt.cpp.
References assert(), llvm::SmallVectorTemplateCommon< T, typename >::begin(), llvm::CallBase::Create(), llvm::IRBuilderBase::CreateAlloca(), llvm::IRBuilderBase::CreateStackRestore(), llvm::IRBuilderBase::CreateStackSave(), llvm::SmallVectorTemplateCommon< T, typename >::end(), llvm::SmallVectorImpl< T >::erase(), llvm::Instruction::eraseFromParent(), F, llvm::CallBase::getArgOperand(), llvm::Instruction::getNextNonDebugInstruction(), llvm::CallBase::getOperandBundlesAsDefs(), llvm::CallBase::isMustTailCall(), RemoveAttribute(), llvm::Value::replaceAllUsesWith(), llvm::IRBuilderBase::SetInsertPoint(), llvm::Value::takeName(), and llvm::Value::users().
Referenced by OptimizeFunctions().
|
static |
Definition at line 2094 of file GlobalOpt.cpp.
References llvm::GlobalValue::AppendingLinkage, llvm::array_pod_sort(), llvm::SmallVectorTemplateCommon< T, typename >::begin(), compareNames(), llvm::SmallVectorTemplateCommon< T, typename >::end(), llvm::ConstantArray::get(), llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::SmallVectorBase< Size_T >::size().
|
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 508 of file GlobalOpt.cpp.
References _, assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::begin(), collectSRATypes(), llvm::commonAlignment(), llvm::GlobalVariable::copyAttributesFrom(), llvm::count_if(), llvm::dbgs(), DL, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::empty(), llvm::SmallVectorBase< Size_T >::empty(), llvm::GlobalVariable::eraseFromParent(), llvm::GlobalValue::getAddressSpace(), llvm::GlobalObject::getAlign(), llvm::getLoadStorePointerOperand(), llvm::getLoadStoreType(), llvm::Value::getName(), llvm::getOrEnforceKnownAlignment(), llvm::GlobalValue::getParent(), llvm::GlobalValue::getThreadLocalMode(), llvm::GlobalValue::getValueType(), llvm::GlobalValue::hasLocalLinkage(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isSafeToDestroyConstant(), LLVM_DEBUG, llvm::Offset, llvm::SmallVectorImpl< T >::pop_back_val(), Ptr, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::RecursivelyDeleteTriviallyDeadInstructions(), llvm::Constant::removeDeadConstantUsers(), llvm::GlobalObject::setAlignment(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::size(), llvm::sort(), and transferSRADebugInfo().
Referenced by processInternalGlobal().
STATISTIC | ( | NumAliasesRemoved | , |
"Number of global aliases eliminated" | |||
) |
STATISTIC | ( | NumAliasesResolved | , |
"Number of global aliases resolved" | |||
) |
STATISTIC | ( | NumColdCC | , |
"Number of functions marked coldcc" | |||
) |
STATISTIC | ( | NumCtorsEvaluated | , |
"Number of static ctors evaluated" | |||
) |
STATISTIC | ( | NumCXXDtorsRemoved | , |
"Number of global C++ destructors removed" | |||
) |
STATISTIC | ( | NumDeleted | , |
"Number of globals deleted" | |||
) |
STATISTIC | ( | NumFastCallFns | , |
"Number of functions converted to fastcc" | |||
) |
STATISTIC | ( | NumGlobUses | , |
"Number of global uses devirtualized" | |||
) |
STATISTIC | ( | NumInternalFunc | , |
"Number of internal functions" | |||
) |
STATISTIC | ( | NumLocalized | , |
"Number of globals localized" | |||
) |
STATISTIC | ( | NumMarked | , |
"Number of globals marked constant" | |||
) |
STATISTIC | ( | NumNestRemoved | , |
"Number of nest attributes removed" | |||
) |
STATISTIC | ( | NumShrunkToBool | , |
"Number of global vars shrunk to booleans" | |||
) |
STATISTIC | ( | NumSRA | , |
"Number of aggregate globals broken into scalars" | |||
) |
STATISTIC | ( | NumSubstitute | , |
"Number of globals with initializers stored into them" | |||
) |
STATISTIC | ( | NumUnnamed | , |
"Number of globals marked unnamed_addr" | |||
) |
|
static |
Definition at line 1660 of file GlobalOpt.cpp.
References A, and llvm::CallingConv::C.
Referenced by RemoveAttribute().
|
static |
Copy over the debug info for a variable to its SRA replacements.
Definition at line 428 of file GlobalOpt.cpp.
References llvm::GlobalVariable::addDebugInfo(), llvm::DIExpression::createFragmentExpression(), E, llvm::DIExpression::extractIfOffset(), llvm::MDNode::getContext(), llvm::GlobalVariable::getDebugInfo(), llvm::DIType::getSizeInBits(), and llvm::DIVariable::getType().
Referenced by SRAGlobal().
|
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 1063 of file GlobalOpt.cpp.
References allUsesOfLoadedValueWillTrapIfNull(), DL, llvm::Function::getContext(), llvm::Instruction::getFunction(), llvm::getInitialValueOfAllocation(), llvm::Type::getInt8Ty(), llvm::getObjectSize(), llvm::isRemovableAlloc(), OptimizeGlobalAddressOfAllocation(), and valueIsOnlyUsedLocallyOrStoredToOneGlobal().
Referenced by optimizeOnceStoredGlobal().
|
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 1146 of file GlobalOpt.cpp.
References llvm::GlobalVariable::addDebugInfo(), assert(), llvm::GlobalVariable::copyAttributesFrom(), llvm::SelectInst::Create(), llvm::dbgs(), DL, E, llvm::GlobalVariable::eraseFromParent(), llvm::Instruction::eraseFromParent(), llvm::ConstantInt::get(), llvm::PointerType::getAddressSpace(), llvm::Value::getContext(), llvm::Module::getDataLayout(), llvm::GlobalVariable::getDebugInfo(), llvm::Instruction::getDebugLoc(), llvm::ConstantInt::getFalse(), 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::GlobalValue::getType(), llvm::Value::getType(), llvm::GlobalValue::getValueType(), llvm::Module::insertGlobalVariable(), 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(), llvm::Value::takeName(), llvm::Value::use_empty(), llvm::Value::user_back(), and llvm::Value::users().
Referenced by processInternalGlobal().
|
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 1019 of file GlobalOpt.cpp.
References llvm::SmallVectorBase< Size_T >::empty(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::pop_back_val(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by tryToOptimizeStoreOfAllocationToGlobal().
|
static |
Referenced by isColdCallSite().
|
static |
Referenced by OptimizeFunctions().