LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Macros | Functions | Variables
GlobalOpt.cpp File Reference
#include "llvm/Transforms/IPO.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/Analysis/ConstantFolding.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Operator.h"
#include "llvm/Pass.h"
#include "llvm/Support/CallSite.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/GetElementPtrTypeIterator.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetLibraryInfo.h"
#include "llvm/Transforms/Utils/GlobalStatus.h"
#include "llvm/Transforms/Utils/ModuleUtils.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 (NumFnDeleted,"Number of functions 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")
 
 INITIALIZE_PASS_BEGIN (GlobalOpt,"globalopt","Global Variable Optimizer", false, false) INITIALIZE_PASS_END(GlobalOpt
 
static bool isLeakCheckerRoot (GlobalVariable *GV)
 
static bool IsSafeComputationToRemove (Value *V, const TargetLibraryInfo *TLI)
 
static bool CleanupPointerRootUsers (GlobalVariable *GV, const TargetLibraryInfo *TLI)
 
static bool CleanupConstantGlobalUsers (Value *V, Constant *Init, DataLayout *TD, TargetLibraryInfo *TLI)
 
static bool isSafeSROAElementUse (Value *V)
 
static bool IsUserOfGlobalSafeForSRA (User *U, GlobalValue *GV)
 
static bool GlobalUsersSafeToSRA (GlobalValue *GV)
 
static GlobalVariableSRAGlobal (GlobalVariable *GV, const DataLayout &TD)
 
static bool AllUsesOfValueWillTrapIfNull (const Value *V, SmallPtrSet< const PHINode *, 8 > &PHIs)
 
static bool AllUsesOfLoadedValueWillTrapIfNull (const GlobalVariable *GV)
 
static bool OptimizeAwayTrappingUsesOfValue (Value *V, Constant *NewV)
 
static bool OptimizeAwayTrappingUsesOfLoads (GlobalVariable *GV, Constant *LV, DataLayout *TD, TargetLibraryInfo *TLI)
 
static void ConstantPropUsersOf (Value *V, DataLayout *TD, TargetLibraryInfo *TLI)
 
static GlobalVariableOptimizeGlobalAddressOfMalloc (GlobalVariable *GV, CallInst *CI, Type *AllocTy, ConstantInt *NElements, DataLayout *TD, TargetLibraryInfo *TLI)
 
static bool ValueIsOnlyUsedLocallyOrStoredToOneGlobal (const Instruction *V, const GlobalVariable *GV, SmallPtrSet< const PHINode *, 8 > &PHIs)
 
static void ReplaceUsesOfMallocWithGlobal (Instruction *Alloc, GlobalVariable *GV)
 
static bool LoadUsesSimpleEnoughForHeapSRA (const Value *V, SmallPtrSet< const PHINode *, 32 > &LoadUsingPHIs, SmallPtrSet< const PHINode *, 32 > &LoadUsingPHIsPerLoad)
 
static bool AllGlobalLoadUsesSimpleEnoughForHeapSRA (const GlobalVariable *GV, Instruction *StoredVal)
 
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)
 
static void RewriteUsesOfLoadForHeapSRoA (LoadInst *Load, DenseMap< Value *, std::vector< Value * > > &InsertedScalarizedValues, std::vector< std::pair< PHINode *, unsigned > > &PHIsToRewrite)
 
static GlobalVariablePerformHeapAllocSRoA (GlobalVariable *GV, CallInst *CI, Value *NElems, DataLayout *TD, const TargetLibraryInfo *TLI)
 
static bool TryToOptimizeStoreOfMallocToGlobal (GlobalVariable *GV, CallInst *CI, Type *AllocTy, AtomicOrdering Ordering, Module::global_iterator &GVI, DataLayout *TD, TargetLibraryInfo *TLI)
 
static bool OptimizeOnceStoredGlobal (GlobalVariable *GV, Value *StoredOnceVal, AtomicOrdering Ordering, Module::global_iterator &GVI, DataLayout *TD, TargetLibraryInfo *TLI)
 
static bool TryToShrinkGlobalToBoolean (GlobalVariable *GV, Constant *OtherVal)
 
static void ChangeCalleesToFastCall (Function *F)
 
static AttributeSet StripNest (LLVMContext &C, const AttributeSet &Attrs)
 
