forked from OSchip/llvm-project
Do not use index type to determine what it is indexing into!
llvm-svn: 10226
This commit is contained in:
parent
637ee39933
commit
52310702a1
|
@ -26,6 +26,7 @@
|
||||||
#include "llvm/Pass.h"
|
#include "llvm/Pass.h"
|
||||||
#include "llvm/iMemory.h"
|
#include "llvm/iMemory.h"
|
||||||
#include "llvm/Analysis/Dominators.h"
|
#include "llvm/Analysis/Dominators.h"
|
||||||
|
#include "llvm/Support/GetElementPtrTypeIterator.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
#include "llvm/Transforms/Utils/PromoteMemToReg.h"
|
#include "llvm/Transforms/Utils/PromoteMemToReg.h"
|
||||||
#include "Support/Debug.h"
|
#include "Support/Debug.h"
|
||||||
|
@ -222,35 +223,34 @@ bool SROA::performScalarRepl(Function &F) {
|
||||||
/// aggregate allocation.
|
/// aggregate allocation.
|
||||||
///
|
///
|
||||||
bool SROA::isSafeUseOfAllocation(Instruction *User) {
|
bool SROA::isSafeUseOfAllocation(Instruction *User) {
|
||||||
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(User)) {
|
if (!isa<GetElementPtrInst>(User)) return false;
|
||||||
// The GEP is safe to transform if it is of the form GEP <ptr>, 0, <cst>
|
|
||||||
if (GEPI->getNumOperands() <= 2 ||
|
GetElementPtrInst *GEPI = cast<GetElementPtrInst>(User);
|
||||||
GEPI->getOperand(1) != Constant::getNullValue(Type::LongTy) ||
|
gep_type_iterator I = gep_type_begin(GEPI), E = gep_type_end(GEPI);
|
||||||
!isa<Constant>(GEPI->getOperand(2)) ||
|
|
||||||
isa<ConstantExpr>(GEPI->getOperand(2)))
|
// The GEP is safe to transform if it is of the form GEP <ptr>, 0, <cst>
|
||||||
|
if (I == E ||
|
||||||
|
I.getOperand() != Constant::getNullValue(I.getOperand()->getType()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
++I;
|
||||||
|
if (I != E || !isa<ConstantInt>(I.getOperand()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// If this is a use of an array allocation, do a bit more checking for sanity.
|
||||||
|
if (const ArrayType *AT = dyn_cast<ArrayType>(*I)) {
|
||||||
|
uint64_t NumElements = AT->getNumElements();
|
||||||
|
|
||||||
|
// Check to make sure that index falls within the array. If not,
|
||||||
|
// something funny is going on, so we won't do the optimization.
|
||||||
|
//
|
||||||
|
if (cast<ConstantInt>(GEPI->getOperand(2))->getRawValue() >= NumElements)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// If this is a use of an array allocation, do a bit more checking for
|
|
||||||
// sanity.
|
|
||||||
if (GEPI->getOperand(2)->getType() == Type::LongTy) {
|
|
||||||
const PointerType *PTy =cast<PointerType>(GEPI->getOperand(0)->getType());
|
|
||||||
const ArrayType *AT = cast<ArrayType>(PTy->getElementType());
|
|
||||||
int64_t NumElements = AT->getNumElements();
|
|
||||||
|
|
||||||
// Check to make sure that index falls within the array. If not,
|
|
||||||
// something funny is going on, so we won't do the optimization.
|
|
||||||
//
|
|
||||||
if (cast<ConstantSInt>(GEPI->getOperand(2))->getValue() >= NumElements ||
|
|
||||||
cast<ConstantSInt>(GEPI->getOperand(2))->getValue() < 0)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there are any non-simple uses of this getelementptr, make sure to
|
|
||||||
// reject them.
|
|
||||||
if (isSafeElementUse(GEPI))
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
// If there are any non-simple uses of this getelementptr, make sure to reject
|
||||||
|
// them.
|
||||||
|
return isSafeElementUse(GEPI);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// isSafeElementUse - Check to see if this use is an allowed use for a
|
/// isSafeElementUse - Check to see if this use is an allowed use for a
|
||||||
|
|
Loading…
Reference in New Issue