LLVM  6.0.0svn
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/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/Pass.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.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 <algorithm>
Include dependency graph for GlobalOpt.cpp:

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 (NumHeapSRA, "Number of heap objects SRA'd")
 
 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")
 
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, const TargetLibraryInfo *TLI)
 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, const TargetLibraryInfo *TLI)
 This GV is a pointer root. More...
 
static bool CleanupConstantGlobalUsers (Value *V, Constant *Init, const DataLayout &DL, TargetLibraryInfo *TLI)
 We just marked GV constant. More...
 
static bool isSafeSROAElementUse (Value *V)
 Return true if the specified instruction is a safe user of a derived expression from a global that we want to SROA. More...
 
static bool IsUserOfGlobalSafeForSRA (User *U, GlobalValue *GV)
 U is a direct user of the specified global value. More...
 
static bool GlobalUsersSafeToSRA (GlobalValue *GV)
 Look at all uses of the global and decide whether it is safe for us to perform this transformation. 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 bool OptimizeAwayTrappingUsesOfValue (Value *V, Constant *NewV)
 
static bool OptimizeAwayTrappingUsesOfLoads (GlobalVariable *GV, Constant *LV, const DataLayout &DL, TargetLibraryInfo *TLI)
 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 GlobalVariableOptimizeGlobalAddressOfMalloc (GlobalVariable *GV, CallInst *CI, Type *AllocTy, ConstantInt *NElements, 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 Instruction *V, const GlobalVariable *GV, SmallPtrSetImpl< const PHINode *> &PHIs)
 Scan the use-list of V checking to make sure that there are no complex uses of V. More...
 
static void ReplaceUsesOfMallocWithGlobal (Instruction *Alloc, GlobalVariable *GV)
 The Alloc pointer is stored into GV somewhere. More...
 
static bool LoadUsesSimpleEnoughForHeapSRA (const Value *V, SmallPtrSetImpl< const PHINode *> &LoadUsingPHIs, SmallPtrSetImpl< const PHINode *> &LoadUsingPHIsPerLoad)
 Verify that all uses of V (a load, or a phi of a load) are simple enough to perform heap SRA on. More...
 
static bool AllGlobalLoadUsesSimpleEnoughForHeapSRA (const GlobalVariable *GV, Instruction *StoredVal)
 If all users of values loaded from GV are simple enough to perform HeapSRA, return true. More...
 
static ValueGetHeapSROAValue (Value *V, unsigned FieldNo, DenseMap< Value *, std::vector< Value *> > &InsertedScalarizedValues, std::vector< std::pair< PHINode *, unsigned > > &PHIsToRewrite)
 
static void RewriteHeapSROALoadUser (Instruction *LoadUser, DenseMap< Value *, std::vector< Value *> > &InsertedScalarizedValues, std::vector< std::pair< PHINode *, unsigned > > &PHIsToRewrite)
 Given a load instruction and a value derived from the load, rewrite the derived value to use the HeapSRoA'd load. More...
 
static void RewriteUsesOfLoadForHeapSRoA (LoadInst *Load, DenseMap< Value *, std::vector< Value *> > &InsertedScalarizedValues, std::vector< std::pair< PHINode *, unsigned > > &PHIsToRewrite)
 We are performing Heap SRoA on a global. More...
 
static GlobalVariablePerformHeapAllocSRoA (GlobalVariable *GV, CallInst *CI, Value *NElems, const DataLayout &DL, const TargetLibraryInfo *TLI)
 CI is an allocation of an array of structures. More...
 
static bool tryToOptimizeStoreOfMallocToGlobal (GlobalVariable *GV, CallInst *CI, Type *AllocTy, AtomicOrdering Ordering, const DataLayout &DL, TargetLibraryInfo *TLI)
 This function is called when we see a pointer global variable with a single value stored it that is a malloc or cast of malloc. More...
 