static void RemoveNestAttribute (Function *F)
 
static std::vector< Function * > ParseGlobalCtors (GlobalVariable *GV)
 
static GlobalVariableInstallGlobalCtors (GlobalVariable *GCL, const std::vector< Function * > &Ctors)
 
static bool isSimpleEnoughValueToCommit (Constant *C, SmallPtrSet< Constant *, 8 > &SimpleConstants, const DataLayout *TD)
 
static bool isSimpleEnoughValueToCommitHelper (Constant *C, SmallPtrSet< Constant *, 8 > &SimpleConstants, const DataLayout *TD)
 
static bool isSimpleEnoughPointerToCommit (Constant *C)
 
static ConstantEvaluateStoreInto (Constant *Init, Constant *Val, ConstantExpr *Addr, unsigned OpNo)
 
static void CommitValueTo (Constant *Val, Constant *Addr)
 
static bool EvaluateStaticConstructor (Function *F, const DataLayout *TD, const TargetLibraryInfo *TLI)
 
static int compareNames (Constant *const *A, Constant *const *B)
 
static void setUsedInitializer (GlobalVariable &V, 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, LLVMUsed &U, bool &RenameTarget)
 
static FunctionFindCXAAtExit (Module &M, TargetLibraryInfo *TLI)
 
static bool cxxDtorIsEmpty (const Function &Fn, SmallPtrSet< const Function *, 8 > &CalledFunctions)
 

Variables

 globalopt
 
Global Variable Optimizer
 
Global Variable false
 

Macro Definition Documentation

#define DEBUG_TYPE   "globalopt"

Definition at line 16 of file GlobalOpt.cpp.

Function Documentation

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

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

References AllUsesOfValueWillTrapIfNull(), LI, llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by TryToOptimizeStoreOfMallocToGlobal().

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

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

References llvm::SmallPtrSet< PtrType, SmallSize >::insert(), llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by AllUsesOfLoadedValueWillTrapIfNull().

static void ChangeCalleesToFastCall ( Function F)
static

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

Definition at line 1859 of file GlobalOpt.cpp.

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

static bool CleanupConstantGlobalUsers ( Value V,
Constant Init,
DataLayout TD,
TargetLibraryInfo TLI 
)
static

CleanupConstantGlobalUsers - 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::CallingConv::C, llvm::ConstantFoldInstruction(), llvm::ConstantFoldLoadThroughGEPConstantExpr(), llvm::Constant::getNullValue(), llvm::ConstantExpr::getOpcode(), llvm::isSafeToDestroyConstant(), LI, llvm::A64CC::MI, llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by OptimizeAwayTrappingUsesOfLoads().

static bool CleanupPointerRootUsers ( GlobalVariable GV,
const TargetLibraryInfo TLI 
)
static
static void CommitValueTo ( Constant Val,
Constant Addr 
)
static

CommitValueTo - We have decided that Addr (which satisfies the predicate isSimpleEnoughPointerToCommit) should get Val as its value. Make it happen.

Definition at line 2242 of file GlobalOpt.cpp.

References EvaluateStoreInto(), llvm::User::getOperand(), llvm::GlobalVariable::hasInitializer(), and llvm::GlobalVariable::setInitializer().

Referenced by EvaluateStaticConstructor().

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

Definition at line 2839 of file GlobalOpt.cpp.

Referenced by setUsedInitializer().

static void ConstantPropUsersOf ( Value V,
DataLayout TD,
TargetLibraryInfo TLI 
)
static

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

Definition at line 799 of file GlobalOpt.cpp.

References llvm::ConstantFoldInstruction(), I, llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by OptimizeGlobalAddressOfMalloc().

static bool cxxDtorIsEmpty ( const Function Fn,
SmallPtrSet< const Function *, 8 > &  CalledFunctions 
)
static

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

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

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

EvaluateStaticConstructor - Evaluate static constructors in the function, if we can. Return true if we can, false otherwise.

Definition at line 2773 of file GlobalOpt.cpp.

References CommitValueTo(), llvm::dbgs(), DEBUG, llvm::Eval(), Evaluator, llvm::Value::getName(), and I.

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

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

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

Referenced by CommitValueTo().

