[llvm-branch-commits] [llvm-branch] r91899 - in /llvm/branches/Apple/Zoidberg: lib/Transforms/Scalar/ScalarReplAggregates.cpp test/Transforms/ScalarRepl/nonzero-first-index.ll
Bob Wilson
bob.wilson at apple.com
Mon Dec 21 23:01:09 PST 2009
Author: bwilson
Date: Tue Dec 22 01:01:09 2009
New Revision: 91899
URL: http://llvm.org/viewvc/llvm-project?rev=91899&view=rev
Log:
$ svn merge -c 91897 https://bwilson@llvm.org/svn/llvm-project/llvm/trunk
--- Merging r91897 into '.':
A test/Transforms/ScalarRepl/nonzero-first-index.ll
U lib/Transforms/Scalar/ScalarReplAggregates.cpp
Added:
llvm/branches/Apple/Zoidberg/test/Transforms/ScalarRepl/nonzero-first-index.ll
- copied unchanged from r91897, llvm/trunk/test/Transforms/ScalarRepl/nonzero-first-index.ll
Modified:
llvm/branches/Apple/Zoidberg/lib/Transforms/Scalar/ScalarReplAggregates.cpp
Modified: llvm/branches/Apple/Zoidberg/lib/Transforms/Scalar/ScalarReplAggregates.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Zoidberg/lib/Transforms/Scalar/ScalarReplAggregates.cpp?rev=91899&r1=91898&r2=91899&view=diff
==============================================================================
--- llvm/branches/Apple/Zoidberg/lib/Transforms/Scalar/ScalarReplAggregates.cpp (original)
+++ llvm/branches/Apple/Zoidberg/lib/Transforms/Scalar/ScalarReplAggregates.cpp Tue Dec 22 01:01:09 2009
@@ -464,13 +464,6 @@
if (GEPIt == E)
return;
- // The first GEP index must be zero.
- if (!isa<ConstantInt>(GEPIt.getOperand()) ||
- !cast<ConstantInt>(GEPIt.getOperand())->isZero())
- return MarkUnsafe(Info);
- if (++GEPIt == E)
- return;
-
// Walk through the GEP type indices, checking the types that this indexes
// into.
for (; GEPIt != E; ++GEPIt) {
@@ -481,24 +474,10 @@
ConstantInt *IdxVal = dyn_cast<ConstantInt>(GEPIt.getOperand());
if (!IdxVal)
return MarkUnsafe(Info);
-
- if (const ArrayType *AT = dyn_cast<ArrayType>(*GEPIt)) {
- // This GEP indexes an array. Verify that this is an in-range constant
- // integer. Specifically, consider A[0][i]. We cannot know that the user
- // isn't doing invalid things like allowing i to index an out-of-range
- // subscript that accesses A[1]. Because of this, we have to reject SROA
- // of any accesses into structs where any of the components are variables.
- if (IdxVal->getZExtValue() >= AT->getNumElements())
- return MarkUnsafe(Info);
- } else {
- const VectorType *VT = cast<VectorType>(*GEPIt);
- if (IdxVal->getZExtValue() >= VT->getNumElements())
- return MarkUnsafe(Info);
- }
}
- // All the indices are safe. Now compute the offset due to this GEP and
- // check if the alloca has a component element at that offset.
+ // Compute the offset due to this GEP and check if the alloca has a
+ // component element at that offset.
SmallVector<Value*, 8> Indices(GEPI->op_begin() + 1, GEPI->op_end());
Offset += TD->getIndexedOffset(GEPI->getPointerOperandType(),
&Indices[0], Indices.size());
@@ -552,6 +531,8 @@
} else if (const ArrayType *AT = dyn_cast<ArrayType>(T)) {
EltTy = AT->getElementType();
EltSize = TD->getTypeAllocSize(EltTy);
+ if (Offset >= AT->getNumElements() * EltSize)
+ return false;
Offset %= EltSize;
} else {
return false;
More information about the llvm-branch-commits
mailing list