static bool optimizeOnceStoredGlobal (GlobalVariable *GV, Value *StoredOnceVal, AtomicOrdering Ordering, const DataLayout &DL, TargetLibraryInfo *TLI)
 
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, SmallSet< const Comdat *, 8 > &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, TargetLibraryInfo *TLI, function_ref< DominatorTree &(Function &)> LookupDomTree)
 Analyze the specified global variable and optimize it if possible. More...
 
static bool processGlobal (GlobalValue &GV, TargetLibraryInfo *TLI, 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 StripNest (LLVMContext &C, AttributeList Attrs)
 
static void RemoveNestAttribute (Function *F)
 
static bool isProfitableToMakeFastCC (Function *F)
 Return true if this is a calling convention that we'd like to change. More...
 
static bool OptimizeFunctions (Module &M, TargetLibraryInfo *TLI, function_ref< DominatorTree &(Function &)> LookupDomTree, SmallSet< const Comdat *, 8 > &NotDiscardableComdats)
 
static bool OptimizeGlobalVars (Module &M, TargetLibraryInfo *TLI, function_ref< DominatorTree &(Function &)> LookupDomTree, SmallSet< const Comdat *, 8 > &NotDiscardableComdats)
 
static ConstantEvaluateStoreInto (Constant *Init, Constant *Val, ConstantExpr *Addr, unsigned OpNo)
 Evaluate a piece of a constantexpr store into a global initializer. More...
 
static void CommitValueTo (Constant *Val, Constant *Addr)
 We have decided that Addr (which satisfies the predicate isSimpleEnoughPointerToCommit) should get Val as its value. More...
 
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 SmallPtrSet< GlobalValue *, 8 > &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, SmallSet< const Comdat *, 8 > &NotDiscardableComdats)
 
static FunctionFindCXAAtExit (Module &M, TargetLibraryInfo *TLI)
 