static Function* FindCXAAtExit ( Module M,
TargetLibraryInfo TLI 
)
static
static Value* GetHeapSROAValue ( Value V,
unsigned  FieldNo,
DenseMap< Value *, std::vector< Value * > > &  InsertedScalarizedValues,
std::vector< std::pair< PHINode *, unsigned > > &  PHIsToRewrite 
)
static
static bool GlobalUsersSafeToSRA ( GlobalValue GV)
static

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

Definition at line 445 of file GlobalOpt.cpp.

References IsUserOfGlobalSafeForSRA(), llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by SRAGlobal().

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

Definition at line 2924 of file GlobalOpt.cpp.

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

Referenced by hasUsesToReplace().

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

Definition at line 2908 of file GlobalOpt.cpp.

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

Referenced by hasUsesToReplace().

static bool hasUsesToReplace ( GlobalAlias GA,
LLVMUsed &  U,
bool RenameTarget 
)
static
INITIALIZE_PASS_BEGIN ( GlobalOpt  ,
"globalopt"  ,
"Global Variable Optimizer ,
false  ,
false   
)
static GlobalVariable* InstallGlobalCtors ( GlobalVariable GCL,
const std::vector< Function * > &  Ctors 
)
static
static bool isLeakCheckerRoot ( GlobalVariable GV)
static
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 150 of file GlobalOpt.cpp.

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

Referenced by CleanupPointerRootUsers().

static bool isSafeSROAElementUse ( Value V)
static

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

References llvm::CallingConv::C, llvm::dyn_cast(), llvm::User::getNumOperands(), llvm::User::getOperand(), I, llvm::isSafeToDestroyConstant(), llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by IsUserOfGlobalSafeForSRA().

static bool isSimpleEnoughPointerToCommit ( Constant C)
static

isSimpleEnoughPointerToCommit - Return true if this constant is simple enough for us to understand. In particular, if it is a cast to anything other than from one pointer type to another pointer type, we punt. We basically just support direct accesses to globals and GEP's of globals. This should be kept up to date with CommitValueTo.

Definition at line 2144 of file GlobalOpt.cpp.

References llvm::ConstantFoldLoadThroughGEPConstantExpr(), llvm::dyn_cast(), llvm::GlobalVariable::getInitializer(), llvm::Value::getType(), llvm::GlobalVariable::hasUniqueInitializer(), llvm::ConstantInt::isZero(), and llvm::next().

static bool isSimpleEnoughValueToCommit ( Constant C,
SmallPtrSet< Constant *, 8 > &  SimpleConstants,
const DataLayout TD 
)
inlinestatic
static bool isSimpleEnoughValueToCommitHelper ( Constant C,
SmallPtrSet< Constant *, 8 > &  SimpleConstants,
const DataLayout TD 
)
static

isSimpleEnoughValueToCommit - Return true if the specified constant can be handled by the code generator. We don't want to generate something like: void *X = &X/42; because the code generator doesn't have a relocation that can handle that.

This function should be called if C was not found (but just got inserted) in SimpleConstants to avoid having to rescan the same constants all the time.

Definition at line 2074 of file GlobalOpt.cpp.

References llvm::CallingConv::C, llvm::User::getNumOperands(), llvm::ConstantExpr::getOpcode(), llvm::User::getOperand(), llvm::Value::getType(), llvm::DataLayout::getTypeSizeInBits(), isSimpleEnoughValueToCommit(), and TD.

Referenced by isSimpleEnoughValueToCommit().

static bool IsUserOfGlobalSafeForSRA ( User U,
GlobalValue GV 
)
static

IsUserOfGlobalSafeForSRA - U is a direct user of the specified global value. Look at it and its uses and decide whether it is safe to SROA this global.

Definition at line 379 of file GlobalOpt.cpp.

References llvm::dyn_cast(), llvm::gep_type_begin(), llvm::gep_type_end(), llvm::User::getNumOperands(), llvm::generic_gep_type_iterator< ItTy >::getOperand(), llvm::User::getOperand(), llvm::ConstantInt::getZExtValue(), I, isSafeSROAElementUse(), llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by GlobalUsersSafeToSRA().

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

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

References llvm::SmallPtrSet< PtrType, SmallSize >::insert(), llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by AllGlobalLoadUsesSimpleEnoughForHeapSRA().

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

Definition at line 2935 of file GlobalOpt.cpp.

