LLVM API Documentation
#include "llvm/Transforms/Scalar.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Analysis/Loads.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/DIBuilder.h"
#include "llvm/DebugInfo.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/LLVMContext.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/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/PromoteMemToReg.h"
#include "llvm/Transforms/Utils/SSAUpdater.h"
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "scalarrepl" |
Functions | |
STATISTIC (NumReplaced,"Number of allocas broken up") | |
STATISTIC (NumPromoted,"Number of allocas promoted") | |
STATISTIC (NumAdjusted,"Number of scalar allocas adjusted to allow promotion") | |
STATISTIC (NumConverted,"Number of aggregates converted to scalar") | |
INITIALIZE_PASS_BEGIN (SROA_DT,"scalarrepl","Scalar Replacement of Aggregates (DT)", false, false) INITIALIZE_PASS_END(SROA_DT | |
Scalar Replacement of | Aggregates (DT)" |
Scalar Replacement of false | INITIALIZE_PASS_BEGIN (SROA_SSAUp,"scalarrepl-ssa","Scalar Replacement of Aggregates (SSAUp)", false, false) INITIALIZE_PASS_END(SROA_SSAUp |
Scalar Replacement of false scalarrepl Scalar Replacement of | Aggregates (SSAUp)" |
static bool | isSafeSelectToSpeculate (SelectInst *SI, const DataLayout *TD) |
static bool | isSafePHIToSpeculate (PHINode *PN, const DataLayout *TD) |
static bool | tryToMakeAllocaBePromotable (AllocaInst *AI, const DataLayout *TD) |
static bool | isHomogeneousAggregate (Type *T, unsigned &NumElts, Type *&EltTy) |
static bool | isCompatibleAggregate (Type *T1, Type *T2) |
static bool | HasPadding (Type *Ty, const DataLayout &TD) |
Variables | |
scalarrepl | |
Scalar Replacement of | false |
Scalar Replacement of false scalarrepl | ssa |
#define DEBUG_TYPE "scalarrepl" |
Definition at line 22 of file ScalarReplAggregates.cpp.
Scalar Replacement of Aggregates | ( | DT | ) |
Scalar Replacement of false scalarrepl Scalar Replacement of Aggregates | ( | SSAUp | ) |
|
static |
HasPadding - Return true if the specified type has any structure or alignment padding in between the elements that would be split apart by SROA; return false otherwise.
Definition at line 2534 of file ScalarReplAggregates.cpp.
References llvm::StructLayout::getElementOffsetInBits(), llvm::StructType::getElementType(), llvm::SequentialType::getElementType(), llvm::StructType::getNumElements(), llvm::DataLayout::getStructLayout(), llvm::DataLayout::getTypeAllocSizeInBits(), and llvm::DataLayout::getTypeSizeInBits().
INITIALIZE_PASS_BEGIN | ( | SROA_DT | , |
"scalarrepl" | , | ||
"Scalar Replacement of Aggregates (DT)" | , | ||
false | , | ||
false | |||
) |
Scalar Replacement of false INITIALIZE_PASS_BEGIN | ( | SROA_SSAUp | , |
"scalarrepl-ssa" | , | ||
"Scalar Replacement of Aggregates (SSAUp)" | , | ||
false | , | ||
false | |||
) |
isCompatibleAggregate - Check if T1 and T2 are either the same type or are "homogeneous" aggregates with the same element type and number of elements.
Definition at line 1770 of file ScalarReplAggregates.cpp.
References isHomogeneousAggregate().
isHomogeneousAggregate - Check if type T is a struct or array containing elements of the same type (which is always true for arrays). If so, return true with NumElts and EltTy set to the number of elements and the element type, respectively.
Definition at line 1749 of file ScalarReplAggregates.cpp.
References llvm::SequentialType::getElementType(), and llvm::ArrayType::getNumElements().
Referenced by isCompatibleAggregate().
|
static |
isSafePHIToSpeculate - PHI instructions that use an alloca and are subsequently loaded can be rewritten to load both input pointers in the pred blocks and then PHI the results, allowing the load of the alloca to be promoted. From this: P2 = phi [i32* Alloca, i32* Other] V = load i32* P2 to: V1 = load i32* Alloca -> will be mem2reg'd ... V2 = load i32* Other ... V = phi [i32 V1, i32 V2]
We can do this to a select if its only uses are loads and if the operand to the select can be loaded unconditionally.
Definition at line 1175 of file ScalarReplAggregates.cpp.
References llvm::dyn_cast(), llvm::LoadInst::getAlignment(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::TerminatorInst::getNumSuccessors(), llvm::Instruction::getParent(), llvm::BasicBlock::getTerminator(), llvm::Value::isDereferenceablePointer(), llvm::isSafeToLoadUnconditionally(), llvm::LoadInst::isSimple(), LI, llvm::Instruction::mayHaveSideEffects(), TD, llvm::Value::use_begin(), and llvm::Value::use_end().
Referenced by tryToMakeAllocaBePromotable().
|
static |
isSafeSelectToSpeculate - Select instructions that use an alloca and are subsequently loaded can be rewritten to load both input pointers and then select between the result, allowing the load of the alloca to be promoted. From this: P2 = select i1 cond, i32* Alloca, i32* Other V = load i32* P2 to: V1 = load i32* Alloca -> will be mem2reg'd V2 = load i32* Other V = select i1 cond, i32 V1, i32 V2
We can do this to a select if its only uses are loads and if the operand to the select can be loaded unconditionally.
Definition at line 1137 of file ScalarReplAggregates.cpp.
References llvm::dyn_cast(), llvm::LoadInst::getAlignment(), llvm::SelectInst::getFalseValue(), llvm::SelectInst::getTrueValue(), llvm::Value::isDereferenceablePointer(), llvm::isSafeToLoadUnconditionally(), llvm::LoadInst::isSimple(), LI, TD, llvm::Value::use_begin(), and llvm::Value::use_end().
Referenced by tryToMakeAllocaBePromotable().
STATISTIC | ( | NumReplaced | , |
"Number of allocas broken up" | |||
) |
STATISTIC | ( | NumPromoted | , |
"Number of allocas promoted" | |||
) |
STATISTIC | ( | NumAdjusted | , |
"Number of scalar allocas adjusted to allow promotion" | |||
) |
STATISTIC | ( | NumConverted | , |
"Number of aggregates converted to scalar" | |||
) |
|
static |
tryToMakeAllocaBePromotable - This returns true if the alloca only has direct (non-volatile) loads and stores to it. If the alloca is close but not quite there, this will transform the code to allow promotion. As such, it is a non-pure predicate.
Definition at line 1239 of file ScalarReplAggregates.cpp.
References llvm::PHINode::addIncoming(), Align(), llvm::PHINode::Create(), llvm::SetVector< T, Vector, Set >::empty(), llvm::Instruction::eraseFromParent(), llvm::LoadInst::getAlignment(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::Instruction::getMetadata(), llvm::Value::getName(), llvm::PHINode::getNumIncomingValues(), llvm::BasicBlock::getTerminator(), llvm::Value::getType(), llvm::Use::getUser(), I, llvm::SetVector< T, Vector, Set >::insert(), isSafePHIToSpeculate(), isSafeSelectToSpeculate(), LI, llvm::SPII::Load, llvm::LLVMContext::MD_tbaa, llvm::onlyUsedByLifetimeMarkers(), llvm::Value::replaceAllUsesWith(), llvm::LoadInst::setAlignment(), llvm::Instruction::setMetadata(), llvm::SetVector< T, Vector, Set >::size(), llvm::Value::takeName(), llvm::Instruction::use_back(), llvm::Value::use_begin(), llvm::Value::use_empty(), and llvm::Value::use_end().
Scalar Replacement of false scalarrepl Scalar Replacement of false |
Definition at line 229 of file ScalarReplAggregates.cpp.
scalarrepl |
Definition at line 228 of file ScalarReplAggregates.cpp.
Scalar Replacement of false scalarrepl ssa |
Definition at line 233 of file ScalarReplAggregates.cpp.