static bool cxxDtorIsEmpty (const Function &Fn, SmallPtrSet< const Function *, 8 > &CalledFunctions)
 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, TargetLibraryInfo *TLI, function_ref< DominatorTree &(Function &)> LookupDomTree)
 
 INITIALIZE_PASS_BEGIN (GlobalOptLegacyPass, "globalopt", "Global Variable Optimizer", false, false) INITIALIZE_PASS_END(GlobalOptLegacyPass
 

Variables

 globalopt
 
Global Variable Optimizer
 
Global Variable false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "globalopt"

Definition at line 51 of file GlobalOpt.cpp.

Function Documentation

◆ AllGlobalLoadUsesSimpleEnoughForHeapSRA()

static bool AllGlobalLoadUsesSimpleEnoughForHeapSRA ( const GlobalVariable GV,
Instruction StoredVal 
)
static

If all users of values loaded from GV are simple enough to perform HeapSRA, return true.

Definition at line 1051 of file GlobalOpt.cpp.

References llvm::SmallPtrSetImplBase::clear(), LoadUsesSimpleEnoughForHeapSRA(), op, and llvm::Value::users().

Referenced by tryToOptimizeStoreOfMallocToGlobal().

◆ 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 1745 of file GlobalOpt.cpp.

References llvm::Value::users().

Referenced by processInternalGlobal().

◆ 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 614 of file GlobalOpt.cpp.

References AllUsesOfValueWillTrapIfNull(), and llvm::Value::users().

Referenced by tryToOptimizeStoreOfMallocToGlobal().

◆ 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 571 of file GlobalOpt.cpp.

References llvm::SmallPtrSetImpl< PtrType >::insert(), 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 1975 of file GlobalOpt.cpp.

References llvm::CallingConv::Fast, llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::setCallingConv(), and llvm::Value::users().

Referenced by OptimizeFunctions().

◆ CleanupConstantGlobalUsers()

static bool CleanupConstantGlobalUsers ( Value V,
Constant Init,
const DataLayout DL,
TargetLibraryInfo TLI 
)
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 234 of file GlobalOpt.cpp.

References C, llvm::ConstantFoldInstruction(), llvm::ConstantFoldLoadThroughGEPConstantExpr(), GEP, llvm::Constant::getNullValue(), llvm::ConstantExpr::getOpcode(), llvm::isSafeToDestroyConstant(), MI, llvm::Value::replaceAllUsesWith(), SI, llvm::Value::user_begin(), and llvm::Value::user_end().

Referenced by OptimizeAwayTrappingUsesOfLoads(), and processInternalGlobal().

◆ CleanupPointerRootUsers()

static bool CleanupPointerRootUsers ( GlobalVariable GV,
const TargetLibraryInfo TLI 
)
static

◆ CommitValueTo()

static void CommitValueTo ( Constant Val,
Constant Addr 
)
static

We have decided that Addr (which satisfies the predicate isSimpleEnoughPointerToCommit) should get Val as its value.

Make it happen.

Definition at line 2151 of file GlobalOpt.cpp.

References assert(), EvaluateStoreInto(), and llvm::User::getOperand().

Referenced by EvaluateStaticConstructor().

◆ 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 761 of file GlobalOpt.cpp.

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

Referenced by OptimizeGlobalAddressOfMalloc().

◆ cxxDtorIsEmpty()

static bool cxxDtorIsEmpty ( const Function Fn,
SmallPtrSet< const Function *, 8 > &  CalledFunctions 
)
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 only look for a function with a single basic block, where the only allowed instructions are 'ret', 'call' to an empty C++ dtor and other side-effect free instructions.

Definition at line 2428 of file GlobalOpt.cpp.

References llvm::BasicBlock::begin(), llvm::Function::begin(), E, llvm::BasicBlock::end(), llvm::Function::end(), llvm::Function::getEntryBlock(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), and llvm::GlobalValue::isDeclaration().

Referenced by OptimizeEmptyGlobalCXXDtors().

◆ deleteIfDead()

static bool deleteIfDead ( GlobalValue GV,
SmallSet< const Comdat *, 8 > &  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 2165 of file GlobalOpt.cpp.

References CommitValueTo(), llvm::dbgs(), DEBUG, llvm::Evaluator::EvaluateFunction(), llvm::Evaluator::getInvariants(), llvm::Evaluator::getMutatedMemory(), llvm::Value::getName(), and I.

Referenced by optimizeGlobalsInModule().

◆ EvaluateStoreInto()

static Constant* EvaluateStoreInto ( Constant Init,
Constant Val,
ConstantExpr Addr,
unsigned  OpNo 
)
static

Evaluate a piece of a constantexpr store into a global initializer.

This returns 'Init' modified to reflect 'Val' stored into it. At this point, the GEP operands of Addr [0, OpNo) have been stepped into.

Definition at line 2108 of file GlobalOpt.cpp.

References assert(), llvm::ConstantArray::get(), llvm::ConstantStruct::get(), llvm::ConstantVector::get(), llvm::Constant::getAggregateElement(), llvm::SequentialType::getNumElements(), llvm::User::getNumOperands(), llvm::User::getOperand(), llvm::Value::getType(), llvm::ConstantInt::getZExtValue(), llvm::Type::isArrayTy(), and llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back().

Referenced by CommitValueTo().

◆ FindCXAAtExit()

static Function* FindCXAAtExit ( Module M,
TargetLibraryInfo TLI 
)
static

◆ GetHeapSROAValue()

static Value* GetHeapSROAValue ( Value V,
unsigned  FieldNo,
DenseMap< Value *, std::vector< Value *> > &  InsertedScalarizedValues,
std::vector< std::pair< PHINode *, unsigned > > &  PHIsToRewrite 
)
static

◆ GlobalUsersSafeToSRA()

static bool GlobalUsersSafeToSRA ( GlobalValue GV)
static

Look at all uses of the global and decide whether it is safe for us to perform this transformation.

Definition at line 414 of file GlobalOpt.cpp.

References IsUserOfGlobalSafeForSRA(), and llvm::Value::users().

Referenced by SRAGlobal().

◆ hasMoreThanOneUseOtherThanLLVMUsed()

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

Definition at line 2286 of file GlobalOpt.cpp.

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

Referenced by hasUsesToReplace().

◆ hasUseOtherThanLLVMUsed()

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

Definition at line 2270 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   
)

◆ isLeakCheckerRoot()

static bool isLeakCheckerRoot ( GlobalVariable GV)
static

◆ isPointerValueDeadOnEntryToFunction()

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

◆ isProfitableToMakeFastCC()

static bool isProfitableToMakeFastCC ( 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 2006 of file GlobalOpt.cpp.

References llvm::CallingConv::C, llvm::Function::getCallingConv(), and llvm::CallingConv::X86_ThisCall.

Referenced by OptimizeFunctions().

◆ IsSafeComputationToRemove()

static bool IsSafeComputationToRemove ( Value V,
const TargetLibraryInfo TLI 
)
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 119 of file GlobalOpt.cpp.

References GEP, llvm::User::getNumOperands(), llvm::User::getOperand(), llvm::Value::hasOneUse(), I, llvm::isAllocationFn(), and llvm::Instruction::mayHaveSideEffects().

Referenced by CleanupPointerRootUsers().

◆ isSafeSROAElementUse()

static bool isSafeSROAElementUse ( Value V)
static

Return true if the specified instruction is a safe user of a derived expression from a global that we want to SROA.

Definition at line 322 of file GlobalOpt.cpp.

References C, llvm::dyn_cast(), llvm::User::getNumOperands(), llvm::User::getOperand(), I, llvm::isSafeToDestroyConstant(), SI, and llvm::Value::users().

Referenced by IsUserOfGlobalSafeForSRA().

◆ IsUserOfGlobalSafeForSRA()

static bool IsUserOfGlobalSafeForSRA ( User U,
GlobalValue GV 
)
static

◆ LoadUsesSimpleEnoughForHeapSRA()

static bool LoadUsesSimpleEnoughForHeapSRA ( const Value V,
SmallPtrSetImpl< const PHINode *> &  LoadUsingPHIs,
SmallPtrSetImpl< const PHINode *> &  LoadUsingPHIsPerLoad 
)
static

Verify that all uses of V (a load, or a phi of a load) are simple enough to perform heap SRA on.

This permits GEP's that index through the array and struct field, icmps of null, and PHIs.

Definition at line 999 of file GlobalOpt.cpp.

References llvm::SmallPtrSetImpl< PtrType >::insert(), and llvm::Value::users().

Referenced by AllGlobalLoadUsesSimpleEnoughForHeapSRA().

◆ 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 1771 of file GlobalOpt.cpp.

References assert(), llvm::SmallVectorImpl< T >::clear(), llvm::Instruction::insertBefore(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::User::replaceUsesOfWith(), Users, and llvm::Value::users().

Referenced by processInternalGlobal().

◆ mayHaveOtherReferences()

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

Definition at line 2297 of file GlobalOpt.cpp.

References llvm::GlobalValue::hasLocalLinkage().

Referenced by hasUsesToReplace(), and OptimizeGlobalAliases().

◆ OptimizeAwayTrappingUsesOfLoads()

static bool OptimizeAwayTrappingUsesOfLoads ( GlobalVariable GV,
Constant LV,
const DataLayout DL,
TargetLibraryInfo TLI 
)
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 697 of file GlobalOpt.cpp.

References assert(), CleanupConstantGlobalUsers(), CleanupPointerRootUsers(), llvm::dbgs(), DEBUG, E, llvm::GlobalVariable::eraseFromParent(), llvm::User::getOperand(), isLeakCheckerRoot(), OptimizeAwayTrappingUsesOfValue(), llvm::Value::use_empty(), llvm::Value::user_begin(), and llvm::Value::user_end().

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 2468 of file GlobalOpt.cpp.

References cxxDtorIsEmpty(), llvm::dyn_cast(), E, llvm::Instruction::eraseFromParent(), llvm::CallInst::getArgOperand(), llvm::Constant::getNullValue(), llvm::Value::getType(), I, llvm::Value::replaceAllUsesWith(), llvm::Value::stripPointerCasts(), llvm::Value::user_begin(), and llvm::Value::user_end().

Referenced by optimizeGlobalsInModule().

◆ OptimizeFunctions()

static bool OptimizeFunctions ( Module M,
TargetLibraryInfo TLI,
function_ref< DominatorTree &(Function &)>  LookupDomTree,
SmallSet< const Comdat *, 8 > &  NotDiscardableComdats 
)
static

◆ OptimizeGlobalAddressOfMalloc()

static GlobalVariable* OptimizeGlobalAddressOfMalloc ( GlobalVariable GV,
CallInst CI,
Type AllocTy,
ConstantInt NElements,
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 783 of file GlobalOpt.cpp.

References ConstantPropUsersOf(), llvm::BinaryOperator::CreateNot(), DEBUG, llvm::dyn_cast(), llvm::Instruction::eraseFromParent(), llvm::GlobalVariable::eraseFromParent(), llvm::errs(), llvm::ArrayType::get(), llvm::UndefValue::get(), llvm::ConstantExpr::getBitCast(), llvm::Value::getContext(), llvm::ConstantInt::getFalse(), llvm::Module::getGlobalList(), llvm::Type::getInt1Ty(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::Value::getName(), llvm::LoadInst::getOrdering(), llvm::GlobalValue::getParent(), llvm::CmpInst::getPredicate(), llvm::LoadInst::getSyncScopeID(), llvm::GlobalValue::getThreadLocalMode(), llvm::ConstantInt::getTrue(), llvm::Value::getType(), llvm::Use::getUser(), llvm::GlobalValue::getValueType(), llvm::ConstantInt::getZExtValue(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::iplist_impl< IntrusiveListT, TraitsT >::insert(), llvm::GlobalValue::InternalLinkage, llvm::LoadInst::isUnordered(), llvm_unreachable, llvm::Value::replaceAllUsesWith(), llvm::User::replaceUsesOfWith(), SI, llvm::Value::use_begin(), llvm::Value::use_empty(), llvm::Instruction::user_back(), and llvm::Value::user_back().

Referenced by tryToOptimizeStoreOfMallocToGlobal().

◆ OptimizeGlobalAliases()

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

◆ optimizeGlobalsInModule()

static bool optimizeGlobalsInModule ( Module M,
const DataLayout DL,
TargetLibraryInfo TLI,
function_ref< DominatorTree &(Function &)>  LookupDomTree 
)
static

◆ OptimizeGlobalVars()

static bool OptimizeGlobalVars ( Module M,
TargetLibraryInfo TLI,
function_ref< DominatorTree &(Function &)>  LookupDomTree,
SmallSet< const Comdat *, 8 > &  NotDiscardableComdats 
)
static

◆ optimizeOnceStoredGlobal()

static bool optimizeOnceStoredGlobal ( GlobalVariable GV,
Value StoredOnceVal,
AtomicOrdering  Ordering,
const DataLayout DL,
TargetLibraryInfo TLI 
)
static

◆ PerformHeapAllocSRoA()

static GlobalVariable* PerformHeapAllocSRoA ( GlobalVariable GV,
CallInst CI,
Value NElems,
const DataLayout DL,
const TargetLibraryInfo TLI 
)
static

CI is an allocation of an array of structures.

Break it up into multiple allocations of arrays of the fields.

As we process loads, if we can't immediately update all uses of the load, keep track of what scalarized loads are inserted for a given load.

Definition at line 1220 of file GlobalOpt.cpp.

References llvm::PHINode::addIncoming(), AS, assert(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::begin(), llvm::GlobalVariable::copyAttributesFrom(), llvm::BasicBlock::Create(), llvm::BranchInst::Create(), llvm::CallInst::CreateFree(), llvm::CallInst::CreateMalloc(), llvm::dbgs(), DEBUG, E, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::Instruction::eraseFromParent(), llvm::GlobalVariable::eraseFromParent(), llvm::ConstantInt::get(), llvm::PointerType::get(), llvm::CallInst::getArgOperand(), llvm::BasicBlock::getContext(), llvm::Value::getContext(), llvm::StructType::getElementType(), GetHeapSROAValue(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::DataLayout::getIntPtrType(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::getMallocAllocatedType(), llvm::Value::getName(), llvm::Constant::getNullValue(), llvm::StructType::getNumElements(), llvm::PHINode::getNumIncomingValues(), llvm::User::getOperand(), llvm::OperandBundleUser< InstrTy, OpIteratorTy >::getOperandBundlesAsDefs(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::GlobalValue::getParent(), llvm::Type::getPointerAddressSpace(), llvm::StructLayout::getSizeInBytes(), llvm::DataLayout::getStructLayout(), llvm::BasicBlock::getTerminator(), llvm::GlobalValue::getThreadLocalMode(), getType(), llvm::Value::getType(), llvm::GlobalValue::getType(), llvm::DataLayout::getTypeAllocSize(), I, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SLT, llvm::GlobalValue::InternalLinkage, ReplaceUsesOfMallocWithGlobal(), RewriteUsesOfLoadForHeapSRoA(), SI, llvm::BasicBlock::splitBasicBlock(), llvm::ARM_MB::ST, llvm::Value::user_begin(), and llvm::Value::user_end().

Referenced by tryToOptimizeStoreOfMallocToGlobal().

◆ processGlobal()

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

◆ processInternalGlobal()

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

◆ RemoveNestAttribute()

static void RemoveNestAttribute ( Function F)
static

◆ ReplaceUsesOfMallocWithGlobal()

static void ReplaceUsesOfMallocWithGlobal ( Instruction Alloc,
GlobalVariable GV 
)
static

The Alloc pointer is stored into GV somewhere.

Transform all uses of the allocation into loads from the global and uses of the resultant pointer. Further, delete the store into GV. This assumes that these value pass the 'ValueIsOnlyUsedLocallyOrStoredToOneGlobal' predicate.

Definition at line 956 of file GlobalOpt.cpp.

Referenced by PerformHeapAllocSRoA().

◆ RewriteHeapSROALoadUser()

static void RewriteHeapSROALoadUser ( Instruction LoadUser,
DenseMap< Value *, std::vector< Value *> > &  InsertedScalarizedValues,
std::vector< std::pair< PHINode *, unsigned > > &  PHIsToRewrite 
)
static

◆ RewriteUsesOfLoadForHeapSRoA()

static void RewriteUsesOfLoadForHeapSRoA ( LoadInst Load,
DenseMap< Value *, std::vector< Value *> > &  InsertedScalarizedValues,
std::vector< std::pair< PHINode *, unsigned > > &  PHIsToRewrite 
)
static

We are performing Heap SRoA on a global.

Ptr is a value loaded from the global. Eliminate all uses of Ptr, making them use FieldGlobals instead. All uses of loaded values satisfy AllGlobalLoadUsesSimpleEnoughForHeapSRA.

Definition at line 1204 of file GlobalOpt.cpp.

References E, llvm::iplist_impl< IntrusiveListT, TraitsT >::erase(), llvm::Instruction::eraseFromParent(), RewriteHeapSROALoadUser(), llvm::Value::use_empty(), llvm::Value::user_begin(), and llvm::Value::user_end().

Referenced by PerformHeapAllocSRoA().

◆ setUsedInitializer()

static void setUsedInitializer ( GlobalVariable V,
const SmallPtrSet< GlobalValue *, 8 > &  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 428 of file GlobalOpt.cpp.

References assert(), llvm::GlobalVariable::copyAttributesFrom(), llvm::GetElementPtrInst::Create(), llvm::dbgs(), DEBUG, llvm::iplist_impl< IntrusiveListT, TraitsT >::erase(), GEP, llvm::DataLayout::getABITypeAlignment(), llvm::PointerType::getAddressSpace(), llvm::GlobalObject::getAlignment(), llvm::Value::getContext(), llvm::StructLayout::getElementOffset(), llvm::ConstantExpr::getGetElementPtr(), llvm::Module::getGlobalList(), llvm::GlobalVariable::getInitializer(), llvm::Type::getInt32Ty(), llvm::Value::getName(), llvm::Constant::getNullValue(), llvm::User::getNumOperands(), llvm::User::getOperand(), llvm::GlobalValue::getParent(), llvm::DataLayout::getStructLayout(), llvm::GlobalValue::getThreadLocalMode(), llvm::GlobalValue::getType(), llvm::DataLayout::getTypeAllocSize(), GlobalUsersSafeToSRA(), llvm::GlobalValue::hasLocalLinkage(), llvm::Value::hasNUsesOrMore(), llvm::tgtok::In, llvm::GlobalValue::InternalLinkage, llvm::GlobalVariable::isExternallyInitialized(), llvm::MinAlign(), llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::iplist_impl< IntrusiveListT, TraitsT >::push_back(), llvm::Value::replaceAllUsesWith(), llvm::GlobalObject::setAlignment(), llvm::GlobalVariable::setExternallyInitialized(), llvm::Value::use_empty(), and llvm::Value::user_back().

Referenced by processInternalGlobal().

◆ STATISTIC() [1/15]

STATISTIC ( NumMarked  ,
"Number of globals marked constant"   
)

◆ STATISTIC() [2/15]

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

◆ STATISTIC() [3/15]

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

◆ STATISTIC() [4/15]

STATISTIC ( NumHeapSRA  ,
"Number of heap objects SRA'd"   
)

◆ STATISTIC() [5/15]

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

◆ STATISTIC() [6/15]

STATISTIC ( NumDeleted  ,
"Number of globals deleted"   
)

◆ STATISTIC() [7/15]

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

◆ STATISTIC() [8/15]

STATISTIC ( NumLocalized  ,
"Number of globals localized"   
)

◆ STATISTIC() [9/15]

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

◆ STATISTIC() [10/15]

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

◆ STATISTIC() [11/15]

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

◆ STATISTIC() [12/15]

STATISTIC ( NumNestRemoved  ,
"Number of nest attributes removed"   
)

◆ STATISTIC() [13/15]

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

◆ STATISTIC() [14/15]

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

◆ STATISTIC() [15/15]

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

◆ StripNest()

static AttributeList StripNest ( LLVMContext C,
AttributeList  Attrs 
)
static

◆ tryToOptimizeStoreOfMallocToGlobal()

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

◆ TryToShrinkGlobalToBoolean()

static bool TryToShrinkGlobalToBoolean ( GlobalVariable GV,
Constant OtherVal 
)
static

◆ ValueIsOnlyUsedLocallyOrStoredToOneGlobal()

static bool ValueIsOnlyUsedLocallyOrStoredToOneGlobal ( const Instruction V,
const GlobalVariable GV,
SmallPtrSetImpl< const PHINode *> &  PHIs 
)
static

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

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

Definition at line 909 of file GlobalOpt.cpp.

References llvm::User::getNumOperands(), llvm::SmallPtrSetImpl< PtrType >::insert(), SI, and llvm::Value::users().

Referenced by tryToOptimizeStoreOfMallocToGlobal().

Variable Documentation

◆ false

Global Variable false

Definition at line 2613 of file GlobalOpt.cpp.

◆ globalopt

globalopt

Definition at line 2613 of file GlobalOpt.cpp.

◆ Optimizer

Global Variable Optimizer

Definition at line 2613 of file GlobalOpt.cpp.