References llvm::GlobalValue::hasLocalLinkage().

Referenced by hasUsesToReplace().

static bool OptimizeAwayTrappingUsesOfLoads ( GlobalVariable GV,
Constant LV,
DataLayout TD,
TargetLibraryInfo TLI 
)
static

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

References CleanupConstantGlobalUsers(), CleanupPointerRootUsers(), llvm::dbgs(), DEBUG, llvm::GlobalVariable::eraseFromParent(), llvm::User::getOperand(), isLeakCheckerRoot(), LI, OptimizeAwayTrappingUsesOfValue(), llvm::Value::use_begin(), llvm::Value::use_empty(), and llvm::Value::use_end().

Referenced by OptimizeOnceStoredGlobal().

static bool OptimizeAwayTrappingUsesOfValue ( Value V,
Constant NewV 
)
static
static GlobalVariable* OptimizeGlobalAddressOfMalloc ( GlobalVariable GV,
CallInst CI,
Type AllocTy,
ConstantInt NElements,
DataLayout TD,
TargetLibraryInfo TLI 
)
static

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

References ConstantPropUsersOf(), llvm::BinaryOperator::CreateNot(), DEBUG, llvm::Instruction::eraseFromParent(), llvm::GlobalVariable::eraseFromParent(), llvm::errs(), llvm::ArrayType::get(), llvm::UndefValue::get(), llvm::ConstantExpr::getBitCast(), llvm::Value::getContext(), llvm::SequentialType::getElementType(), llvm::ConstantInt::getFalse(), llvm::Module::getGlobalList(), llvm::Type::getInt1Ty(), llvm::Value::getName(), llvm::LoadInst::getOrdering(), llvm::GlobalValue::getParent(), llvm::CmpInst::getPredicate(), llvm::LoadInst::getSynchScope(), llvm::GlobalVariable::getThreadLocalMode(), llvm::ConstantInt::getTrue(), llvm::GlobalValue::getType(), llvm::Value::getType(), llvm::value_use_iterator< UserTy >::getUse(), llvm::Use::getUser(), 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< NodeTy, Traits >::insert(), llvm::GlobalValue::InternalLinkage, llvm::LoadInst::isUnordered(), LI, llvm_unreachable, llvm::Value::replaceAllUsesWith(), llvm::User::replaceUsesOfWith(), llvm::Instruction::use_back(), llvm::Value::use_back(), llvm::Value::use_begin(), and llvm::Value::use_empty().

Referenced by TryToOptimizeStoreOfMallocToGlobal().

static bool OptimizeOnceStoredGlobal ( GlobalVariable GV,
Value StoredOnceVal,
AtomicOrdering  Ordering,
Module::global_iterator GVI,
DataLayout TD,
TargetLibraryInfo TLI 
)
static
static std::vector<Function*> ParseGlobalCtors ( GlobalVariable GV)
static

ParseGlobalCtors - Given a llvm.global_ctors list that we can understand, return a list of the functions and null terminator as a vector.

Definition at line 1986 of file GlobalOpt.cpp.

References llvm::GlobalVariable::getInitializer(), llvm::User::getNumOperands(), llvm::User::getOperand(), llvm::Constant::isNullValue(), llvm::User::op_begin(), and llvm::User::op_end().

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

PerformHeapAllocSRoA - CI is an allocation of an array of structures. Break it up into multiple allocations of arrays of the fields.

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

References llvm::PHINode::addIncoming(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT >, KeyT, ValueT, KeyInfoT >::begin(), llvm::BasicBlock::Create(), llvm::BranchInst::Create(), llvm::CallInst::CreateFree(), llvm::CallInst::CreateMalloc(), llvm::dbgs(), DEBUG, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT >, KeyT, ValueT, KeyInfoT >::end(), llvm::Instruction::eraseFromParent(), llvm::GlobalVariable::eraseFromParent(), llvm::ConstantInt::get(), llvm::CallInst::getArgOperand(), llvm::BasicBlock::getContext(), llvm::Value::getContext(), llvm::StructType::getElementType(), llvm::SequentialType::getElementType(), GetHeapSROAValue(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::DataLayout::getIntPtrType(), llvm::getMallocAllocatedType(), llvm::Value::getName(), llvm::Constant::getNullValue(), llvm::StructType::getNumElements(), llvm::PHINode::getNumIncomingValues(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::GlobalValue::getParent(), llvm::StructLayout::getSizeInBytes(), llvm::DataLayout::getStructLayout(), llvm::BasicBlock::getTerminator(), llvm::GlobalVariable::getThreadLocalMode(), llvm::Intrinsic::getType(), llvm::Value::getType(), llvm::DataLayout::getTypeAllocSize(), llvm::PointerType::getUnqual(), I, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SLT, llvm::GlobalValue::InternalLinkage, LI, ReplaceUsesOfMallocWithGlobal(), RewriteUsesOfLoadForHeapSRoA(), llvm::BasicBlock::splitBasicBlock(), llvm::A64DB::ST, llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by TryToOptimizeStoreOfMallocToGlobal().

static void RemoveNestAttribute ( Function F)
static
static void ReplaceUsesOfMallocWithGlobal ( Instruction Alloc,
GlobalVariable GV 
)
static

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

References llvm::Instruction::eraseFromParent(), llvm::Value::getName(), llvm::User::replaceUsesOfWith(), llvm::Value::use_begin(), and llvm::Value::use_empty().

Referenced by PerformHeapAllocSRoA().

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

RewriteHeapSROALoadUser - Given a load instruction and a value derived from the load, rewrite the derived value to use the HeapSRoA'd load.

Definition at line 1189 of file GlobalOpt.cpp.

References llvm::GetElementPtrInst::Create(), GetHeapSROAValue(), llvm::Value::getName(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::Value::replaceAllUsesWith(), llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by RewriteUsesOfLoadForHeapSRoA().

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

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

References llvm::Instruction::eraseFromParent(), RewriteHeapSROALoadUser(), llvm::Value::use_begin(), llvm::Value::use_empty(), and llvm::Value::use_end().

Referenced by PerformHeapAllocSRoA().

static void setUsedInitializer ( GlobalVariable V,
SmallPtrSet< GlobalValue *, 8 >  Init 
)
static
static GlobalVariable* SRAGlobal ( GlobalVariable GV,
const DataLayout TD 
)
static

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

References llvm::GetElementPtrInst::Create(), llvm::dbgs(), DEBUG, llvm::iplist< NodeTy, Traits >::erase(), llvm::DataLayout::getABITypeAlignment(), llvm::PointerType::getAddressSpace(), llvm::GlobalValue::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::GlobalVariable::getThreadLocalMode(), llvm::GlobalValue::getType(), llvm::DataLayout::getTypeAllocSize(), GlobalUsersSafeToSRA(), llvm::GlobalValue::hasLocalLinkage(), llvm::Value::hasNUsesOrMore(), llvm::tgtok::In, llvm::iplist< NodeTy, Traits >::insert(), llvm::GlobalValue::InternalLinkage, llvm::GlobalVariable::isConstant(), llvm::MinAlign(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::Value::replaceAllUsesWith(), llvm::GlobalValue::setAlignment(), llvm::Value::use_back(), and llvm::Value::use_empty().

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 ( NumFnDeleted  ,
"Number of functions 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 AttributeSet StripNest ( LLVMContext C,
const AttributeSet Attrs 
)
static
static bool TryToOptimizeStoreOfMallocToGlobal ( GlobalVariable GV,
CallInst CI,
Type AllocTy,
AtomicOrdering  Ordering,
Module::global_iterator GVI,
DataLayout TD,
TargetLibraryInfo TLI 
)
static
static bool TryToShrinkGlobalToBoolean ( GlobalVariable GV,
Constant OtherVal 
)
static
static bool ValueIsOnlyUsedLocallyOrStoredToOneGlobal ( const Instruction V,
const GlobalVariable GV,
SmallPtrSet< const PHINode *, 8 > &  PHIs 
)
static

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

References llvm::User::getNumOperands(), llvm::User::getOperand(), llvm::SmallPtrSet< PtrType, SmallSize >::insert(), llvm::Value::use_begin(), and llvm::Value::use_end().

Referenced by TryToOptimizeStoreOfMallocToGlobal().

Variable Documentation

Global Variable false

Definition at line 95 of file GlobalOpt.cpp.

globalopt

Definition at line 95 of file GlobalOpt.cpp.

Global Variable Optimizer

Definition at line 95 of file GlobalOpt.cpp.